PHP应用需借助外部工具压测,ab适合简单吞吐验证,wrk适用于高并发与长连接,locust用于模拟真实用户行为流;瓶颈常在FPM调度、OPcache、MySQL或Redis等中间件而非PHP代码本身。

PHP 应用本身不内置压力测试能力,得靠外部工具发起 HTTP 请求并统计响应表现;直接在 PHP 代码里写循环调用 file_get_contents() 或 curl_exec() 做“自测”毫无意义——它测的是单进程串行请求,不是并发场景,也捕获不到超时、连接拒绝、队列堆积等真实瓶颈。
用 ab 快速验证接口吞吐量(Apache Bench)
ab 是最轻量的入门选择,适合单 URL 简单压测,比如验证某个 API 路由能否扛住 100 并发。
- 安装:Linux/macOS 通常自带,Windows 需下载 Apache 安装包或用
choco install apache-httpd - 基本命令:
ab -n 1000 -c 100 http://localhost/api/user表示发 1000 次请求、最大 100 并发 - 关键看输出里的
Requests per second(QPS)、Time per request(平均延时)、Failed requests(失败数) - 注意:默认不带 Cookie 和 Header,要测登录态需加
-H "Authorization: Bearer xxx";POST 数据用-p post.txt -T "application/json" - 坑点:
ab不支持 HTTPS SNI、不处理重定向、无法做多步骤会话(如先登录再请求),复杂场景立刻失效
用 wrk 测高并发与长连接稳定性
当需要模拟数百到数千并发、或关注连接复用、TLS 握手开销时,wrk 比 ab 更准更可控。
- 安装:
brew install wrk(macOS)、apt install wrk(Ubuntu);源码编译也简单 - 基础命令:
wrk -t4 -c400 -d30s http://localhost/api/order表示 4 线程、400 连接、持续 30 秒 - 优势在于能跑 Lua 脚本,可实现登录鉴权、动态参数、阶梯增压(如每 5 秒加 100 并发)
- 必须注意:
wrk默认启用 HTTP/1.1 + keep-alive,若后端 PHP-FPM 的pm.max_children设为 50,但你压出 400 连接,大量请求会排队进pm.queue_length,此时看到的 “延时飙升” 实际是队列等待,不是 PHP 执行慢
用 locust 模拟真实用户行为流
当压测目标是“整个下单流程”,而非单个接口,locust 是更贴近生产的行为建模工具——它用 Python 写用户任务,天然支持状态维持、条件分支、思考时间。
立即学习“PHP免费学习笔记(深入)”;
- 安装:
pip install locust,写一个locustfile.py,定义HttpUser类和任务 - 示例片段:
@task装饰的方法会被随机执行,self.client.post("/login", json={...})自动携带 Session Cookie - 启动:
locust -f locustfile.py --host=http://localhost,然后打开http://localhost:8089设置并发数和增长速率 - 关键配置项:
--users(总虚拟用户数)、--spawn-rate(每秒启多少用户),这两个值设太高而 PHP-FPM 或数据库没调优,会直接触发 502/504 - 容易忽略:PHP 应用若依赖 Redis 或 MySQL 连接池,
locust压出来的错误可能不在 PHP 日志里,而在redis-cli monitor或 MySQL 的SHOW PROCESSLIST中暴露连接耗尽
真正的瓶颈往往不在 PHP 代码行数,而在 FPM 子进程调度、OPcache 编译锁、MySQL 连接数、Redis 线程阻塞这些中间层;压测时如果只盯着 echo "hello" 接口的 QPS,等于拿尺子量体温——工具对了,对象错了。



















