Workerman 5.0 移除全局 Worker 类,须用 use Workerman\Worker; 并改 public 回调+类型提示;信号处理变更需显式监听 SIGINT;第三方组件需升级至兼容版本。

Workerman 4.x 升级到 5.0 后 Worker::runAll() 报错 “Class Worker not found”
Workerman 5.0 彻底移除了全局 Worker 类,改用命名空间 Workerman\Worker。旧项目直接 require Workerman/Autoloader.php 后调用 Worker::runAll() 会失败,因为自动加载找不到裸名 Worker。
必须显式引入类并使用完整命名空间:
use Workerman\Worker; Worker::runAll();
- 所有
new Worker()、Worker::reload()、Worker::$pidFile等调用,都要加use Workerman\Worker;或写全名new \Workerman\Worker() - 如果用了
include 'Workerman/Autoloader.php';,它不再注册裸类名,只负责命名空间自动加载 - 第三方扩展(如
workerman-websocket)需确认已升级到兼容 5.0 的版本,否则可能仍尝试 new Worker()
旧项目里 onMessage/onConnect 回调不触发,但进程正常启动
Workerman 5.0 默认启用严格模式:所有回调方法必须声明为 public,且参数类型声明更严格(例如 ConnectionInterface $connection)。旧代码里用 protected function onMessage($connection, $data) 或没写类型提示,会导致回调被跳过,无报错、无声无息。
检查并修正回调定义方式:
use Workerman\Connection\TcpConnection;
// ✅ 正确写法(public + 类型提示)
public function onMessage(TcpConnection $connection, $data) { ... }
-
onConnect、onClose、onError同理,必须是public - 若用 PHP 8.0+,建议补全参数类型(
TcpConnection或WebSocketConnection),否则运行时可能因反射失败而静默忽略 - 旧项目若依赖
$connection->id,注意 5.0 中该属性已被移除,改用spl_object_id($connection)或自建映射表
迁移后 Worker::stopAll() 不生效,子进程卡住不退出
Workerman 5.0 改变了信号处理机制,默认仅响应 SIGTERM 和 SIGHUP,不再监听 SIGINT(Ctrl+C)。如果你在开发环境靠 php start.php start 启动后按 Ctrl+C,主进程退出,但子 Worker 进程可能残留。
确保优雅退出的三件事:
- 启动脚本中显式设置信号监听:
pcntl_signal(SIGINT, [$worker, 'stop']);($worker是你的 Worker 实例) - 避免在
onWorkerStart中阻塞循环或未设超时的 socket_connect(),这会让子进程无法响应 stop 指令 - 调用
Worker::stopAll()前,确认没有遗留pcntl_fork()或proc_open()子进程,它们不会被自动 kill
第三方组件(如 GatewayWorker、WebServer)还能不能直接用
不能直接用旧版。GatewayWorker 3.x / WebServer 1.x 基于 Workerman 4.x 的裸类设计,与 5.0 的命名空间和生命周期钩子不兼容。强行混用会导致 Class Gateway not found 或回调不注册。
目前只有官方维护的适配版本可用:
- GatewayWorker ≥ 4.0.0(对应 Workerman ≥ 5.0)
- WebServer ≥ 2.0.0
- 查看 composer.json 是否含
"workerman/workerman": "^5.0",而非"~4.0" - 如果项目深度定制了 GatewayWorker 的
BusinessWorker,注意其构造函数参数顺序和类型也已变更(例如新增EventLoopInterface参数)
最易被忽略的是 autoload 配置 —— 有些老项目手动写了 classmap 或 files 加载方式,要同步删掉对 Worker.php 等裸文件的硬引用,全部交由 Composer 的 PSR-4 自动加载接管。










