workerman 启动时报“worker count can not be empty”错误,是因为 worker 实例的 count 属性未被显式赋值为大于 0 的整数,而 workerman 在 runall() 前强制校验该值必须为正整数,不接受 null、字符串、0 或负数。

Worker count can not be empty 这个错误不是 PHP 报的 Warning 或 Notice,而是 Workerman 自己在启动前做的硬性校验——$worker->count 没被显式赋值,就直接调用 Worker::runAll() 了。
为什么没设 count 就报错?
Workerman 要求每个 Worker 实例必须明确知道要 fork 几个子进程。它不会默认给 1 或 CPU 核数,因为“默认值”容易掩盖配置疏漏,尤其在多 Worker 场景下(比如同时启 HTTP + WebSocket + TCP),漏设一个就全挂。
常见触发点:
- 复制了示例代码但删掉了
$ws_worker->count = 4;这行 - 把
count写在了onWorkerStart里(太晚了,校验早过了) - 用变量赋值但变量为空,比如
$worker->count = $_ENV['WORKER_COUNT'] ?? null;,而环境变量根本没配
怎么快速定位是哪个 Worker 没设 count?
错误信息不带类名或文件行号,但你可以:
- 全局搜索
new Worker(,挨个检查后面有没有->count = - 在所有
Worker实例创建后、Worker::runAll()前加一行var_dump($worker->count);,看哪个输出null或0 - 如果用了配置驱动,确认
getenv('WORKER_COUNT')或config('worker.count')确实返回了整数(不是字符串"4",PHP 会当0处理)
count 设成 0 或负数也会报这个错
Workerman 对 count 的校验是:!is_int($count) || $count ,所以以下写法全无效:
-
$worker->count = 0;→ 错误 -
$worker->count = "4";→ 错误(字符串转 int 是 0) -
$worker->count = (int)$_GET['c'];→ 如果$_GET['c']不存在,结果是 0 -
$worker->count = getenv('COUNT'); // 返回 false 或 null→ 错误
安全写法是:
$count = (int)(getenv('WORKER_COUNT') ?: '1');
$worker->count = $count > 0 ? $count : 1;
宝塔面板部署时特别容易踩的坑
在宝塔里通过“PHP项目”或“网站”添加 Workerman 启动脚本,常因运行用户权限或环境变量缺失导致 getenv() 拿不到值,最终 count 为 null。
- 别依赖
.env文件——宝塔的 PHP-FPM 环境通常不加载它;改用putenv("WORKER_COUNT=4")在脚本开头硬编码或从文件读取 - 确认宝塔里设置的“运行目录”和启动脚本路径一致,否则
require失败,可能连count赋值那行都没执行到 - 日志里只看到这句错误,却找不到具体哪行,大概率是脚本根本没跑完——先
php start.php status看是否能识别进程,再查start.php是否有语法错误或致命 require 失败
真正麻烦的不是设多少,而是设完之后没人验证它生效了没。上线前用 ps aux | grep php | grep -v grep | wc -l 数一下真实进程数,比光看代码靠谱得多。











