PHP项目混合压测如何组合多种请求类型流量

wen PHP项目 29

本文目录导读:

PHP项目混合压测如何组合多种请求类型流量

  1. 方案一:使用 JMeter + 事务控制器(最推荐)
  2. 方案二:Locust(Python脚本,适合代码控)
  3. 方案三:Vegeta + Go脚本(高性能,适合API压测)
  4. 核心参数配置指南
  5. PHP项目特殊注意事项
  6. 实战检测脚本
  7. 最佳实践建议
  8. 推荐工具组合

针对PHP项目的混合压测(同时组合GET、POST、PUT、DELETE等多种请求类型),核心挑战在于如何模拟真实用户的不同操作比例,以下是几种成熟的实现方案,按推荐程度排序:

使用 JMeter + 事务控制器(最推荐)

配置步骤:

  1. 创建线程组:设置并发数、Ramp-Up时间
  2. 添加逻辑控制器随机控制器(按比例分配请求)
线程组(100并发)
  ├── 随机控制器(30%)
  │   └── HTTP请求:GET /api/users
  ├── 随机控制器(50%)
  │   └── HTTP请求:POST /api/orders
  └── 随机控制器(20%)
      └── HTTP请求:PUT /api/users/1
  1. 添加CSV数据文件:为POST/PUT提供动态参数
  2. 配置断言:检查响应状态码200
  3. 添加监听器:聚合报告、图形结果

高级技巧:

  • 使用 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

最佳实践建议

  1. 先单类型压测:确认单一请求类型瓶颈
  2. 逐步增加混合比例:从50%GET+50%POST开始
  3. 监控资源消耗:同时监控CPU、内存、MySQL连接数
  4. 使用分布式压测:单机不够时,用JMeter分布式集群
  5. 预热阶段:前30秒忽略结果(PHP-FPM初始建立连接)

推荐工具组合

场景 工具
快速简单混合压测 Siege
复杂业务逻辑 JMeter
持续集成 Locust/Vegeta
全链路跟踪 Apache Bench + 自定义脚本

最终建议:对于PHP项目,推荐 JMeter + 随机控制器 方案,因为:

  • GUI配置直观
  • 支持动态参数
  • 能精确控制请求比例
  • 丰富的监控报告
  • 支持分布式压测

需要帮助搭建具体的压测脚本吗?可以告诉我你的PHP项目使用的是哪个框架(Laravel/Symfony/原生),我可以给出更针对性的配置。

抱歉,评论功能暂时关闭!