2008-10-19 5 views
11

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

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

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

+0

В будущем убедитесь, что умереть() с сообщениями ;-) – Ross 2008-10-19 21:03:41

+0

Да, это обычно хорошая идея или использование обработки исключений. Работая много с кодом, я не написал себя, хотя ...x/ – 2008-10-19 21:51:21

ответ

3

С вдохновением из нерабочих, но по-прежнему прямо в направлении ответа от 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.)

0
grep -n die filename 
+0

Хороший ответ, но я ищу общее решение (для любого типа выхода), а не только для нахождения die(). Также предположите, что проект имеет множество штампов и выходов, и все они выглядят очень утомительно. – 2008-10-19 23:00:52

0

Не забудьте также включить grep для «выхода».

0

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

0

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

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

0

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

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

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

0

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

8

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

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); 
Смежные вопросы