本文目录导读:

在PHP项目中进行压力测试时,为了避免压测流量污染线上数据、日志或业务统计,必须对压测流量进行清晰的标记和区分,以下是几种常用的方案,按推荐程度排序:
HTTP请求头标记(最推荐)
在发送压测请求时,自定义一个请求头(如 X-Scene: stress-test 或 X-Stress-Test: true),PHP侧通过 $_SERVER 获取并判断。
压测工具配置示例
Apache ab:
ab -H "X-Stress-Test: true" -n 10000 -c 100 http://yourdomain.com/api/test
wrk:
-- 脚本中设置 wrk.method = "GET" wrk.headers["X-Stress-Test"] = "true"
JMeter:添加HTTP头管理器,设置 X-Stress-Test: true
PHP端处理(入口文件或中间件)
// index.php 或框架的全局中间件
define('IS_STRESS_TEST',
isset($_SERVER['HTTP_X_STRESS_TEST']) &&
$_SERVER['HTTP_X_STRESS_TEST'] === 'true'
);
// 后续使用
if (IS_STRESS_TEST) {
// 压测逻辑:跳过写业务日志、使用独立数据库连接等
}
优点:
- 精确、独立,不干扰正常请求
- 可传递额外参数(如场景编号)
- 各压测工具都支持自定义header
URL参数标记
在请求URL中添加特定参数,如 ?stress_test=1。
压测配置
ab -n 10000 -c 100 "http://yourdomain.com/api/test?stress_test=1"
PHP判断
$isStressTest = isset($_GET['stress_test']) && $_GET['stress_test'] == '1';
缺点:
- 参数可能被正常用户误传或开发者忘记移除
- 被搜索引擎、爬虫、缓存系统记录
- 不宜用于生产环境长期使用
Cookie标记
设置一个专用的Cookie来标记压测流量。
# 使用curl携带cookie curl --cookie "stress_test=1" http://yourdomain.com/api/test
$isStressTest = isset($_COOKIE['stress_test']) && $_COOKIE['stress_test'] == '1';
注意:Cookie容易被携带或丢失,不适合作为唯一标记。
IP白名单(辅助方案)
配合上述方案使用,将压测机IP加入白名单,仅在白名单IP请求时才启用压测模式。
$stressIps = ['10.0.0.1', '192.168.1.100']; $isStressIp = in_array($_SERVER['REMOTE_ADDR'], $stressIps); // 同时检查header或cookie $isStressTest = $isStressIp && isset($_SERVER['HTTP_X_STRESS_TEST']);
使用独立域名/路由(彻底隔离)
- 方式A:压测走测试域名
test.yourdomain.com,PHP检测$_SERVER['HTTP_HOST'] - 方式B:在Nginx层将特定路径(如
/stress/)转发到压测专用PHP-FPM池
location /stress/ {
fastcgi_pass unix:/var/run/php/stress-pool.sock;
# ...
}
PHP无需修改代码,直接使用不同数据库或缓存实例。
实际项目中的最佳实践组合
// 定义一个统一函数或常量
function isStressTestRequest(): bool {
// 1. 优先检查header
if (isset($_SERVER['HTTP_X_STRESS_TEST'])) {
return true;
}
// 2. 其次检查GET参数(仅开发环境可用)
if (defined('ENVIRONMENT') && ENVIRONMENT === 'development') {
return isset($_GET['stress_test']) && $_GET['stress_test'] == '1';
}
return false;
}
压测时建议做以下隔离:
- 数据库:压测请求使用独立的数据库连接(或测试库)
- 缓存:独立Redis key前缀(如
stress:) - 日志:压测日志写入独立文件(如
stress-*.log)或直接丢弃 - 业务统计:压测流量不计入PV/UV、订单量等
- 队列/消息:压测消息使用独立交换机/队列
注意事项
- 不要依赖User-Agent:容易被伪装,且正常用户Agent特征不固定
- 不要在正式环境暴露压测标记key:防止被恶意利用
- 压测完成后清除标记:避免残留代码影响后续正常请求
- 考虑使用链路追踪ID:将压测标记写入trace span,在分布式系统中统一过滤
选择哪一种方案取决于你的压测目标、团队规范以及现有基础设施,最推荐HTTP Header标记 + 独立压测工具配置,兼顾精确性和可追溯性。