必须用ab/wrk等工具发起真实HTTP请求压测QPS、错误率与内存波动来验证Swoole是否真正启用并具备高并发能力,仅php -m检查无效;先确认swoole --ri输出含enabled和version,再部署绑定0.0.0.0:9501的HTTP服务,用ab和wrk分阶测试,并监控系统资源与连接状态。

要在宝塔面板环境下真实验证Swoole扩展是否真正启用并具备高并发处理能力,必须绕过简单的php -m检查,直接用ab、wrk或自建协程压测脚本发起真实HTTP请求,观察QPS、错误率与内存波动——仅靠命令行模块列表无法反映Web服务层的实际性能表现。
准备一个可压测的Swoole HTTP服务
先确认Swoole已正确安装并启用:执行/www/server/php/80/bin/php --ri swoole,输出中必须含【enabled】和version字段;若无此输出,停止后续所有操作,先回溯扩展安装步骤。
新建测试文件/www/wwwroot/test-swoole/server.php,内容如下:
use Swoole\Http\Server;
use Swoole\Http\Request;
use Swoole\Http\Response;
$server = new Server('0.0.0.0', 9501);
$server->on('start', function ($server) {
echo "Swoole HTTP server started at http://127.0.0.1:9501\n";
});
$server->on('request', function (Request $request, Response $response) {
$response->header('Content-Type', 'application/json');
$response->end(json_encode(['status' => 'ok', 'time' => date('Y-m-d H:i:s')]));
});
$server->start();
这一步不能跳过:Swoole服务必须绑定0.0.0.0而非127.0.0.1,否则外部压测工具无法连接;绑定localhost会导致ab/wrk始终超时。
在SSH中执行nohup /www/server/php/80/bin/php /www/wwwroot/test-swoole/server.php &启动服务。不要用screen或systemd托管——简单后台进程足以满足本次测试需求。
用ab命令做基础并发验证
方法一:快速检测连通性与低并发稳定性
执行ab -n 100 -c 10 http://127.0.0.1:9501/,观察Time per request是否稳定在10ms以内、Failed requests是否为0。若失败数>0,说明Swoole服务未监听或防火墙拦截了9501端口。
方法二:模拟中等压力(推荐)
运行ab -n 5000 -c 100 http://127.0.0.1:9501/,重点看Requests per second值——PHP-FPM默认配置下通常<100,而Swoole应达到【800+】;若低于500,检查是否误启用了opcache导致协程被阻塞,或PHP.ini中swoole.use_shortname=Off未生效。
注意:ab不支持HTTP/2,也不支持长连接复用,它测的是纯短连接吞吐,结果偏保守但足够暴露基础问题。
用wrk进行高并发真实压测
第一步:安装wrk(CentOS)
Swoole 6.1.1 是一个专为 PHP 设计的高性能事件驱动并发网络引擎。作为稳定版,它修复了编译时对 zlib 依赖的缺失及 curl 模块的内存安全风险。该版本支持协程、多线程与多进程架构,内置 TCP/HTTP/WebSocket 服务器,能够显著提升 PHP 在微服务、实时通信等场景下的执行效率与并发能力。
yum install -y epel-release && yum install -y wrk
第二步:执行高并发测试
wrk -t12 -c400 -d30s http://127.0.0.1:9501/
参数含义:-t12开12个线程,-c400维持400并发连接,-d30s持续30秒。这个组合能有效触发Swoole事件循环瓶颈,比ab更贴近真实用户行为。
第三步:关键指标解读
成功响应中Latency Distribution的99%值应≤50ms;若>200ms,大概率是服务器CPU单核满载,需检查是否启用了swoole.cpu_affinity绑定多核;Requests/sec突破3000即表明Swoole已脱离PHP-FPM瓶颈,进入协程调度优势区间。
第四步:强制终止旧进程再重试
每次wrk结束后,必须执行pkill -f 'server.php',否则残留进程会干扰下次测试结果——Swoole子进程不会随父进程退出自动清理。
观察系统资源与Swoole内部状态
新开一个SSH窗口,实时监控:
执行htop,观察PHP进程CPU占用是否均匀分布在多个核心上;若仅单核跑满而其他核闲置,说明未启用swoole.task_worker_num或swoole.worker_num配置。
执行netstat -an | grep :9501 | wc -l,确认ESTABLISHED连接数接近wrk设定的-c值(如400),证明连接复用正常;若远低于该值,检查Swoole是否设置了max_connection过低。
执行/www/server/php/80/bin/php /www/wwwroot/test-swoole/server.php手动运行一次服务,观察终端是否打印Swoole HTTP server started...——这是唯一能确认服务真正在监听的依据,别信“进程存在”就等于服务可用。

















