Самый быстрый способ определить, где выйдет PHP скрипт
Скажите, что у вас большой PHP-проект, и вдруг, пытаясь запустить его, вы просто получаете пустую страницу. script завершается, и вы хотите найти, где именно это возможно, с минимальными усилиями.
Есть ли программа/программа/команда/IDE, которая может, при завершении PHP script, указать местоположение выхода script?
Примечание. Я не могу отметить свой собственный пост как "принятый ответ", поэтому посмотрим внизу, чтобы увидеть мое решение. Если вы придумаете лучшее решение, я помету ваше сообщение как ответ.
Ответы
Ответ 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.)
Ответ 2
Я использую следующий код и не нуждаюсь в специальной среде отладки. Обратите внимание, что это может занять очень много времени; вы можете установить количество тиков выше - это делает его быстрее, но размытым.
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);
Ответ 3
grep -n die filename
Ответ 4
Не забудьте также включить grep для выхода.
Ответ 5
Добавьте это в начало файла:
function shutdown()
{
print_r(debug_backtrace());
}
register_shutdown_function('shutdown');
См. register_ shutdown_function()
Ответ 6
Вы можете использовать интерактивный отладчик, чтобы выполнить код, пока не достигнете точки выхода. Кроме этого, я думаю, что вы не справитесь с кодом для exit|die
.
Ответ 7
xdebug имеет приятную функцию трассировки, которая позволит вам увидеть всю трассировку вашего приложения php-приложения, и он должен дать вам понять, где находится ваш выход.
но для быстрого и грязного решения grep/find, как указано выше, будет делать правильно.
Ответ 8
Также проверьте error___logs для ошибок "memory_limit
" в Apache error_log.
Предел памяти >= 10M Предупреждение: (Установите этот параметр в файле php.ini 10M или больше)
По моему опыту, сценарии внезапно заканчиваются без предупреждения или уведомления, когда это происходит.
Ответ 9
Убедитесь, что ошибки отображаются в среде разработки (а не в производстве).