Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Тали Смит
При запуске PHP иногда невозможно проверить страницу ошибок для диагностики состояния ошибки. Причины могут быть следующими:
- Вы не знаете, какой URL-адрес сталкивается с ошибкой.
- Ошибка возникает периодически, и вы не можете воспроизвести ее вручную (эта ошибка может зависеть от входных данных пользователя или внешних условий работы, которые могут произойти редко).
- Ошибка возникает только в рабочей среде.
Это может сделать его очень трудно определить, что такое ошибка, и еще труднее диагностировать ее. Вы можете определить, какие URL-адреса вызывают ошибки, проверив журналы запросов или журнал ошибок, но у вас по-прежнему могут возникнуть проблемы с определением причин возникновения ошибки.
Службы IIS и более поздние версии упрощают отслеживание и диагностику этих сложных условий ошибок с помощью трассировки неудачных запросов, что позволяет создавать определения сбоев, которые автоматически записывают подробные трассировки выполнения определенных запросов. Сведения об устранении неполадок неудачных запросов с помощью трассировки в IIS 7.0 и более поздних версий и использовании трассировки неудачной трассировки запросов для правил перезаписи трассировки. Эта статья основана на практической лаборатории из PHP в комплекте для обучения Windows.
Чтобы помочь с диагностикой PHP, эти трассировки также можно сделать для записи входных данных запроса и ответных данных из PHP. Это может предоставить аналитические сведения, необходимые для диагностики этих условий ошибок.
Еще одна довольно распространенная проблема с приложением — код, который зависает или входит в ресурсоемкий цикл. Это часто может произойти, так как:
- Выполнение блокирующей операции ввода-вывода в файле или сети занимает много времени, например при доступе к удаленной веб-службе или базе данных.
- Код имеет ошибку, которая приводит к его вводу в бесконечный (или длительный) цикл, возможно, также спиннинг ЦП или выделение памяти.
- Код зависает или взаимоблокирует общий ресурс или блокировку.
Эти условия приводят к длительному времени ожидания или времени ожидания для пользователя, выполняющего запрос, и условия также могут негативно повлиять на производительность приложения и даже сервера в целом.
Службы IIS предоставляют быстрый способ определить, какие запросы зависают, проверяя выполняемые в данный момент запросы.
Использование трассировки неудачных запросов для диагностики неизвестных или трудно воспроизводимых ошибок
Трассировка неудачных запросов может быть эффективным способом отслеживания периодических или трудных для воспроизведения условий ошибок и диагностики условий ошибок путем проверки сведений о запросе, ответе и богатых событиях трассировки из модулей IIS.
Трассировку неудачных запросов можно использовать в рабочей среде, так как ее можно настроить только для запросов трассировки, которые соответствуют определению конкретного сбоя и могут избежать большей части затрат на трассировку успешных запросов.
Чтобы включить трассировку неудачных запросов для сайта (например, Troubleshooting.PHP), выполните следующие действия.
Переключитесь на диспетчер IIS. Если он закрыт, нажмите кнопку "Пуск", а затем щелкните диспетчер служб IIS.
Разверните узел сервера , а затем узел "Сайты ".
В представлении дерева слева найдите и щелкните имя сайта.
В разделе IIS дважды щелкните правила трассировки неудачных запросов.
Рис. 1. Правила трассировки неудачных запросов в IISЩелкните "Изменить трассировку сайта".
Установите флажок "Включить ".
Нажмите кнопку ОК.
Теперь создайте правило трассировки неудачных запросов. Нажмите кнопку Добавить.
Оставьте выбранный параметр "Все содержимое ".
Рис. 2. Добавление правила трассировки неудачных запросовЩелкните Далее.
В текстовом поле "Коды состояния" введите 400-999.
Рис. 3. Назначение правила состояния для правила трассировкиЩелкните Далее.
Оставьте включенные поставщики трассировки по умолчанию.
Рис. 4. Выбор поставщиков трассировкиНажмите кнопку Готово.
Теперь вы можете выполнять запросы. Предположим, что для этих действий запросы выполняются другими пользователями вашего сайта, и вы не знаете о своих запросах или ответах. Например, выполните следующие запросы с помощью Windows® 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, так как не отображаются сбои для другихstrings (этот вывод будет более точным, если доступ к этой странице осуществляется часто; в этом случае вы увидите несколько ошибок только для этой конкретной строки запроса).
Теперь можно получить определенный журнал трассировки, чтобы собрать дополнительные сведения о запросе и возможной причине сбоя. Для этого выполните следующую команду из командной строки (используя идентификатор в кавычках журнала трассировки из предыдущих выходных данных):
%windir%\system32\inetsrv\appcmd.exe list traces "<name of your site>" /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, чтобы получить более подробные сведения об ошибке.
Рис. 5. Проверка журналов трассировкиПерейдите на вкладку "Компактное представление ". На этой вкладке показан подробный список событий трассировки, созданных модулями IIS и IIS во время обработки запроса.
Рис. 6. Проверка вкладки "Компактное представление"Следует отметить следующее.
- GENERAL_REQUEST_START события содержат некоторые основные сведения, включая URL-адрес запроса, команду, сведения о среде выполнения и приложение, в которое был отправлен запрос.
- GENERAL_REQUEST_HEADERS событие предоставляет полный список заголовков, которые в некоторых случаях могут быть значительными при определении того, какие данные пользователя могут привести к ошибке.
- GENERAL_RESPONSE_HEADERS и GENERAL_RESPONSE_ENTITY_BUFFER события предоставляют полные заголовки ответов и текст ответа, отправленный клиенту. В этом случае текст ответа предоставляет дополнительные сведения, необходимые для диагностики ошибки, указывая неправильный идентификатор продукта.
Это другие разделы, которые следует учитывать при проверке журнала трассировки:
- Панель "Сводка запроса" содержит сводку запроса, его результат, а также выделяет все события предупреждений или ошибок во время выполнения запроса.
- Панель сведений о запросе предоставляет иерархическое представление выполнения запроса, а также позволяет фильтровать события по различным категориям, таким как уведомления модуля, проверка подлинности и авторизация и т. д. Он также предлагает представление производительности, которое помогает понять, какие части выполнения заняли самое длительное время.
- В компактном представлении представлен полный список событий, включая множество сведений о выполнении запроса. Многие модули IIS создают сведения о выполнении, которые можно использовать для понимания различных аспектов обработки запросов и результатов. Эти сведения могут быть бесценными при устранении сложных взаимодействий, таких как перезапись URL-адресов или проверка подлинности.
Поиск зависания запросов путем проверки текущего выполнения запросов
Это позволяет быстро определить, какие запросы зависают, проверив текущие выполняемые запросы в IIS.
Предположим, что вы запрашиваете страницу, которая входит в бесконечный цикл из-за ошибки программирования. На следующих шагах эта страница — loop.php. В диспетчере задач вы можете заметить, что Php-cgi.exe занят, потребляя около 100 процентов ЦП (если у вас несколько ядер ЦП, вы увидите, что процесс потребляет 1/# ядер общего объема ЦП). Вы можете определить, какой запрос зависает:
Нажмите кнопку "Пуск", а затем выберите диспетчер служб IIS.
В представлении дерева слева щелкните узел сервера .
В разделе IIS дважды щелкните рабочие процессы.
В разделе "Имя пула приложений " дважды щелкните имя сайта. (В этом примере сайт имеет значение Troubleshooting.PHP.)
Рис. 7. Просмотр пула приложений в рабочем процессеПереключитесь на веб-браузер и обновите страницу, если время ожидания страницы истекло. Это может потребоваться сделать на протяжении этих шагов. Вернитесь к диспетчеру IIS и обновите представление запросов .
Рис. 8. Просмотр запросовПросмотрите список выполняемых в настоящее время запросов, отображая запрос на страницу проблемы в данном случае /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
Примечание
В этой статье используются материалы из пакета обучения PHP для Windows, опубликованного 25 августа 2009 г.*