Самый быстрый способ определить, где находится скрипт PHP

Скажем, у вас большой PHP-проект, и внезапно, при попытке его запустить, вы просто получаете пустую страницу. Сценарий заканчивается, и вы хотите найти именно то, где это находится с минимальными усилиями, насколько это возможно.

Существует ли инструмент / программа / команда /IDE, который может при завершении сценария PHP сообщить вам место выхода сценария?

Примечание: я не могу пометить свой пост как "принятый ответ", поэтому посмотрите на нижнюю часть, чтобы увидеть мое решение. Если вы найдете лучшее решение, я отмечу ваш пост как ответ.

9 ответов

Решение

С некоторым вдохновением от неработающего, но все еще правильного ответа от Роборга, я использовал следующий код в начале:

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.)

Я использую следующий код и не нуждаюсь в специальной среде отладки. Обратите внимание, что это может занять очень много времени; Вы можете установить количество тиков выше - это делает его быстрее, но размытым.

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);

Убедитесь, что ошибки отображаются в вашей среде разработки (не на производстве).

grep -n die filename

Не забудьте также воспользоваться "выходом".

Также проверьте error___logs для "memory_limit"ошибки в Apache error_log.

Ограничение памяти>= 10M Предупреждение. (Установите значение 10M или больше в файле php.ini)

По моему опыту, сценарии внезапно заканчиваются без предупреждения или уведомления, когда это происходит.

Вы можете использовать интерактивный отладчик для пошагового выполнения кода, пока не достигнете точки выхода. Кроме этого, я думаю, что вы до grep'ing код для exit|die,

Добавьте это в начало файла:

function shutdown()
{
    print_r(debug_backtrace());
}


register_shutdown_function('shutdown');

Смотрите http://www.php.ne t/register_shutdown_function

В xdebug есть замечательная функция трассировки, которая позволит вам увидеть всю трассировку выполнения вашего php-приложения и дать вам подсказку, где находится ваш выход.

но для быстрого и грязного решения grep/find, как упомянуто выше, будет делать правильно.

Другие вопросы по тегам