Workerman不可用composer install安装,因官方未发布稳定版至Packagist且依赖ext-event等非纯PHP扩展;应手动下载Worker.php和Autoloader.php并require引入。

Workerman 不能用 composer install 安装?
Workerman 本身不是 Composer 可安装的常规 PHP 包,composer require workerman/workerman 会失败或装错——因为官方未发布稳定版到 Packagist,且其核心依赖 ext-event 或 ext-libevent 不是纯 PHP 扩展,Composer 无法自动处理。你看到的某些“workerman/workerman”包其实是镜像或非官方 fork,不推荐用于生产。
正确做法是直接下载源码并手动引入:
- 去 workerman.net/download 下载最新
Worker.php和Autoloader.php - 把它们放在项目目录下(比如
vendor/workerman/),然后在入口文件中require进来 - 不要试图用
autoload.files在composer.json里注册它——Workerman 启动时需提前加载,时机不对会报Class 'Workerman\Worker' not found
长连接配置必须改 event-loop?
Workerman 默认用 PHP 的 stream_select 实现事件循环,它在 Linux 上支持连接数有限(通常 ≤1024),且对长连接的心跳、超时、断连检测不够精准。真要跑长连接(如 WebSocket、IM 推送),得切到更底层的扩展。
两种可靠方案:
- 装
ext-event(推荐):用 libevent 库,支持百万级连接,Worker::$eventLoopClass = 'Workerman\Events\Event'就生效 - 装
ext-libevent(兼容旧系统):功能类似但维护较弱,设置为Worker::$eventLoopClass = 'Workerman\Events\Libevent' - 不装扩展?那必须调低
Worker::$maxConnection并设短$worker->reloadable = false,否则 reload 时长连接会直接断
WebSocket 长连接怎么防假死和自动重连?
客户端网络抖动、NAT 超时、休眠唤醒都会让连接“看起来还活着”,实际已不可用。Workerman 不自动发 ping/pong,全靠你自己控制。
关键三件事:
- 服务端必须启用
onWebSocketConnect后立即设置$connection->pingInterval = 25(单位秒),否则默认不发心跳 - 客户端收到
ping必须回pong,否则 Workerman 30 秒后触发onClose;别依赖浏览器自动回,要手动监听message事件判断 -
$connection->close()不等于 TCP 断开,得配合$connection->destroy()彻底释放资源,否则连接残留导致Too many open files
为什么 reload 后长连接全断了?
Workerman 的 reload 是 fork 新进程 + 杀旧进程,旧进程里所有 socket 连接会被内核强制关闭。这不是 bug,是设计使然。想平滑续连,只能靠客户端主动重连 + 服务端状态重建。
实操要点:
- 客户端必须实现指数退避重连(如 1s → 2s → 4s),别用固定间隔,避免雪崩
- 服务端别把用户状态存在
Worker实例里(比如$worker->clients = []),reload 后就丢了;改用 Redis 或 MySQL 持久化 session 和在线状态 - 如果非要 reload 时不中断,得自己写信号处理 + 连接迁移逻辑,复杂度高,一般项目没必要碰
长连接最麻烦的从来不是启动,而是连接生命周期管理——超时判断、异常恢复、状态同步,这些都得自己补全,Workerman 只提供 socket 底层,不包办业务逻辑。










