6

我想用来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()。我也很确定它在过去可以正常工作。

4

1 回答 1

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()

当 PHP 解释您的脚本时,它会导航您的函数,在当前堆栈中添加和删除。回溯的堆栈不是 PHP 记录按时间顺序调用的函数的地方。

对于后者,这是我找到的解决方案:Get a called functions list in PHP

于 2018-02-28T16:12:35.933 回答