Как узнать где зависает программа на PHP?
Способ простой:
- Установить PHP модуль xdebug (из исходников или через PEAR/PECL).
- Прописать его в php.ini.
- Перестартовать apache.
Все. Теперь в исследуемой программе можно указать:
xdebug_start_trace('/какой/то/каталог/имя-лога', XDEBUG_TRACE_APPEND);
После зависания программы перейти в указанный каталог и посмотреть лог, последняя строка в нём и есть источник зависания.
Кстати, xdebug также пишет stack traces в апачевский error_log при ошибках в программе (однако, при зависаниях это не помогает). Кроме того используя xdebug можно анализировать использование памяти, а также проследить за содержимым аргументов и переменных (о возможностях xdebug можно прочесть здесь http://www.ibm.com/developerworks/ru/library/os-php-xdebug/).