Хотя я debug_backtrace()
ответ на этот вопрос , я обнаружил, что debug_backtrace()
не отслеживает функцию, зарегистрированную для register_shutdown_function()
при вызове из нее.
Это было упомянуто в этом комментарии для register_shutdown_function()
в документах PHP, в котором говорится:
Вы можете получить идею вызвать debug_backtrace или debug_print_backtrace изнутри функции выключения, чтобы отслеживать, где произошла фатальная ошибка. К сожалению, эти функции не будут работать внутри функции выключения.
Объясненные с более подробной информацией, комментарии к этому ответу утверждают:
Не работает. Функция выключения происходит после того, как стек отключился. Сбрасывать информацию о стеке не существует.
Есть ли способ обойти это, заставляя PHP удерживать трассировку стека до тех пор, пока процесс не завершится вообще, или мы не должны принимать его как заданный из-за внутренних внутренних языков PHP?
Есть ли способ обойти это, заставляя PHP удерживать трассировку стека
Это довольно бессмысленно, когда вызывается зарегистрированная функция, все ваши определенные функции возвращаются или удаляются из стека.
Если вам нужно знать, где выходил ваш код, вам необходимо ввести код.
Это очень дорогое решение. Я никогда не использовал register_tick_function()
или tick
и я не уверен, работает ли он так, как ожидалось.
declare(ticks=1); function tick_handler() { global $backtrace; $backtrace = debug_backtrace(); } register_tick_function('tick_handler'); function shutdown() { global $backtrace; // do check if $backtrace contains a fatal error... var_dump($backtrace); } register_shutdown_function('shutdown');
По моему опыту, функция останова начинается с чистого стека, и у него нет доступа к «исходному» стеку (поскольку он больше не существует в этой точке).
К сожалению, сохранить исходный стек невозможно.
В расширении XDebug существует xdebug_get_function_stack()
.
Это похоже на внутренний debug_backtrace()
PHP, но сохраняет трассировку даже в обработчике останова.
Вы не получите точную точку выхода, хотя только последняя выполненная функция до выключения (вызвана вызовом die()
/ exit()
или ошибкой).
Это, конечно, подходит только для среды разработки.