workerman 不依赖 composer,应直接下载源码并手动引入 autoloader.php;长连接需自行实现 worker 实例与 onconnect/onmessage/onclose 回调;composer 仅用于集成第三方组件,不参与主循环。

Workerman 不需要 Composer 安装
Workerman 是纯 PHP 编写的常驻内存框架,没有外部依赖,composer require 不是标准安装方式。直接下载源码或用 git clone 就能跑起来——强行走 Composer 流程反而容易引入 autoloader 冲突、版本错位或 vendor 路径加载失败。
常见错误现象:Class Workerman\Worker not found,本质是自动加载没配对,不是没装上。
- 用
git clone https://github.com/walkor/Workerman.git拉最新稳定版(别用dev-master) - 确保 PHP 版本 ≥ 7.2(Workerman 4.x 不支持 PHP 8.2+ 的某些 socket 行为,生产环境建议 PHP 7.4–8.1)
- 入口文件里手动
require核心类:require_once __DIR__ . '/Workerman/Autoloader.php';
长连接服务必须自己写 Worker 实例,不能靠 Composer 插件“一键生成”
Workerman 的长连接能力来自 Worker 类的底层 socket 监听 + 连接池管理,不是某个扩展包提供的功能。所谓“搭建长连接环境”,核心就是:监听 TCP/WebSocket 端口、维护连接生命周期、处理心跳与断线重连。
使用场景:IM、实时通知、设备上报。别指望 composer create-project 出来就能收发消息。
- WebSocket 长连接必须显式启用
Worker::$protocol = 'websocket',否则只是裸 TCP - 客户端连不上?先确认防火墙放行端口,再检查是否启用了
ssl://协议但没配证书路径 -
onConnect/onMessage/onClose三个回调缺一不可,漏掉onClose会导致连接泄漏
Composer 只在特定场景下有用:集成第三方协议或日志组件
如果你要用 amqp 做消息分发,或用 monolog 记录连接日志,这时才轮到 Composer 上场。但它只负责装这些辅助包,不参与 Workerman 主循环。
参数差异:Workerman 自身不读取 composer.json 中的 autoload 配置;你得手动把第三方类加进 Autoloader::addNamespace() 或用 require 引入。
- 装
monolog/monolog后,仍需在onMessage里手动调用$logger->info(),Workerman 不会自动打日志 - 用
php-amqplib/php-amqplib时注意:它默认阻塞 IO,必须配合Worker::forkWorkers()或投递到子进程,否则卡主线程 - 别在
onMessage里执行sleep()或同步 HTTP 请求,长连接会假死
调试阶段最容易忽略的两个点
一是 Worker::runAll() 必须放在脚本末尾,且不能有任何输出(包括 BOM、空格、echo),否则 WebSocket 握手失败;二是所有全局变量、静态属性在多进程下不共享,想存用户状态得用 Redis 或 pcntl_fork 外部存储。
性能影响:开 4 个 worker 进程比开 1 个吞吐高,但每个进程的内存独立,别在 onConnect 里加载大文件或初始化大对象。
- 启动命令必须带
-d参数:例如php start.php start -d,前台运行看不到错误,后台运行才真正 fork -
start.php文件权限要是可执行的,Windows 下也要用php start.php start,别双击运行










