Workerman 5.0 中 Timer 类移入 WorkermanTimer 命名空间,旧代码需改用 use WorkermanTimer、全限定名 WorkermanTimer::add() 或临时别名;须确认 PHP ≥ 7.3 且重启进程生效。

Workerman 5.0 升级后,Timer 类从全局命名空间移入 WorkermanTimer 命名空间,旧代码中直接使用 Timer::add() 会报 Fatal error: Uncaught Error: Class 'Timer' not found,必须显式声明命名空间或使用全限定名才能通过解析。
确认当前版本与错误来源
运行 php start.php status 或查看 vendor/workerman/workerman/Worker.php 头部注释,确认已升级至 5.0.x;若报错信息含 Class 'Timer' not found 或 Call to undefined method Timer::add(),即为命名空间缺失所致。
【必须先确认 PHP 版本 ≥ 7.3】,否则即使修复命名空间,后续还会因 API 不兼容而崩溃。
三种代码修改方式
方法一:在使用 Timer 的文件顶部添加 use 声明(推荐)
在 start.php 或 onWorkerStart 所在文件开头加入:
use WorkermanTimer;
方法二:直接使用全限定类名(适合单点快速修复)
将原 Timer::add(1000, $callback) 改为 WorkermanTimer::add(1000, $callback);注意开头的反斜杠不可省略,否则仍会在当前命名空间下查找。
方法三:全局函数别名(仅限调试,禁止上生产)
在 composer autoload 后、Worker::runAll() 前插入:
class_alias('Workerman\Timer', 'Timer');
这能临时兼容旧写法,但掩盖了架构变更,后续升级可能失效。
批量替换操作路径
第一步:进入项目根目录
第二步:执行 shell 命令批量替换(Linux/macOS):
grep -r "Timer::" --include="*.php" . | grep -v "vendor/" && sed -i '' 's/Timer::/\Workerman\Timer::/g' $(grep -rl "Timer::" --include="*.php" . | grep -v "vendor/")
Windows 用户请改用 PowerShell 的 Get-ChildItem + ForEach-Object 替换,或用编辑器正则功能搜索 Timer::(?!(add|del|delAll)) 并替换为 WorkermanTimer::
第三步:检查所有定时器回调是否仍绑定有效上下文——命名空间修正后,若回调里用了 $this 且该对象已被销毁,Timer 仍会静默失败。
第四步:运行 php start.php restart 强制全部进程加载新类定义;reload 不足以触达命名空间变更,因为类加载发生在 Worker 初始化阶段,而非回调执行时。

















