Самый быстрый способ определить, где находится скрипт PHP - PullRequest
12 голосов
/ 20 октября 2008

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

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

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

Ответы [ 9 ]

9 голосов
/ 25 февраля 2011

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

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 голосов
/ 20 октября 2008

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

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

0 голосов
/ 20 октября 2008

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

0 голосов
/ 20 октября 2008

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

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

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

0 голосов
/ 20 октября 2008

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

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

0 голосов
/ 20 октября 2008

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

0 голосов
/ 20 октября 2008

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

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


register_shutdown_function('shutdown');

См. register_ shutdown_function ()

0 голосов
/ 20 октября 2008

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

0 голосов
/ 20 октября 2008
grep -n die filename
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...