Отладка зависшего php - PullRequest
4 голосов
/ 05 ноября 2008

У меня есть php веб-приложение, которое иногда зависает. Когда я перехожу на страницу, она просто сидит там, пытаясь загрузить в течение нескольких часов, несмотря на то, что максимальное исполнение составляет 210. Это приложение использует curl за прокси для загрузки материала. Отчет об ошибках установлен на все, но это не имеет значения, так как страница пуста и зависла.

Я не могу найти ничего при отладке зависшего процесса PHP.

Ответы [ 5 ]

2 голосов
/ 05 ноября 2008

В последний раз, когда я проверял, операции HTTP / IO происходят вне времени php, поэтому возможно, что CURL умирает или истекает время ожидания.

Это IO, поэтому php просто выбрасывает какую-то системную библиотеку, а затем вызывает "select", чтобы дождаться его возвращения.

Если он не вернется .. PHP-код даже не будет зацикливаться и, следовательно, даже не узнает, что он не вернется.

1 голос
/ 05 ноября 2008

, чтобы увидеть, что происходит за кулисами, вы можете установить xdebug, затем включить профилирование по триггеру (? XDEBUG_PROFILE = 1) ... он выведет журнал в файловую систему, совместимую с kcachegrind / etc ...., которую вы можете используйте, чтобы увидеть, где находится исполнение.

Конечно, это, скорее всего, проблема скручивания ....

1 голос
/ 05 ноября 2008

я бы поставил на это деньги У меня была похожая проблема несколько лет назад с определенной опцией curl, которую я добавил, что иногда приводило к зависанию скрипта. Я хотел бы точно вспомнить, в чем заключалась проблема, но я полагаю, что это привело к тому, что curl связывался с неверной библиотекой внизу. ( edit ) на самом деле, я уверен, что в моем случае это была библиотека SSL, в которой использовалась более старая версия openssl.

Я бы предложил сначала удалить все вызовы curl_setopt(), а затем добавить их обратно, чтобы посмотреть, сможете ли вы изолировать ошибку. я думаю если вы запустите эквивалентную команду curl в командной строке, вы можете сразу увидеть ошибку там.

Я исправил это, обновив библиотеку openssl, которую использовал curl.

0 голосов
/ 05 ноября 2008

Это будет звучать неубедительно, но просто откройте дескриптор файла в самом начале запроса вашей страницы, затем начните писать файлы в /tmp/debug.txt. Посмотрите, куда пишется последний, а затем начните выводить различные значения переменных в файл в этой области. Используйте теорию бинарного поиска, чтобы распределить ваши рукописные тексты в более тонких разделах разрешения вашего кода.

i.e.

$fh = fopen("/tmp/debug.txt", "w");

fwrite($fh, "made it to here 1 \n");

//some code

fwrite($fh, "made it to here 2 \n");

//more code

fwrite($fh, "made it to here 3 \n");
0 голосов
/ 05 ноября 2008

Xdebug - отличная идея, и если это не поможет, я бы также рекомендовал запустить ваш веб-сервер через ktrace, strace или truss. Он показывает вам, что именно он делает и где он может висеть.

Похоже, что возникла временная проблема с подключением или что-то еще, на что опирается ваше приложение, заблокировано.

Если вы используете Apache, проверьте Руководство по отладке Apache HTTP . Руководство немного * nix-ориентированное, но может применяться к любому веб-серверу.

Помимо отладки вашего веб-сервера, я бы также рекомендовал добавить проверки, если ваш прокси-сервер постоянно работает / отзывчив и источник загрузки всегда доступен. Эти проверки могут быть добавлены с помощью такого инструмента, как nagios или стороннего сервиса, такого как Pingdom . И последнее, но не менее важное, это может быть и временная проблема с DNS, поэтому вы можете использовать IP-адреса для подключения к прокси-серверу и источнику загрузки и / или добавить мониторинг для службы DNS.

НТН

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...