Xdebug的Trace日志功能是PHP开发者排查代码执行逻辑问题的重要工具,它能够将PHP脚本从启动到结束的整个执行过程以结构化日志的形式保存下来,包含函数调用顺序、参数值、返回值、执行耗时等核心信息,帮助开发者直观梳理代码的运行路径。

Xdebug Trace日志的核心配置
要使用Trace日志功能,首先需要在php.ini中完成Xdebug的相关配置,以下是常用的配置项说明:
- xdebug.trace_enable_trigger:设置为1时,可以通过请求参数触发Trace日志生成,避免每次请求都生成日志影响性能
- xdebug.trace_output_dir:指定Trace日志文件的保存目录,需要确保目录有写入权限
- xdebug.trace_output_name:设置日志文件的命名规则,支持使用%t(时间戳)、%s(请求ID)等占位符
- xdebug.trace_format:日志格式,0为人工可读的格式化文本,1为机器可解析的表格格式,2为HTML格式
- xdebug.trace_options:设置为1时,日志会追加写入而不是覆盖,适合需要记录多次请求的场景
开启Trace日志的两种方式
方式一:全局开启
在php.ini中添加以下配置,重启PHP服务后,所有PHP请求都会生成Trace日志:
[xdebug] zend_extension=xdebug.so xdebug.mode=trace xdebug.trace_output_dir=/tmp/xdebug_trace xdebug.trace_output_name=trace_%t_%s.log xdebug.trace_format=0 xdebug.trace_options=0
方式二:触发式开启
如果不需要每次请求都生成日志,可以开启触发模式,只有请求中包含特定参数时才生成Trace日志:
[xdebug] zend_extension=xdebug.so xdebug.mode=trace xdebug.trace_enable_trigger=1 xdebug.trace_enable_trigger_value=my_secret_trigger xdebug.trace_output_dir=/tmp/xdebug_trace xdebug.trace_output_name=trace_%t_%s.log xdebug.trace_format=0
此时只需要在请求URL后添加XDEBUG_TRACE=my_secret_trigger参数,就可以触发当前请求的Trace日志生成。
Trace日志内容解析
开启Trace功能后,访问一个PHP脚本,会在指定目录生成对应的日志文件,以下是一个简单的PHP脚本示例:
<?php
function add($a, $b) {
return $a + $b;
}
function calculate() {
$num1 = 10;
$num2 = 20;
$result = add($num1, $num2);
return $result;
}
$res = calculate();
echo $res;
?>
对应的Trace日志(格式化后)内容大致如下:
TRACE START [2024-05-20 12:00:00]
1 0 1 0.000001 354400 {main} 1 /tmp/test.php 0
2 1 0 0.000002 354480 calculate 1 /tmp/test.php 5
3 2 0 0.000003 354560 add 1 /tmp/test.php 3
3 2 1 0.000004 354600 0.000001 20 /tmp/test.php 3
2 1 1 0.000005 354640 0.000003 30 /tmp/test.php 8
1 0 1 0.000006 354680 0.000006 /tmp/test.php 12
TRACE END
日志中各列的含义依次是:层级、父调用序号、当前调用序号、执行时间戳、内存使用、函数名、是否内部函数、文件名、行号,以及返回值和耗时信息。通过这些信息可以清晰看到代码的执行顺序是{main}调用calculate,calculate调用add,最后逐级返回结果。
Trace日志的实际应用场景
排查代码执行顺序问题
当遇到代码逻辑不符合预期,比如某个函数没有被调用,或者调用顺序错误时,可以通过Trace日志直接查看所有函数的调用顺序,快速定位问题点。
分析代码性能瓶颈
Trace日志中记录了每个函数调用的耗时,通过对比不同函数的耗时数据,可以找到执行时间过长的函数,针对性进行性能优化。
调试复杂调用链
在框架开发中,往往存在多层函数调用和依赖注入,Trace日志可以完整展示整个调用链,帮助开发者理解框架的执行流程。
注意事项
- Trace日志会记录大量细节信息,频繁生成会产生较多磁盘IO,生产环境不建议长期开启
- 如果日志格式选择为表格或HTML格式,需要注意文件的读取方式,避免格式错乱
- 触发模式的触发值需要设置得足够复杂,避免被恶意请求触发生成大量日志