Скажем, у вас большой проект PHP, и вдруг, пытаясь запустить его, вы просто получаете пустую страницу. Сценарий завершается, и вы хотите найти, где именно, с минимальными усилиями.
Есть ли инструмент / program / command / IDE, который может, при завершении PHP-скрипта, указать местоположение выхода сценария?
Примечание. Я не могу пометить свой пост как «принятый ответ», поэтому посмотрим внизу, чтобы увидеть мое решение. Если вы придумаете лучшее решение, я помету ваш пост как ответ.
Я использую следующий код и не нуждаюсь в специальной среде отладки. Обратите внимание, что это может занять очень много времени; вы можете установить количество тиков выше – это делает его быстрее, но размытым.
function shutdown_find_exit() { var_dump($GLOBALS['dbg_stack']); } register_shutdown_function('shutdown_find_exit'); function write_dbg_stack() { $GLOBALS['dbg_stack'] = debug_backtrace(); } register_tick_function('write_dbg_stack'); declare(ticks=1);
С некоторым вдохновением от нерабочего, но все же правильного ответа от RoBorg, я использовал следующий код в начале:
function shutdown() { global $dbg_stack_a; print_r($dbg_stack_a); } register_shutdown_function('shutdown');
И затем я создал глобальную условную точку останова (глобальная = точка останова оценивается в каждой строке), используя тот факт, что она может запускать код через eval () со следующим «условием»:
eval(' global $dbg_stack_a, $dbg_stack_b, $dbg_stack_c; $dbg_stack_a = $dbg_stack_b; $dbg_stack_b = $dbg_stack_c; $dbg_stack_c = debug_backtrace(); return false; ')
Наверное, не быстро, но трюк! Используя это, я смог определить точное местоположение файла и строки, в котором был поднят die (). (Этот пример работает в NuSphere.)
grep -n die filename
Не забудьте также grep для «выхода».
Добавьте это в начало файла:
function shutdown() { print_r(debug_backtrace()); } register_shutdown_function('shutdown');
См. Register_ shutdown_function ()
Вы можете использовать интерактивный отладчик, чтобы выполнить код, пока не достигнете точки выхода. Кроме этого, я думаю, что вы не справляетесь с кодом для exit|die
.
xdebug имеет приятную функцию трассировки, которая позволит вам увидеть всю трассировку вашего приложения php app, и он должен дать вам понять, где находится ваш выход.
но для быстрого и грязного решения grep / find, как указано выше, будет делать правильно.
Также проверьте error___logs на наличие ошибок « memory_limit
» в Apache error_log.
Ограничение памяти> = 10M Предупреждение: (установите для этого файла значение 10M или больше в файле php.ini)
По моему опыту, сценарии внезапно заканчиваются без предупреждения или уведомления, когда это происходит.
Убедитесь, что ошибки отображаются в среде разработки (а не в производстве).