Emi*_*lio 6 php debug-backtrace register-tick-function
我想用来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());
Run Code Online (Sandbox Code Playgroud)
它只打印dump()功能.
Function dump() has been called
Function dump() has been called
Function dump() has been called
Run Code Online (Sandbox Code Playgroud)
为什么我没有看到print()和array_search()跟踪数据?就像堆栈在调用之前已经重置一样dump().我也很确定它在过去是否正常工作.
小智 1
您误解了回溯是什么,该堆栈不是 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()
Run Code Online (Sandbox Code Playgroud)
当 PHP 解释您的脚本时,它会导航您的函数,在当前堆栈中添加和删除。回溯堆栈并不是 PHP 按时间顺序记录调用了哪些函数的地方。
对于后者,这是我找到的解决方案:Get a Called Functions List in PHP