workerman 5.2.3 高并发优化需分层击破:先启用 cli 模式 opcache(opcache.enable_cli=1 等),再合理设进程数并开启 reuseport,接着剥离阻塞操作至异步/子进程,最后调优系统网络参数。

Workerman 5.2.3 在高并发场景下性能优化,关键不是堆进程或调参数,而是分层击破:先确保 PHP 运行环境不拖后腿,再让 Workerman 架构真正“跑起来”,最后让业务逻辑不卡主线程。
必须让 OPcache 对 CLI 真正生效
90% 的“卡顿”其实根本没用上 OPcache。Workerman 是 CLI 进程,而 PHP 默认关闭 CLI 模式下的缓存。只配 opcache.enable=1 没用,必须显式开启:
- opcache.enable_cli = 1(强制启用)
- opcache.memory_consumption = 512(至少 512MB,大项目建议 1024)
-
opcache.max_accelerated_files = 30000(用
find /path -name "*.php" | wc -l估算实际文件数) - opcache.validate_timestamps = 0(生产环境铁律,否则每请求都 stat 文件)
验证是否生效:运行 php -d opcache.enable_cli=1 -r "var_dump(opcache_get_status()['opcache_enabled']);",输出 true 才算成功。
合理设置进程数并启用端口复用
进程数不是越多越好,盲目增加反而加剧上下文切换开销:
- 先查真实逻辑核心数:
grep -c ^processor /proc/cpuinfo - 推荐进程数 = 逻辑核心数 × 1.2~1.5(例如 16 核,设
$worker->count = 20) - 在
Worker::runAll()前加:$worker->reusePort = true;,让内核均衡分发新连接
不启用 reusePort,哪怕开了 20 个进程,80% 连接也可能挤在第一个 worker 上。
避免阻塞,把耗时操作彻底剥离
Workerman 的事件循环一旦被阻塞,整个进程的数千连接都会停滞:
- 数据库查询必须用异步驱动(如
workerman/mysql),禁用 PDO 或 mysqli 同步调用 - HTTP 请求用
Workerman\Http\Client或协程 HTTP 客户端,不用file_get_contents或 cURL 同步模式 - 文件读写、加密解密、AI 推理等 CPU 密集型任务,扔进独立子进程或消息队列(如 Redis + Pheanstalk)
- 日志写入改用异步方式(
Worker::$onWorkerStart中启动日志 worker,或用Monolog的Handler\StreamHandler配合BufferHandler)
系统与网络层协同调优
Workerman 再快,也受限于 Linux 内核和网卡处理能力:
- 提升文件描述符上限:
ulimit -n 100000,并在/etc/security/limits.conf中持久化 - 检查网卡是否启用多队列:
ethtool -l eth0,若支持 RSS,手动绑定中断到多个 CPU:echo 0-3 > /proc/irq/XX/smp_affinity_list - 调大内核 TCP 参数:
net.core.somaxconn = 65535、net.ipv4.tcp_tw_reuse = 1 - 禁用 irqbalance 服务,改用静态中断亲和性,防止软中断集中在单核导致
si%暴涨
如果 top 显示某个 CPU 的 si% 长期超 40%,其他核空闲,那 Workerman 进程再多也没用——数据根本进不了 socket 缓冲区。











