php 8.2 下 workerman 长连接问题主因是 opcache 未启用、fd 限制未调优、心跳逻辑错误:需显式开启 cli 模式 opcache,三层对齐 fd 限制,服务端主动检测假死连接并纯内存响应心跳。

PHP 8.2 下 Workerman 长连接卡顿、掉线多、内存涨得快,基本不是框架问题,而是 OPcache 没生效 + fd 限制没调 + 心跳逻辑写错这三类原因占了 90%。
OPcache 在 CLI 模式下必须显式启用
PHP 8.2 默认仍关闭 CLI 的 OPcache,Workerman 启动后所有代码都在重复解析——看着 CPU 不高,实际是大量时间耗在 opcode 编译上。用 php -d opcache.enable_cli=1 -r "var_dump(opcache_get_status()['opcache_enabled']);" 验证,输出 false 就说明白跑了。
- 改
/etc/php/8.2/cli/php.ini(注意是cli目录,不是fpm),加这四行:opcache.enable=1、opcache.enable_cli=1、opcache.memory_consumption=512、opcache.max_accelerated_files=30000 - 生产环境必须设
opcache.validate_timestamps=0,否则每个请求都stat()文件,IO 直接拖垮性能 - 重启 Workerman 主进程(不是 reload),因为 OPcache 配置只在 fork 时读取一次
文件描述符(fd)限制必须分层调大
长连接数一上去就报 Too many open files 或新连接超时,99% 是 fd 耗尽。别只改 ulimit -n,要三层对齐:
- 查当前限制:
cat /proc/$(pgrep -f "start.php" | head -1)/limits | grep "Max open files",看软限制是否 ≤ 硬限制 - 永久生效:在
/etc/security/limits.conf加www-data soft nofile 65535和www-data hard nofile 65535 - 如果用 systemd 管理,
/etc/systemd/system/workerman.service的[Service]段必须加LimitNOFILE=65535,且改完要systemctl daemon-reload && systemctl restart workerman -
$worker->maxConnections设为硬限制的 70%~80%,比如硬限是 65535,就设52428,留余量给日志、DNS、定时器等其他 fd
心跳机制不能只靠客户端 ping
很多项目只让客户端每 30 秒发 {"type":"ping"},服务器收到就回 {"type":"pong"},但这样无法发现“假死”连接(比如 NAT 中间设备已断开,但 TCP 状态仍是 ESTABLISHED)。
- 服务端必须维护每个连接的
lastMessageTime,并在onMessage里更新 - 用
Worker::addTimer(55, function () { ... })每 55 秒遍历所有连接,对time() - $connection->lastMessageTime > 60的连接主动$connection->close() - 不要在心跳处理里做 DB 查询或 Redis 写入——这些操作会阻塞事件循环,导致整个 Worker 卡住;心跳响应必须是纯内存操作
- 客户端也要实现超时重连:发 ping 后 60 秒没收到 pong,就断开并重建连接
reusePort 和进程数必须协同设置
单靠增加 $worker->count 会让新连接全挤在第一个进程上,造成负载不均和响应抖动。
- 先用
nproc查逻辑核心数,设$worker->count = (int)(nproc() * 1.5),4 核机器设 6,16 核设 24 - 在
Worker::runAll()前加$worker->reusePort = true,让内核把新连接 hash 分发到各进程 - 确认系统支持:
cat /proc/sys/net/core/somaxconn至少为 65535,否则即使 reusePort 开了也无效 - 避免在
onWorkerStart里初始化大型对象(如完整 ThinkPHP 容器),它会在每个进程里重复加载,内存翻倍且启动变慢
真正难调的是心跳超时阈值与业务延迟的平衡:设太短(比如 30 秒)会导致误杀弱网用户;设太长(比如 120 秒)又让失效连接堆积。这个值必须结合你真实用户的网络分布压测出来,没法抄配置。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











