Intereting Posts
Как использовать переменные PHP в качестве значений тега <script> при рендеринге кода jQuery в представлении CakePHP? Laravel Eloquent – не запускать запрос отношения, если значение столбца равно NULL или 0 Динамическое поле выбора для заполнения текстового поля с использованием AJAX или jQuery и PHP Проблема с завихрением как печатать данные из mysql в pdf-файл, используя php PHP / MySQL: выберите местоположения, близкие к заданному местоположению, из базы данных Отправить POST с сайта php Zend-Framework Как показать индикатор выполнения в загрузке файла ajax Использование альтернативного поля цены в OpenCart Laravel Создание динамических маршрутов для контроллеров из базы данных Mysql Javascript API отлично работает на главном сайте, но не работает на внешнем сервере PHP Использование запросов cURL и GET в URL-адресе Заголовок не работает с сеансами Загрузить в произвольный файл .html с помощью PHP? Изменить индекс массива в желаемую проблему

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

Скажем, у вас большой проект 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)

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

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