php - 单个请求的多个 Xdebug 转储
问题描述
我希望我的服务器使用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]
解决方案
从您的示例跟踪和围绕该主题的一些研究中,我可能找到了您描述的行为的答案:
如https://stackoverflow.com/a/17995870/2833639所述,关闭函数用尽“正常”请求堆栈,并且PHP 中注册的关闭函数中的 debug_backtrace()基本上告诉我们,您无法在关闭函数中进行跟踪.
您的示例跟踪表明,调用了“MyBB”类的对象的析构函数方法。
我的假设是对象析构函数,如关闭函数,是在“正常”堆栈之外处理的,因此 Xdebug 为请求的每个单独跟踪创建不同的跟踪文件(正常跟踪 + x 关闭/析构函数调用)。当然,我在文档中一无所获,但由于对象破坏的性质,这似乎很合理。这些单独的跟踪很可能发生在 HTTP 请求的响应发生之后,但这取决于具体的实现。
(我知道答案不应该基于猜测或想法,但我觉得它在这里可能很有用,所以请随时证明我在这一点上是对还是错)
推荐阅读
- android - APK 大小是否受 ReactNative 中未使用的包的影响?
- python - 如何自动创建 sparkmagic 会话(无需手动与小部件用户界面交互)?
- oracle - ORA-00920: 无效的关系运算符(没有缺失/额外的括号)
- javascript - 如何在 react native 中从命令行更改 .env var 的值?
- c++ - 如何内存对齐派生类?
- css - 如何使用 react 渲染不同的 SVG onhover
- java - Spring Boot jar 中的 FileNotFoundException 但文件存在
- python - 登录并更改 url 以进行抓取
- wpf-mediakit - EnhancedVideoRenderer 的工作原理
- c# - Visual Studio 中的 Azure Functions - 如何添加对另一个项目的引用