我有用PHP7.4编写的PHP代码

这段代码的一部分是一个顶级的PHP脚本(/home/path/a.php),它包含一组try Catch块,并包含对对象和包含文件的大量调用.

这些Try/Catch块抛出客户错误和运行时错误等.

在抛出中,有一个错误日志(log),其中包括打印到错误日志(log)的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));
}

但是,此代码运行并正确收集错误,但错误日志(log)仅显示以下内容:

[31-Jul-2023 18:42:17 Europe/London] Some custom feedback message from $_SESSION['message']
[31-Jul-2023 18:42:17 Europe/London] Array
(
)

为什么这里Debug_backtrace()是空的?我希望它至少显示页面给出的参数和变量,或者显示会话数据或环境数据?

我曾在其他地方使用过这种方法,而且(就我记忆所及)它是正确的.我遗漏了什么?

推荐答案

debug_backtrace()给出了将您带到现在位置的调用堆栈,但是您已经在最外层(即全局)作用域中,并且您还没有进行任何调用,所以没有调用堆栈.

print_r(debug_backtrace());

yield 率:

Array
(
)

如果您将代码放入一个函数中,您将得到一个带有一个项目的调用堆栈:

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

yield 率:

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

        )

)

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

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

yield 率:

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

对于会话/环境数据,如果您将它们作为参数传递,它只会向您显示这些内容:

foo($_ENV);

yield 率:

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

Php相关问答推荐

如何在Livewire中验证多个 Select 字段

composer如何解析包名?

如何在数据库中添加注册表单中的动态新行?

在不超过PHP时间限制的情况下,在Laravel中高效地插入批量数据(25万条记录)?(队列、多租户)

在php中有没有办法比较两个包含相同枚举类型的枚举数组

WooCommerce产品按特定元数据的自定义数字排序选项

具有重叠捕获组的PHP正则表达式

WooCommerce常规价格增加额外的附加平价

根据WooCommerce中的客户计费国家/地区更改产品价格

列出所有WooCommerce处理订单中的产品数量,SKU和品牌

将一个按钮添加到WooCommerce产品的管理视图中,该按钮链接到一个自定义的WebHook,并在末尾附加产品ID

从AJAX响应中获取一个未定义的html

如何在微软图形API中使用用户S访问令牌或基于租户ID的访问令牌?

Laravel自定义验证规则更正

Shopware 6插件:由于删除了配置密钥,更新后配置值不正确

htaccess 重定向子域错误的 url

PHP 在数组中搜索值

如何将文件上传添加到 WooCommerce 结帐?

hasOne/belongsToMany 或多对多

如何在运行 update_post_meta 后更新 wp_wc_product_attributes_lookup 表?