php调用Workerman管理定时任务详解

张开发
2026/6/8 3:19:49 15 分钟阅读
php调用Workerman管理定时任务详解
在 Workerman 中管理定时任务启动、重启、停止需要结合 Timer 类和 Worker 进程的生命周期。以下是详细操作步骤1. 启动定时任务定时任务通常在 onWorkerStart 回调中注册Worker 进程启动后自动执行。代码示例12345678910111213141516171819useWorkerman\Worker;useWorkerman\Timer;require_once__DIR__ ./vendor/autoload.php;$workernewWorker();// Worker 进程启动时注册定时任务$worker-onWorkerStart function($worker) {// 启动一个每秒执行的定时任务$timerId Timer::add(1,function() {echoRunning task at .date(Y-m-d H:i:s) .\n;});// 保存定时器 ID用于后续操作$worker-timerId $timerId;};Worker::runAll();2. 停止定时任务通过 Timer::del() 方法停止指定定时器。代码示例1234567891011121314// 停止单个定时任务$timerId Timer::add(2,function() {/* ... */});Timer::del($timerId);// 停止所有定时任务Timer::delAll();// 慎用会停止当前进程所有定时器动态停止示例$worker-onMessage function($connection,$data)use($worker) {// 收到特定指令时停止定时任务if($datastop) {Timer::del($worker-timerId);$connection-send(定时任务已停止);}};3. 重启定时任务重启需要先停止旧任务再重新注册新任务。代码示例1234567891011121314151617181920// 假设 $oldTimerId 是已存在的定时器 ID$newTimerId Timer::add(5,function() {/* 新任务逻辑 */});Timer::del($oldTimerId);// 停止旧任务// 或通过闭包动态更新$worker-onWorkerStart function($worker) {$worker-timerId Timer::add(1,function()use($worker) {static$count 0;$count;echo执行次数: $count\n;// 达到条件后重启任务例如修改间隔时间if($count 5) {Timer::del($worker-timerId);$worker-timerId Timer::add(2,function() {echo重启后的任务\n;});}});};4. 多进程环境注意事项单例任务如果只需要一个进程运行定时任务在 onWorkerStart 中通过进程 ID 控制12345$worker-onWorkerStart function($worker) {if($worker-id 0) {// 仅第一个进程执行Timer::add(1,function() {/* ... */});}};分布式部署多台服务器时使用 Redis 锁或数据库标记确保任务唯一性。5. 通过命令行管理 WorkerWorkerman 的定时任务依赖于 Worker 进程因此可通过管理 Worker 间接控制定时任务操作命令说明启动php yourfile.php start启动 Worker 进程定时任务自动运行平滑重启php yourfile.php reload重新加载业务代码定时任务会重新初始化强制停止php yourfile.php stop停止所有 Worker 进程立即终止优雅停止php yourfile.php stop -g等待当前任务完成后再停止6. 动态控制定时任务高级结合 HTTP 接口或自定义信号动态管理示例通过 HTTP 接口控制12345678910111213141516$httpWorkernewWorker(http://0.0.0.0:8080);$httpWorker-onMessage function($connection,$request) {$action$request-get(action);switch($action) {casestart:$timerId Timer::add(1,function() {/* ... */});$connection-send(定时任务 ID: $timerId);break;casestop:$timerId$request-get(timer_id);Timer::del($timerId);$connection-send(已停止任务);break;}};示例通过信号控制123456// 注册自定义信号Worker::$onMasterReloadfunction() {// 收到 SIGUSR1 信号时重启某个任务Timer::del($oldTimerId);$newTimerId Timer::add(3,function() {/* ... */});};7. 注意事项持久化存储定时器 ID 保存在内存中进程重启后会丢失需外部存储如 Redis记录关键任务状态。原子操作多进程操作时使用锁机制避免竞争条件。

更多文章