gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 13:29:34 26 4
gpt4 key购买 nike

我想使用 register_tick_function() Hook 以下调用并使用 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 记录按时间顺序调用的函数的地方。

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

关于register_tick_function() 调用的 PHP debug_backtrace() 不返回完整堆栈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48041926/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com