我希望我的服务器使用php.ini
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
相匹配的似乎是合法的。其他xdebug小得多,并且似乎不包含处理请求所需的核心调用。但是,它们看起来确实相关,因为它们共享相同的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]
答案 0 :(得分:0)
从您的示例跟踪记录和有关该主题的一些研究中,我可能找到了您描述的行为的答案:
如https://stackoverflow.com/a/17995870/2833639中所述,关闭功能用完了“正常”请求堆栈,debug_backtrace() from registered shutdown function in PHP基本上告诉我们,您无法在关闭功能中进行跟踪。
您的样本跟踪表明,调用了“ MyBB”类的Object的析构函数方法。
我的假设是对象析构函数(如关闭函数)是从“常规”堆栈中处理的,因此Xdebug为请求的每个单独跟踪(正常跟踪+ x shutdown /析构函数调用)创建了不同的跟踪文件。当然,我在文档中什么都没找到,但是由于对象破坏的性质,这似乎是合理的。这些单独的跟踪很可能在HTTP请求的响应发生之后发生,但这取决于特定的实现。
(我知道答案不应该基于猜测或思想,但我觉得这可能有用,因此请随时证明我是对还是错)