webman定时任务不执行的根本原因是进程未正确配置或crontab未在onworkerstart中注册。必须确保config/process.php声明进程类、类路径和命名空间准确无误,且new crontab()严格置于onworkerstart内;秒级表达式需6位,修改后须重启进程,热重载无效。

Webman定时任务不是靠“开启”某个开关来启动的,而是依赖自定义进程 + Crontab 实例注册来生效。没配对进程、没在 onWorkerStart 里 new Crontab,任务根本不会跑。
为什么定时任务不执行?检查 config/process.php 和进程类是否匹配
常见错误是只写了进程文件(如 app/process/Task.php),却忘了在 config/process.php 里声明它:
- 必须确保
config/process.php中有对应条目,例如:'task' => [ 'handler' => app\process\Task::class, ] - 进程类路径写错、命名空间拼错、类名大小写不一致,都会导致进程不启动,
Crontab自然不注册 -
count字段默认为 1,但如果你设成 0 或负数,该进程会被跳过 —— 这个值不会报错,只会静默失效
new Crontab() 必须放在 onWorkerStart 里,不能放错位置
Crontab 实例必须在 Worker 进程真正启动后注册,否则定时器无法绑定到事件循环。以下写法全是错的:
- 放在类属性初始化位置:
protected $crontab = new Crontab(...);→ 类还没实例化,new直接报错或被忽略 - 放在构造函数
__construct()里 → 此时 Worker 尚未启动,事件循环未就绪 - 放在其他方法里(比如
onMessage)且没被调用 → 任务永远不会注册
正确位置只有:
Webman 2.2.0版本强化了 TCP/UDP 服务支持,优化路由组管理,并增强异步任务处理能力。结合协程与连接池技术,Webman 能轻松应对高并发场景,适用于网站、接口服务、即时通讯、物联网及游戏开发,兼具高性能、灵活扩展与稳定可靠,是多场景 PHP 服务开发的理想选择。
public function onWorkerStart($worker) {
new Crontab('*/5 * * * * *', function () {
echo "每5秒执行\n";
});
}
秒级任务要加秒字段,Cron 表达式格式不能省略第6位
Webman 的 workerman/crontab 支持秒级调度,但表达式必须是 6 位(秒 分 时 日 月 周)。写成 5 位(如 */5 * * * *)会被当成“分钟级”,最小粒度变成 1 分钟。
- 每 3 秒执行:
*/3 * * * * * - 每天凌晨 2:00 执行(注意:这是 6 位里的“时=2”,不是第 5 位):
0 0 2 * * * - 误写成
0 0 2 * *(少一位)→ 解析失败,任务静默不注册,无任何错误提示
修改任务后必须重启进程,热重载不生效
Crontab 是在进程启动时一次性注册进事件循环的,代码改了、表达式变了、回调函数换了,都不会自动更新。你改完 app/process/Task.php 后:
- 必须执行
php webman restart(或stop && start) - 如果用
php webman start -d守护模式,直接改代码不重启,旧任务照跑,新逻辑完全不触发 - 开发阶段可加日志确认注册是否成功:
echo "Crontab registered at " . date('Y-m-d H:i:s') . "\n";放在onWorkerStart里,看控制台或日志是否有输出
动态任务管理(比如从数据库读配置、运行时增删)需要自己封装逻辑,原生 Crontab 不支持 —— 这一点容易被文档带偏,以为“配置即生效”。










