php调用Workerman管理定时任务详解
在 Workerman 中管理定时任务(启动、重启、停止)需要结合 Timer 类和 Worker 进程的生命周期。以下是详细操作步骤:
1. 启动定时任务
定时任务通常在 onWorkerStart 回调中注册,Worker 进程启动后自动执行。
代码示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
2. 停止定时任务
通过 Timer::del() 方法停止指定定时器。
代码示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
3. 重启定时任务
重启需要先停止旧任务,再重新注册新任务。
代码示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
4. 多进程环境注意事项
单例任务:如果只需要一个进程运行定时任务,在 onWorkerStart 中通过进程 ID 控制:
1 2 3 4 5 |
|
分布式部署:多台服务器时,使用 Redis 锁或数据库标记确保任务唯一性。
5. 通过命令行管理 Worker
Workerman 的定时任务依赖于 Worker 进程,因此可通过管理 Worker 间接控制定时任务:
| 操作 | 命令 | 说明 |
|---|---|---|
| 启动 | php yourfile.php start | 启动 Worker 进程,定时任务自动运行 |
| 平滑重启 | php yourfile.php reload | 重新加载业务代码,定时任务会重新初始化 |
| 强制停止 | php yourfile.php stop | 停止所有 Worker 进程(立即终止) |
| 优雅停止 | php yourfile.php stop -g | 等待当前任务完成后再停止 |
6. 动态控制定时任务(高级)
结合 HTTP 接口或自定义信号动态管理:
示例:通过 HTTP 接口控制
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
示例:通过信号控制
1 2 3 4 5 6 |
|
7. 注意事项
持久化存储:定时器 ID 保存在内存中,进程重启后会丢失,需外部存储(如 Redis)记录关键任务状态。原子操作:多进程操作时,使用锁机制避免竞争条件。
