本文目录导读:

- 方案一:使用 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/原生),我可以给出更针对性的配置。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播