Я хочу использовать register_tick_function()
перехватить следующие вызовы и распечатать их трассировку стека debug_backtrace()
,
Если я запускаю следующий код.
<?php
function dump() {
// Replace this with var_dump(debug_backtrace()); to print the entire trace.
foreach (debug_backtrace() as $trace)
echo("Function ${trace['function']}() has been called" . PHP_EOL);
}
declare(ticks = 1);
register_tick_function('dump');
print("");
array_search('green', Array());
Он печатает только dump()
функция.
Function dump() has been called
Function dump() has been called
Function dump() has been called
Почему я не вижу print()
а также array_search()
данные трассировки? Это как стек был сброшен перед вызовом dump()
, Я также уверен, что в прошлом все работало правильно.
Вы не понимаете, что такое обратная трассировка, этот стек — не список функций, которые PHP выполнял до достижения определенной строки кода, а скорее список вложенных функций, которые оправдывают интерпретатор PHP на определенной строке кода.
Первым элементом всегда будет функция, в которой вы находитесь в данный момент, следующим будет функция, которая вызвала эту функцию и так далее. Если функция возвращается, ее больше нет в стеке.
class Foo {
public static function bar() {
return self::say();
}
public static function say() {
return debug_backtrace();
}
}
var_dump(Foo::say());
//[0] => say()
var_dump(Foo::bar());
//[0] => say();
//[1] => bar();
//Note that this behaviour work the same for require(), include() and eval()
require_once('test.php');
//test.php:
var_dump(debug_backtrace());
//[0] => require_once()
Поскольку PHP интерпретирует ваш скрипт, он перемещается по вашим функциям, добавляя и удаляя из текущего стека. Стек обратного следа — это не то место, где в журналах PHP записывались функции, которые вызывались в хронологическом порядке.
Для последнего это решение, которое я нашел: Получить список вызываемых функций в PHP
Других решений пока нет …