由register_tick_function()调用的PHP debug_backtrace()不会返回完整堆栈

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