单个请求的多个Xdebug转储

问题描述 投票:4回答:1

我希望我的服务器使用php.ini为每个请求进行一次Xdebug转储

xdebug.auto_trace=1
xdebug.collect_params=4
xdebug.trace_format=1
xdebug.collect_return=1
xdebug.collect_assignments=1
xdebug.trace_options=0
xdebug.trace_output_dir=/tmp/
xdebug.trace_output_name=xdebug.%R.%U
xdebug.var_display_max_data=16000

我还将Apache生成的唯一ID转储到日志文件中,该文件显示:

"GET / HTTP/1.1" "XIZB4KSTHJac6j8l3z6SOwAAAAA"

到目前为止一切顺利 - 单个日志条目应该意味着一个日志文件。但是,我的Xdebug转储文件夹现在有多个xdebug转储:

xdebug._.XIZB4KSTHJac6j8l3z6SOwAAAAA.0943bc.xt  xdebug._.XIZB4KSTHJac6j8l3z6SOwAAAAA.0e4362.xt
xdebug._.XIZB4KSTHJac6j8l3z6SOwAAAAA.0c6269.xt  xdebug._.XIZB4KSTHJac6j8l3z6SOwAAAAA.xt
xdebug._.XIZB4KSTHJac6j8l3z6SOwAAAAA.0363ec.xt  xdebug._.XIZB4KSTHJac6j8l3z6SOwAAAAA.0cb868.xt

其中一个匹配的xdebug._.XIZB4KSTHJac6j8l3z6SOwAAAAA.xt似乎是基于内容的合法的。其他xdebugs更小,似乎不包含处理请求所需的核心调用。但是,它们似乎相关,因为它们共享相同的ID。

那些额外的xdebug是什么?如何将它们合并到正确的xdebug中(如果它们实际上与同一请求相关)?

发布整个跟踪文件会有点多,我会在我自己没有编写的代码上生成跟踪文件,因此无法告诉您任何实现细节。但是,我倾倒了一个简短的'怪异'跟踪文件。

Version: 2.6.0
File format: 4
TRACE START [2019-01-08 19:53:33]
1       1119    0       0.056006        797816  MyBB->__destruct        1               /opt/bitnami/apps/mybb/htdocs/inc/class_core.php        0       0
2       1120    0       0.056014        797816  function_exists 0               /opt/bitnami/apps/mybb/htdocs/inc/class_core.php        590     1       'run_shutdown'
2       1120    1       0.056021        797816
2       1120    R                       TRUE
2       1121    0       0.056026        797816  run_shutdown    1               /opt/bitnami/apps/mybb/htdocs/inc/class_core.php        592     0
2       1121    1       0.056032        797816
1       1119    1       0.056035        797816
1       1119    R                       NULL
                        0.056350        38208
TRACE END   [2019-01-08 19:53:33]
php xdebug
1个回答
0
投票

从您的示例跟踪和围绕该主题的一些研究,我可能找到您所描述的行为的答案:

正如https://stackoverflow.com/a/17995870/2833639所述,关闭函数用完了“正常”请求堆栈,debug_backtrace() from registered shutdown function in PHP告诉我们基本上,你无法在关闭函数内跟踪。

您的示例跟踪告诉我们调用了类“MyBB”的Object的析构函数方法。

我的假设是,对象析构函数(如关闭函数)是在“普通”堆栈之外处理的,因此Xdebug为请求的每个单独跟踪创建不同的跟踪文件(正常跟踪+ x关闭/析构函数调用)。当然,我在文档中没有发现任何内容,但由于对象破坏的性质,这似乎很合理。很可能这些单独的跟踪发生在HTTP请求的响应发生之后,但这取决于具体的实现。

(我知道答案不应该基于猜测或思考,但我觉得它可能在这里很有用,所以在这一点上随意证明我是对还是错)

© www.soinside.com 2019 - 2024. All rights reserved.