Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Применимо к: службы IIS
При запуске PHP иногда невозможно проверить страницу ошибок для диагностики состояния ошибки. Это может произойти если:
- Вы не знаете, на каком URL-адресе произошла ошибка.
- Ошибка возникает периодически, и вы не можете вручную воспроизвести ее (ошибка может зависеть от входных данных пользователя или внешних условий работы, которые могут произойти редко).
- Ошибка возникает только в рабочей среде.
В таких случаях трудно определить, что такое ошибка, и еще труднее диагностировать ее. Возможно, вы сможете определить, какие URL-адреса вызывают ошибки, проверяя журналы запросов или журнал ошибок, но у вас по-прежнему могут возникнуть проблемы с определением причин возникновения ошибки.
Интернет-службы (IIS) упрощают отслеживание и диагностику этих сложных условий ошибок благодаря трассировке неудачных запросов, которая позволяет создавать определения отказов, автоматически фиксирующие детализированные трассировки выполнения определенных запросов. См. статью "Устранение неполадок неудачных запросов" с помощью трассировки в IIS и использование функции трассировки неудачных запросов для отслеживания правил переопределения.
Чтобы помочь с диагностикой PHP, можно настроить эти трассировки для захвата входных данных запроса и данных ответа PHP. Это может предоставить аналитические сведения, необходимые для диагностики этих условий ошибок.
Еще одна довольно распространенная проблема приложения — это код, который зависает или входит в ресурсоемкий цикл. Это часто может произойти, так как:
- Блокировка операции ввода-вывода в файле или сети занимает много времени, например при доступе к удаленной веб-службе или базе данных.
- Код имеет ошибку, которая приводит к его вводу в бесконечный (или длительный) цикл, возможно, также спиннинг ЦП или выделение памяти.
- Код зависает или входит в состояние взаимной блокировки на общем ресурсе или блокировке.
Эти условия приводят к длительному времени ожидания или тайм-аутам для пользователя, выполняющего запрос, и также могут негативно повлиять на производительность приложения и даже сервера.
IIS предоставляет быстрый способ определить, какие запросы зависают, проверяя выполняемые в настоящее время запросы.
Использование трассировки неудачных запросов для диагностики неизвестных или трудно воспроизводимых ошибок
Трассировка неудачных запросов может быть эффективным способом отслеживания периодических или трудно воспроизводимых условий ошибок и диагностики, проверяя подробные сведения о запросе, ответе и множестве событий трассировки из модулей IIS.
Трассировка неудачных запросов может использоваться в рабочей среде, так как она может быть настроена только для запросов трассировки, которые соответствуют определению конкретного сбоя и могут избежать большей части затрат на трассировку для успешных запросов.
Чтобы включить трассировку неудачных запросов для сайта (в этом примере мы используем устранение неполадокPhp), выполните следующие действия.
Переключитесь в диспетчер IIS. Если он закрыт, нажмите Пуск, а затем выберите Диспетчер служб Интернета (IIS).
Разверните узел сервера и разверните узел "Сайты".
В представлении дерева слева найдите и выберите имя сайта.
В разделе IIS дважды щелкните правила трассировки неудачных запросов.
На панели "Действия" выберите "Изменить трассировку сайта".
Установите флажок "Включить".
Нажмите кнопку ОК.
Теперь создайте правило трассировки неудачных запросов. На панели "Действия" нажмите кнопку "Добавить".
Оставьте выбранный параметр "Все содержимое".
Выберите Далее.
Введите 400-999 в коде состояния.
Выберите Далее.
Оставьте включенные поставщики трассировки по умолчанию и нажмите кнопку Готово.
Теперь вы можете выполнять запросы. Предположим, что эти действия выполняются другими пользователями сайта, и вы не знаете о своих запросах или ответах. Например, выполните следующие запросы с помощью Internet Explorer:
-
http://localhost:84/hello.php
(запрос). -
http://localhost:84/products.php?productid=3
(запрос) - Запрос
http://localhost:84/products.php?productid=5
(эта страница выдает ошибку)
-
Найдите трассировку неудачного запроса:
Нажмите кнопку "Пуск", а затем выберите командную строку, чтобы открыть окно командной строки.
Выполните следующую команду, чтобы вывести список журналов трассировки, созданных для нашего сайта:
%windir%\system32\inetsrv\appcmd.exe list traces /site.name:"TroubleshootingPhp"
Вы получите выходные данные, аналогичные следующему:
TRACE "troubleshootingPhp/fr000001.xml" (url:http://localhost:84/products.php?product=5,statuscode:500,wp:2864)
Выходные данные указывают на то, что журнал трассировки был создан для запроса
/products.php?product=5
, в результате чего произошла ошибка HTTP 500. Он говорит вам, что:- Страница Products.php вызвала ошибку.
- Входные данные, вызвавшие ошибку, скорее всего, это
product=5
, так как ошибки не отображаются для других строк запроса (это заключение было бы более точным, если бы эта страница часто посещалась; в этом случае вы увидите многочисленные ошибки только для этой конкретной строки запроса).
Теперь вы можете получить определенный журнал трассировки, чтобы собрать дополнительные сведения о запросе и возможных причинах сбоя. Для этого выполните следующую команду из командной строки, используя ID журнала трассировки в кавычках из предыдущего вывода.
%windir%\system32\inetsrv\appcmd.exe list traces /site.name:"TroubleshootingPhp" /text:*
Это должно иметь выходные данные, аналогичные следующим:
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"
Проверьте журнал трассировки. Откройте файл журнала трассировки в браузере, используя путь, указанный в предыдущих выходных данных (в этом примере это C:\inetpub\logs\FailedReqLogFiles\W3SVC2\fr000001.xml). Вкладка "Сводка" содержит основные сведения о запросе. Вы можете увидеть, что статус ошибки был установлен FastCGIModule, что указывает на то, что ошибка произошла из PHP. В других случаях вы можете увидеть, что ошибка возникла из других модулей IIS, и можно использовать богатые возможности трассировки в журналах, чтобы определить причину. Однако в этом случае необходимо увидеть ответ, созданный PHP, чтобы получить больше сведений об ошибке.
Выберите вкладку Компактный вид. На этой вкладке представлен детализированный список событий трассировки, созданных IIS и модулями IIS во время обработки запроса.
Примечание.
- GENERAL_REQUEST_START событие отображает некоторые основные сведения, включая URL-адрес запроса, команду, информацию о среде выполнения сайта и приложение, в которое был отправлен запрос.
- GENERAL_REQUEST_HEADERS событие дает полный список заголовков, которые в некоторых случаях могут быть значительными при определении того, какие входные данные пользователя могут привести к ошибке.
- GENERAL_RESPONSE_HEADERS и GENERAL_RESPONSE_ENTITY_BUFFER события предоставляют полные заголовки ответа и тело ответа, которое было отправлено клиенту. В этом случае текст ответа предоставляет дополнительные сведения, необходимые для диагностики ошибки, указывая неправильный идентификатор продукта.
Это другие разделы, которые следует учитывать при проверке журнала трассировки:
- На панели "Сводка запросов" представлена сводка запроса, его результат, а также выделены все предупреждения или события ошибок во время выполнения запроса.
- Панель сведений о запросе предоставляет иерархическое представление выполнения запроса, а также позволяет фильтровать события по различным категориям, таким как уведомления модуля, проверка подлинности и авторизация и т. д. Он также предлагает представление производительности, которое помогает понять, какие части выполнения заняли самое длительное время.
- В компактном представлении представлен полный список событий, включая множество сведений о выполнении запроса. Многие модули IIS создают сведения о выполнении, которые можно использовать для понимания различных аспектов обработки запросов и результата. Эти сведения могут быть бесценными при устранении неполадок сложных взаимодействий, таких как перезапись URL-адресов или проверка подлинности.
Найдите зависшие запросы путем проверки выполнения текущих запросов
Это позволяет быстро определить, какие запросы зависают, анализируя текущие запросы в IIS.
Предположим, что вы запрашиваете страницу, которая входит в бесконечный цикл из-за ошибки программирования. В последующих шагах эта страница называется loop.php. В диспетчере задач вы можете наблюдать, что Php-cgi.exe занят, потребляя около 100 процентов ЦП (если у вас несколько ядер ЦП, вы увидите, что процесс потребляет 1/# ядер общего объема ЦП). Вы можете определить, какой запрос зависает:
Нажмите Start, затем выберите Диспетчер Интернет-информационных служб (IIS).
В представлении дерева слева выберите узел сервера .
В разделе IIS дважды щелкните рабочие процессы.
В разделе "Имя пула приложений" дважды щелкните имя пула приложений, чтобы открыть представление "Запросы ". (В этом примере это Устранение неполадок Php.)
Переключитесь на веб-браузер и обновите страницу, если время ожидания страницы истекло. Это может потребоваться на протяжении выполнения этих шагов. Вернитесь в диспетчер IIS, а затем обновите представление "Запросы ".
Просмотрите список выполняемых в настоящее время запросов, показывающий запрос на страницу проблемы в этом примере /loop.php. В записи запроса показано:
- Этот запрос выполнялся в течение некоторого времени (Прошедшее время).
- URL-адрес запроса (в этом примере /loop.php).
- Имя модуля (FastCGIModule).
- Этап выполнения (ExecuteRequestHandler).
Вы можете обновлять представление несколько раз, чтобы увидеть, что один и тот же запрос продолжает выполняться на одном этапе, указывая на зависший запрос.
Определите, какой запрос зависает с помощью командной строки. С помощью командной строки можно отфильтровать интересующие запросы, например запросы к конкретному приложению или конкретному URL-адресу. Его можно использовать для автоматизации сценариев, отслеживающих текущий выполнение запросов. Откройте окно командной строки, выбрав "Пуск" и выбрав командную строку.
Перейдите в веб-браузер, а затем обновите страницу
http://localhost:84/loop.php
. (Обратите внимание, что loop.php является примером имени; следует использовать имя страницы.) Возможно, вам потребуется постоянно обновить эту страницу для выполнения следующих действий. Переключитесь на командную строку.Выполните следующую команду, чтобы перечислить запросы, которые выполнялись более одной секунды:
%windir%\system32\inetsrv\appcmd.exe list requests /elapsed:1000
Вы получите результат, аналогичный следующему, с вашим именем страницы вместо loop.php:
REQUEST " fa000000080000026" (url:GET /loop.php, time:2840 msec, client:localhost, stage:ExecuteRequestHandler, module:FastCgiModule)
Отфильтруйте запросы, возвращаемые, указав любое количество критериев на основе доступных атрибутов запроса. Например, чтобы отобразить только запросы к конкретному URL-адресу:
%windir%\system32\inetsrv\appcmd.exe list requests /url:/loop.php /elapsed:1000
Вы также можете использовать команду AppCmd для выполнения более сложных запросов, например для определения всех приложений, имеющих длительные запросы:
%windir%\system32\inetsrv\appcmd.exe list requests /elapsed:1000 /xml | %windir%\system32\inetsrv\appcmd list apps /in
Вы получите список приложений, аналогичных следующим:
APP "troubleshootingPhp/" (applicationPool:troubleshootingPhp)
Ниже приведен пример принятия действий на основе текущих данных запроса: повторное использование пулов приложений с запросами, выполняющимися более пяти секунд:
%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
Вы получите следующие выходные данные с именем приложения:
"TroubleshootingPhp" successfully recycled