应使用外部工具(如ab、wrk、jmeter)而非php脚本进行压力测试,因php单进程阻塞模型不适合并发发起请求;curl_multi_exec仅适合低并发,且缺乏关键指标统计。

PHP 代码里怎么模拟并发请求做压力测试
纯 PHP 脚本没法直接压测 Web 服务,它不是压测工具,而是被测对象。想在 PHP 里“发起并发请求”来测自己写的接口,得靠 cURL 多线程(curl_multi_exec)或 fork(仅 CLI + pcntl),但实际效率低、难控、还容易把本机打挂。真要测 PHP 应用的吞吐和瓶颈,应该用外部工具打它,而不是让 PHP 自己打自己。
常见错误现象:curl_multi_exec 写一堆但 QPS 上不去、超时多、内存暴涨;或者用 file_get_contents 循环发请求,结果串行执行,根本测不出并发能力。
- 别用 PHP 脚本当压测发起端——它单进程、阻塞模型天然不适合
- 如果非要 PHP 写调度逻辑(比如批量触发测试任务),只负责发命令,不负责收响应
-
curl_multi_exec最多适合几十个并发,超过 100 就容易出错,且无法统计响应时间分布、错误率等关键指标
Apache Bench(ab)能不能测 PHP 网站
能,而且够快够轻,适合快速验证单接口基础承载力,比如 ab -n 1000 -c 50 http://localhost/index.php。但它只支持 HTTP/1.1,不支持 HTTPS 重定向自动跟随,也不支持 Cookie 维持、Header 定制复杂场景。
使用场景:上线前快速摸底首页或登录接口的 RPS 和平均延迟;排查 Nginx 或 PHP-FPM 是否配置过严(比如 pm.max_children 太小导致 ab 报 socket: Too many open files)。
立即学习“PHP免费学习笔记(深入)”;
慧谷动力企业网站管理系统(www.elonr.com)中国企业网站达到50万用户,程序采用最简单易用的asp+access进行搭建,拥有完善的网站前后台,并特别根据企业网站的特点开发出独具特色的栏目和功能,让您能够在短时间内就拥有自己的企业网站,欢迎大家对演示网站进行测试,注意演示网站不能更改内容、修改和删除内容,否则会报错的,下载回去测试的用户可以修改添加删除的。
- 注意
-c值别超过系统 ulimit -n 限制,否则大量connect: cannot assign requested address - ab 不解析 HTML,不执行 JS,只测后端响应速度,前端资源加载不在其范围内
- PHP 开启
opcache.enable_cli=1对 ab 结果无影响——ab 测的是 Web Server 接口,不是 CLI 模式
为什么 wrk 比 ab 更适合测 PHP API 服务
wrk 支持多线程 + 异步 I/O,单机就能打出更高并发,还能写 Lua 脚本定制请求逻辑(比如带 Token、动态参数、检查响应体)。对 PHP 这类短平快接口,wrk 的统计维度更准:延迟百分位(p90/p99)、连接复用率、每秒请求数波动。
示例命令:wrk -t4 -c200 -d30s --latency "http://api.example.com/v1/user?id=123",其中 -t4 是线程数,-c200 是总连接数,不是每线程 200。
- PHP-FPM 的
pm = static时,pm.max_children必须 ≥ wrk 的-c值,否则大量 503 - wrk 默认复用连接,而 PHP 默认不保持长连接(
Connection: close),所以实际建连开销比预期高,需确认 Nginx 是否配了keepalive - 不要用 wrk 测含 session_start() 且未配 Redis 存储的接口——文件锁会成为瓶颈,和 PHP 本身性能无关
用 JMeter 测 PHP 网站要注意什么
JMeter 适合测流程型 PHP 应用(比如下单链路),但它吃内存、GUI 模式卡顿、分布式部署麻烦。真正容易踩的坑不在压测本身,而在 PHP 侧没配合调优。
常见错误现象:JMeter 报大量超时,但 php-fpm.log 里全是 WARNING: [pool www] child 12345 exited on signal 9 (SIGKILL)——这是 OOM Killer 杀的,不是 PHP 挂了。
- 必须关掉 PHP 的
display_errors = Off和log_errors = On,否则错误输出会拖慢响应并污染日志 - 数据库连接池不够时,
PDOException: SQLSTATE[HY000] [2002] Connection refused会高频出现,这不是网络问题,是 MySQL max_connections 被打满 - JMeter 的 CSV 数据集若含中文,记得用 UTF-8 without BOM 编码,否则 PHP
$_POST可能乱码,导致逻辑跳转失败
压测 PHP,本质是测整个 LAMP/LEMP 栈的协同能力。最常被忽略的是:PHP 日志级别设太高(error_log = /var/log/php/error.log + log_level = debug)、OPcache 未启用、MySQL 查询没走索引却先去调 PHP 代码——这些都会让压测结果失真,以为是 PHP 慢,其实是别的环节卡住了。










