php 为什么debug_backtrace()不返回任何内容?

gz5pxeao  于 11个月前  发布在  PHP
关注(0)|答案(1)|浏览(116)

PHP 7.4中的PHP代码
这段代码的一部分是一个顶级的PHP脚本(/home/path/a.php),其中包含一堆try catch块,并包含对对象和包含文件的各种调用。
这些try/catch块抛出客户错误和运行时错误等。
在throw中有一个错误日志,其中包含错误日志的debug_backtrace()打印。

// some code
use some/path/to/objects; 
$database = new Database();
include "some/file/reference.php";

try {
//   various things including $_SESSION data

    if (empty($_SESSION['b']) || empty($_POST['d'])) {
        if(empty($_SESSION['b'])) {
            error_log("session appears empty. No b");
        }
        if(empty($_POST['d'])) {
            error_log("POST appears empty. No d");
        }
        throw new RuntimeException('Incorrect validation/form details given.');
    }
}
catch (RuntimeException | Exception $ex) {
    error_log("Login Page: ".$_SESSION['message']);
    error_log("debug: ".print_r(debug_backtrace(),true));
}

字符串
然而,这段代码正确地运行并收集了错误,但错误日志只显示了以下内容:
[31-Jul-2023 18:42:17 Europe/伦敦]来自$_SESSION ['message']的一些自定义反馈消息
[31-Jul-2023 18:42:17欧洲/伦敦]阵列


为什么这里的Debug_backtrace()是空的?我希望它至少显示参数和变量的页面,或会话数据或环境数据?
我在其他地方使用过这种方法,它(据我回忆)工作正常。我错过了什么?

t3irkdon

t3irkdon1#

debug_backtrace()提供了一个调用堆栈,它将你带到了你所在的位置,但是你已经在最外面的(即全局)范围内,而且你还没有进行任何调用,所以没有调用堆栈。

print_r(debug_backtrace());

字符串
产量:

Array
(
)


如果你把代码放在一个函数中,你会得到一个只有一项的调用堆栈:

function foo()
{
    print_r(debug_backtrace());
}
foo();


产量:

Array
(
    [0] => Array
        (
            [file] => ...
            [line] => 6
            [function] => foo
            [args] => Array
                (
                )

        )

)


如果你在全局范围内需要一些(最小的)调试信息,你可以将所有代码 Package 在一个闭包中,然后立即调用该内联:

(function() {
    // all your code here
    print_r(debug_backtrace());
})();


产量:

Array
(
    [0] => Array
        (
            [file] => ...
            [line] => 5
            [function] => {closure}
            [args] => Array
                (
                )
        )
)


关于session/environment数据,只有当你将它们作为参数传递时,它才会显示这些内容:

foo($_ENV);


产量:

Array
(
    [0] => Array
        (
            [file] => ...
            [line] => 6
            [function] => foo
            [args] => Array
                (
                    [0] => Array
                        (
                            [TERM] => xterm
                            [PATH] => /usr/bin:/bin
                            [LANG] => C
                            [SHELL] => /bin/sh
                            [MAIL] => /var/mail/nobody
                            [LOGNAME] => nobody
                            [USER] => nobody
                            [HOME] => /tmp
                        )
                )
        )
)


如果你想像这样记录会话/环境变量,你最好显式地转储它们:

error_log(print_r($_ENV, true));
error_log(print_r($_SESSION, true));

相关问题