Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Se aplica a: Internet Information Services
Al ejecutar PHP, a veces no es posible inspeccionar una página de error para diagnosticar una condición de error. Esto puede ocurrir si:
- No sabe qué dirección URL está experimentando un error.
- El error se produce de forma intermitente y no puede reproducirlo manualmente (el error puede depender de las condiciones de funcionamiento externas o de entrada del usuario que pueden ocurrir con poca frecuencia).
- El error solo se produce en lo que se refiere al entorno de producción.
En estos casos, es difícil definir cuál es el error e incluso más difícil de diagnosticarlo. Es posible que pueda determinar qué URLs están causando los errores inspeccionando los registros de solicitudes o un registro de errores, pero aún así puede tener problemas para determinar qué causó que se produjera el error.
Internet Information Services (IIS) facilita el seguimiento y diagnóstico de estas difíciles condiciones de error con el seguimiento de solicitudes con errores, lo que le permite crear definiciones de errores que capturan automáticamente seguimientos detallados de ejecución de determinadas solicitudes. Consulte Solución de problemas de solicitudes con errores mediante el seguimiento en IIS y Uso del seguimiento de solicitudes con error para realizar un seguimiento de las reglas de reescritura.
Para mejorar los diagnósticos de PHP, estos seguimientos también se pueden hacer para capturar los datos de entrada de la solicitud y los datos de respuesta de PHP. Esto puede proporcionar el conocimiento necesario para diagnosticar estas condiciones de error.
Otro problema bastante común en las aplicaciones, es el código que se bloquea o entra en un bucle que consume muchos recursos. Esto puede suceder a menudo porque:
- Una operación de E/S de bloqueo sobre un archivo o red tarda mucho tiempo en completarse, como cuando se accede a un servicio web remoto o una base de datos.
- El código tiene un error que hace que entre en un bucle infinito (o de larga duración), y posiblemente también sobrecargando la CPU o asignando memoria.
- El código cuelga o se bloquea en un recurso o bloqueo compartido.
Estos estados dan lugar a tiempos de espera largos o tiempos de espera para el usuario que realiza la solicitud y las condiciones también pueden afectar negativamente al rendimiento de la aplicación e incluso al servidor en su conjunto.
IIS proporciona una manera rápida de determinar qué solicitudes se bloquean inspeccionando las solicitudes que se están ejecutando en ese momento.
Usar el seguimiento de solicitudes con errores para diagnosticar errores desconocidos o difíciles de reproducir
El seguimiento de solicitudes con error puede ser una manera eficaz de realizar un seguimiento intermitente o difícil de reproducir las condiciones de error y diagnosticar las condiciones de error inspeccionando los detalles sobre la solicitud, la respuesta y la riqueza de actividades de seguimiento de los módulos de IIS.
El seguimiento de solicitudes con error se puede usar en un entorno de producción, ya que solo se puede configurar para realizar un seguimiento de las solicitudes que cumplen la definición de error específica y puede evitar la mayor parte de la sobrecarga de seguimiento para las solicitudes exitosas.
Para habilitar el seguimiento de solicitudes con error para un sitio (en este ejemplo, usamos TroubleshootingPhp), siga estos pasos:
Cambie al Administrador de IIS. Si está cerrado, seleccione Inicio y, a continuación, seleccione Administrador de Internet Information Services (IIS).
Expanda el nodo Servidor y, a continuación, expanda el nodo Sitios.
En la vista de árbol de la izquierda, busque y seleccione el nombre del sitio.
En IIS, haga doble clic en Reglas de seguimiento de solicitudes erróneas.
En el panel Acciones , seleccione Editar seguimiento del sitio.
Active la casilla Habilitar .
Seleccione Aceptar.
Entonces ahora, cree una regla de seguimiento de solicitudes con error. En el panel Acciones , seleccione Agregar.
Deje seleccionada la opción Todo el contenido.
Seleccione Siguiente.
Introduzca 400-999 en Códigos de estado.
Seleccione Siguiente.
Deje habilitados los proveedores de seguimiento predeterminados y, a continuación, seleccione Finalizar.
Ahora, puede realizar las solicitudes. Suponga para estos pasos que otros usuarios de su sitio realizan las solicitudes y que usted no está al tanto de sus solicitudes ni respuestas. Por ejemplo, realice las siguientes solicitudes mediante Internet Explorer:
- Solicitud
http://localhost:84/hello.php
- Solicitud
http://localhost:84/products.php?productid=3
- Solicitud
http://localhost:84/products.php?productid=5
(esta página produce un error)
- Solicitud
Encuentra la traza de la solicitud fallida:
Seleccione Inicio y luego seleccione Símbolo del sistema para abrir la ventana del símbolo del sistema.
Ejecute el siguiente comando para enumerar los registros de seguimiento que se generarán para nuestro sitio web:
%windir%\system32\inetsrv\appcmd.exe list traces /site.name:"TroubleshootingPhp"
Obtiene una salida similar a la siguiente:
TRACE "troubleshootingPhp/fr000001.xml" (url:http://localhost:84/products.php?product=5,statuscode:500,wp:2864)
La salida indica que se generó un registro de seguimiento para una solicitud a
/products.php?product=5
, lo que produjo un error HTTP 500. Le indica lo siguiente:- La página Products.php produjo un error.
- La entrada que provocó un error es más probable
product=5
, ya que no ve errores para otras cadenas de consulta (esta conclusión sería más precisa si se accede a esta página con frecuencia; en ese caso, verá varios errores solo para esta cadena de consulta específica).
Ahora puede obtener un registro de seguimiento específico para reunir más información sobre la solicitud y la posible causa del error. Para ello, ejecute el comando siguiente desde la línea de comandos (usando el identificador entre comillas del registro de rastreo de la salida anterior):
%windir%\system32\inetsrv\appcmd.exe list traces /site.name:"TroubleshootingPhp" /text:*
Esto debe tener la salida similar a la siguiente:
TRACELOG TRACE.NAME:" troubleshootingPhp/fr000001.xml" PATH:"C:\inetpub\logs\FailedReqLogFiles\W3SVC2\fr000001.xml" URL:"http://localhost:84/products.php?product=5" STATUSCODE:"500" SITE.ID:"2" SITE.NAME:"TroubleshootingPhp" WP.NAME:"2864" APPPOOL.NAME:"TroubleshootingPhp" verb:"GET" remoteUserName:"" userName:"" tokenUserName:"NT AUTHORITY\IUSR" authenticationType:"anonymous" activityId:"{ 00000000-0000-0000-1400-0080000000FA }" failureReason:"STATUS_CODE" triggerStatusCode:"500" timeTaken:"100" xmlns:freb:"http://schemas.microsoft.com/win/2006/06/iis/freb"
Inspeccione el registro de seguimiento. Abra el archivo de registro de seguimiento en el explorador mediante la ruta de acceso especificada en la salida anterior (en este ejemplo, es C:\inetpub\logs\FailedReqLogFiles\W3SVC2\fr000001.xml). La pestaña Resumen ofrece información básica sobre la solicitud. Puede ver que el estado del error fue establecido por el FastCGIModule, lo que sugiere que el error procede de PHP. En otros casos, es posible que vea que el error procede de otros módulos de IIS, en cuyo caso podría usar la gran cantidad de información de seguimiento en el registro para determinar la causa. Sin embargo, en este caso, es necesario ver realmente la respuesta generada por PHP para obtener más información sobre el error.
Seleccione la pestaña Vista compacta. En esta pestaña se muestra la lista detallada de eventos de seguimiento generados por IIS y los módulos de IIS durante el procesamiento de la solicitud.
Nota:
- El evento GENERAL_REQUEST_START muestra alguna información básica, incluida la dirección URL de solicitud, el verbo, información en tiempo de ejecución sobre el sitio y la aplicación a la que se envió la solicitud.
- El evento GENERAL_REQUEST_HEADERS proporciona la lista completa de encabezados, que en algunos casos puede ser significativa al determinar qué entrada del usuario puede haber producido el error.
- Los eventos GENERAL_RESPONSE_HEADERS y GENERAL_RESPONSE_ENTITY_BUFFER proporcionan los encabezados de respuesta completos y el cuerpo de la respuesta que se envió al cliente. En este caso, el cuerpo de la respuesta proporciona la información adicional necesaria para diagnosticar el error, indicando un identificador de producto incorrecto.
Estas son otras de las secciones que debe tener en cuenta al inspeccionar el registro de seguimiento:
- El panel Resumen de solicitudes proporciona un resumen de la solicitud, su resultado y también resalta los eventos de advertencia o error durante la ejecución de la solicitud.
- El panel Detalles de la solicitud proporciona una vista jerárquica de la ejecución de la solicitud, lo que también le permite filtrar los eventos por varias categorías, como notificaciones de módulo, autenticación, autorización, etc. También ofrece la vista de rendimiento, que ayuda a ver qué partes de la ejecución tardaron más tiempo.
- La Vista compacta ofrece la lista completa de eventos, incluida una gran cantidad de información sobre la ejecución de la solicitud. Muchos de los módulos de IIS generan información sobre su ejecución que se puede usar para el reconocimiento de varios aspectos del procesamiento de solicitudes y el resultado. Esta información puede ser muy valiosa a la hora de solucionar interacciones complejas, como la reescritura de direcciones URL o la autenticación.
Ubicar solicitudes pendientes revisando la ejecución de solicitudes actuales
Esto le proporciona una manera rápida de determinar qué solicitudes se bloquean inspeccionando las solicitudes que se están ejecutando actualmente en IIS.
Supongamos que solicitud de una página que entra en un bucle infinito debido a un error de programación. En los pasos siguientes, esta página se llama loop.php. En el administrador de tareas, puede observar que el Php-cgi.exe está ocupado, consumiendo casi el 100 % de la CPU (si tiene varios núcleos de CPU, verá el proceso que consume 1/# de núcleos de cpu total). Puede decidir qué solicitud está bloqueada:
Seleccione Inicio y, a continuación, Seleccione Administrador de Internet Information Services (IIS).
En la vista de árbol a la izquierda, seleccione el nodo del Servidor.
En IIS, haga doble clic en Procesos de trabajo.
En Nombre del grupo de aplicaciones, haga doble clic en el nombre del grupo de aplicaciones para abrir la vista Solicitudes . (En este ejemplo, es Solución de problemasPhp.
Cambie a un explorador web y actualice la página si se ha agotado el tiempo de espera. Puede que sea necesario hacerlo a lo largo de estos pasos. Vuelva al Administrador de IIS y, a continuación, actualice la vista Solicitudes.
Observe la lista de solicitudes que se están ejecutando actualmente, mostrando la solicitud a la página del problema, en este ejemplo, /loop.php. La entrada de solicitud muestra:
- Que la solicitud se ha estado ejecutando durante cierto tiempo (Tiempo Transcurrido).
- Dirección URL de la solicitud (en este ejemplo, /loop.php).
- El nombre del módulo (FastCGIModule).
- La etapa de ejecución (ExecuteRequestHandler).
Puede actualizar la vista varias veces para observar que la misma solicitud continúe ejecutándose en la misma fase, indicando la solicitud bloqueada.
Determine qué solicitud se está bloqueando mediante el símbolo del sistema. Con el símbolo del sistema, puede filtrar las solicitudes que le interesen, por ejemplo, las solicitudes a una aplicación específica o una dirección URL concreta. Se puede usar para automatizar scripts que supervisen las solicitudes que se están ejecutando actualmente. Para abrir la ventana del símbolo del sistema, seleccione Iniciar y, a continuación, seleccione Símbolo del sistema.
Cambie a un explorador web y, a continuación, actualice la página
http://localhost:84/loop.php
. (Tenga en cuenta que loop.php es un nombre de ejemplo; se debe usar el nombre de la página). Es posible que tenga que actualizar continuamente esta página para los pasos siguientes. Cambie al símbolo del sistema.Ejecute el siguiente comando para enumerar las solicitudes que se han estado ejecutando durante más de un segundo:
%windir%\system32\inetsrv\appcmd.exe list requests /elapsed:1000
Obtiene una salida similar a la siguiente, con el nombre de la página en lugar de loop.php:
REQUEST " fa000000080000026" (url:GET /loop.php, time:2840 msec, client:localhost, stage:ExecuteRequestHandler, module:FastCgiModule)
Restringir las peticiones contestadas especificando cualquier número de criterios basados en los atributos de solicitudes disponibles. Por ejemplo, para mostrar solo solicitudes a una dirección web URL específica:
%windir%\system32\inetsrv\appcmd.exe list requests /url:/loop.php /elapsed:1000
También puede usar la vinculación de comandos de AppCmd para realizar consultas más complejas, por ejemplo, para determinar todas las aplicaciones que tienen solicitudes de ejecución prolongada:
%windir%\system32\inetsrv\appcmd.exe list requests /elapsed:1000 /xml | %windir%\system32\inetsrv\appcmd list apps /in
Obtendrá la lista de aplicaciones similares a las siguientes:
APP "troubleshootingPhp/" (applicationPool:troubleshootingPhp)
Este es un ejemplo de cómo realizar una acción en función de los datos de solicitud actuales: reciclaje de los grupos de aplicaciones con solicitudes que se han ejecutado durante más de cinco segundos:
%windir%\system32\inetsrv\appcmd.exe list requests /elapsed:1000 /xml | %windir%\system32\inetsrv\appcmd list apppools /in /xml | %windir%\system32\inetsrv\appcmd recycle apppools /in
Obtiene la siguiente salida, con el nombre de la aplicación:
"TroubleshootingPhp" successfully recycled