本文目录导读:

- 方案一:使用 JMeter + 事务控制器(最推荐)
- 方案二:Locust(Python脚本,适合代码控)
- 方案三:Vegeta + Go脚本(高性能,适合API压测)
- 核心参数配置指南
- PHP项目特殊注意事项
- 实战检测脚本
- 最佳实践建议
- 推荐工具组合
针对PHP项目的混合压测(同时组合GET、POST、PUT、DELETE等多种请求类型),核心挑战在于如何模拟真实用户的不同操作比例,以下是几种成熟的实现方案,按推荐程度排序:
使用 JMeter + 事务控制器(最推荐)
配置步骤:
- 创建线程组:设置并发数、Ramp-Up时间
- 添加逻辑控制器 → 随机控制器(按比例分配请求)
线程组(100并发)
├── 随机控制器(30%)
│ └── HTTP请求:GET /api/users
├── 随机控制器(50%)
│ └── HTTP请求:POST /api/orders
└── 随机控制器(20%)
└── HTTP请求:PUT /api/users/1
- 添加CSV数据文件:为POST/PUT提供动态参数
- 配置断言:检查响应状态码200
- 添加监听器:聚合报告、图形结果
高级技巧:
- 使用 While控制器 配合计数器实现循环
- 通过 BeanShell 动态生成UUID、时间戳等参数
- 添加 定时器 模拟用户思考时间
Locust(Python脚本,适合代码控)
示例脚本:
from locust import HttpUser, task, between
import random
class WebsiteUser(HttpUser):
wait_time = between(1, 3) # 思考时间
def on_start(self):
# 登录获取token
self.client.post("/login", {"user": "test", "pass": "test"})
@task(3) # 权重3
def view_users(self):
self.client.get("/api/users", headers={"Authorization": "Bearer xxx"})
@task(5) # 权重5
def create_order(self):
payload = {"product_id": random.randint(1,100), "qty": 1}
self.client.post("/api/orders", json=payload)
@task(2) # 权重2
def update_user(self):
user_id = random.choice([1,2,3,4,5])
self.client.put(f"/api/users/{user_id}", json={"name": "updated"})
运行命令:
locust --host=https://your-php-site.com --users=100 --spawn-rate=10
Vegeta + Go脚本(高性能,适合API压测)
创建速率定义文件 rate.json:
{
"type": "http-request-flow",
"rate": 100,
"duration": "30s",
"requests": [
{
"method": "GET",
"url": "https://api.example.com/users",
"weight": 3
},
{
"method": "POST",
"url": "https://api.example.com/orders",
"weight": 5,
"headers": {"Content-Type": "application/json"},
"body": "{\"product\": \"{{random}}\"}"
},
{
"method": "PUT",
"url": "https://api.example.com/users/{{randomInt 1 10}}",
"weight": 2
}
]
}
运行:
vegeta attack -format=json -rate 100/s -duration 30s -ratefile=rate.json | vegeta report
核心参数配置指南
| 参数 | 推荐值 | 说明 |
|---|---|---|
| 请求比例 | GET: 40%, POST: 35%, PUT: 15%, DELETE: 10% | 根据实际业务调整 |
| 并发数 | 从50开始,逐步增加到200 | 观察响应时间 |
| 思考时间 | 1-5秒随机 | 模拟真实用户 |
| Token复用 | 每个会话复用 | 减少登录压力 |
| 参数随机化 | 必须开启 | 避免缓存命中 |
PHP项目特殊注意事项
Session/Cookie处理
# Nginx配置保持session一致性
upstream php_backend {
ip_hash; # 确保同一用户打到同一PHP-FPM
server 127.0.0.1:9000;
}
PHP-FPM调优
; 压测前调整 pm.max_children = 100 pm.start_servers = 20 pm.min_spare_servers = 10 pm.max_spare_servers = 30 pm.max_requests = 1000
数据库连接池
如果使用PDO,确保使用持久连接:
$pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass', [
PDO::ATTR_PERSISTENT => true
]);
实战检测脚本
快速验证PHP项目的Max并发能力:
# 混合压测100并发,持续60秒
ab -n 6000 -c 100 -m POST -p post_data.txt \
-H "Content-Type: application/json" \
-r https://your-site.com/api/endpoint
# 混合GET/POST的替代方案(需要自定义)
siege -c 100 -t 60S --content-type "application/json" \
"https://your-site.com/api/users GET" \
"https://your-site.com/api/orders POST {\"product\":1}" \
-v
最佳实践建议
- 先单类型压测:确认单一请求类型瓶颈
- 逐步增加混合比例:从50%GET+50%POST开始
- 监控资源消耗:同时监控CPU、内存、MySQL连接数
- 使用分布式压测:单机不够时,用JMeter分布式集群
- 预热阶段:前30秒忽略结果(PHP-FPM初始建立连接)
推荐工具组合
| 场景 | 工具 |
|---|---|
| 快速简单混合压测 | Siege |
| 复杂业务逻辑 | JMeter |
| 持续集成 | Locust/Vegeta |
| 全链路跟踪 | Apache Bench + 自定义脚本 |
最终建议:对于PHP项目,推荐 JMeter + 随机控制器 方案,因为:
- GUI配置直观
- 支持动态参数
- 能精确控制请求比例
- 丰富的监控报告
- 支持分布式压测
需要帮助搭建具体的压测脚本吗?可以告诉我你的PHP项目使用的是哪个框架(Laravel/Symfony/原生),我可以给出更针对性的配置。