PHP怎样进行压力测试_进行网站压力测试的工具【测试】

10次阅读

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

PHP 怎样进行压力测试_进行网站压力测试的工具【测试】

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 免费学习笔记(深入)”;

  • 注意 -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 = Offlog_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 慢,其实是别的环节卡住了。

text=ZqhQzanResources