Как узнать в каком месте зависла программа на PHP?

PHP 5.3.1 что-то меня разочаровывает. Висит (по крайней мере под Windows XP) в самых неожиданных местах. Кстати, эти зависания подтолкнули меня к поиску способа, которым можно было бы отследить где зависла программа.

Способ проще некуда: ставим модуль PHP xdebug, прописываем его в php.ini (не забываем, что в PHP 5.3 всегда используется «zend_extension»), а в исследуемой программе указываем:

xdebug_start_trace('/какой/то/путь/имя-лога', XDEBUG_TRACE_APPEND);

После зависания идём в указанную папку и смотрим в лог, последняя строка в нём и есть источник зависания.

Комментарии 10

overplumbum.livejournal.com № 1
ну да, под nix-ами для это цели бывает полезен strace
Евгений Степанищев (bolknote.ru) автор № 2
Я тоже люблю strace, но системный вызов не скажет на какой строке в программе повис PHP, он просто покажет чем интерпретатор занимается, например, ждёт освобождения семафора.

Xdebug хорош тем, что он показывает конкретную функцию в программе, с его помощью я увидел, что у меня висит функция crypt.
Slaver (slaver.info) № 5
Комментарий для Евгения Степанищева:

А какие настройки в php.ini прописаны? Я на двух серверах (и win, и nix) не могу разобраться с xdebug под PHP 5.3 :(
Евгений Степанищев (bolknote.ru) автор № 6
Комментарий для slaver.info:

Всё незатейливо:

zend_extension="Z:\usr\local\php5\ext\php_xdebug.dll"

[xdebug]
xdebug.remote_enable = On
Slaver (slaver.info) № 7
Комментарий для Евгения Степанищева:

Спасибо!
Я просто не ту VC-версию для win использовал :)