PHP 通过 trace_id 实现全链路追踪
PHP 通过 trace_id 实现全链路追踪(Distributed Tracing),是将一次用户请求在多个服务(Nginx、PHP-FPM、MySQL、Redis、第三方 API)间传递的唯一标识。它让工程师从'日志大海捞针'升级为'一键穿透故障',是高可用系统必备能力。
一、核心原理:trace_id 如何串联全链路?
1. 分布式追踪三要素
| 元素 | 作用 | 示例 |
|---|---|---|
| trace_id | 唯一标识一次完整请求 | a1b2c3d4-... |
| span_id | 标识链路中的一个操作(如 SQL 查询) | e5f6g7h8 |
| parent_span_id | 标识父操作(构建调用树) | a1b2c3d4 |
2. 传递机制:上下文透传
- HTTP 层:
- 入口:Nginx 生成
trace_id→ 透传给 PHP; - 出口:PHP 调用下游服务时,将
trace_id放入请求头;
- 入口:Nginx 生成
关键头:
X-Request-ID: a1b2c3d4-... // 通用
Traceparent: 00-a1b2c3d4-...-01 // W3C Trace Context 标准
核心:
trace_id是请求的'身份证',贯穿所有系统。
二、实现机制:PHP 中如何生成与透传?
1. 生成 trace_id(请求入口)
方案 2:PHP 生成
// public/index.php
$traceId = $_SERVER['HTTP_X_REQUEST_ID'] ?? uniqid('', true);
$_SERVER['HTTP_X_REQUEST_ID'] = $traceId;
方案 1:Nginx 生成(推荐)
# nginx.conf
location / {
set $trace_id $http_x_request_id;
if ($trace_id = '') {
set $trace_id "$pid-$msec-$remote_addr";
}
proxy_set_header X-Request-ID $trace_id;
fastcgi_param HTTP_X_REQUEST_ID $trace_id;
}

