Workerman 在 PHP 7.4 最稳定,PHP 7.2/7.3 易因 CLI 与 Web SAPI PHP 版本不一致导致“版本对不上”,PHP 8.0+ 需手动启用 disable_functions 中的 pcntl 相关函数,PHP 8.2/8.3 需安装 event 扩展并调优 TCP 参数以保障性能。

Workerman 在 PHP 7.2 到 PHP 8.3 上基本可用,但 PHP 7.4 是实际生产中最稳的分水岭;PHP 8.0+ 需主动关闭 disable_functions 中的 pcntl_fork 等函数,否则直接启动失败。
为什么 PHP 7.2/7.3 启动 Workerman 会“版本对不上”?
常见现象是:php -v 显示 7.2.23,但 phpinfo() 或 Workerman 日志里却是 7.2.9 —— 这说明 CLI 和 Web SAPI 加载了不同编译路径的 PHP。Workerman 只走 CLI,而你改的 php.ini 可能只影响了 FPM 或 Apache 模块。
- 用
which php和/usr/local/php/bin/php -i | grep "Loaded Configuration File"分别查 CLI 和 Web 的配置路径 - 确保
export PATH="/usr/local/php/bin:$PATH"写入/etc/profile并执行source /etc/profile - 检查
pcntl扩展是否真被 CLI 加载:运行/usr/local/php/bin/php -m | grep pcntl,不是php -m
PHP 8.0+ 启动报错 “pcntl_fork is disabled” 怎么办?
这不是 Workerman 的 bug,而是 PHP 8 默认更激进地禁用危险函数。Workerman 依赖 pcntl_fork、pcntl_waitpid、pcntl_signal 等,只要其中任一被禁,Worker::runAll() 就会抛出致命错误并退出。
- 打开 CLI 使用的
php.ini(不是 FPM 的那个),找到disable_functions行 - 删掉或注释掉其中的
pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_exec,pcntl_signal,pcntl_alarm等相关项 - 注意:宝塔、AMH 等面板常默认禁用全部,需手动清理;改完必须重启终端或重载 shell 环境
PHP 8.2/8.3 下长连接压测吞吐不升反降?检查 event 扩展和 TCP 参数
Workerman 在 PHP 8.2+ 上若没装 event 扩展,会退化为纯 select() 轮询,高并发下 CPU 占用飙升但 QPS 卡在 1w–1.5w 左右,远低于 PHP 7.4 + event 的 2.3w+ 表现。
立即学习“PHP免费学习笔记(深入)”;
- 确认已安装
event:运行php -m | grep event,没有就用pecl install event编译(需 libevent 开发库) - 检查
/proc/sys/net/core/somaxconn是否 ≥ 65535,否则大量连接会卡在 SYN_QUEUE - 避免在
onMessage里调用阻塞函数(如file_get_contents、未设超时的cURL),PHP 8 对阻塞更敏感,容易拖垮整个进程
真正麻烦的从来不是版本号本身,而是 CLI 和 Web 两套 PHP 环境混用、disable_functions 黑名单跨版本膨胀、以及扩展缺失却无明确报错——这些细节不逐个验证,光看“支持 PHP 8”四个字,很容易上线后连进程都起不来。











