当前位置: 首页 > news >正文

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

useWorkerman\Worker;

useWorkerman\Timer;

require_once__DIR__ .'/vendor/autoload.php';

$worker=newWorker();

// Worker 进程启动时注册定时任务

$worker->onWorkerStart =function($worker) {

// 启动一个每秒执行的定时任务

$timerId= Timer::add(1,function() {

echo"Running task at ".date('Y-m-d H:i:s') ."\n";

});

// 保存定时器 ID(用于后续操作)

$worker->timerId =$timerId;

};

Worker::runAll();

2. 停止定时任务

通过 Timer::del() 方法停止指定定时器。

代码示例

1

2

3

4

5

6

7

8

9

10

11

12

13

14

// 停止单个定时任务

$timerId= Timer::add(2,function() {/* ... */});

Timer::del($timerId);

// 停止所有定时任务

Timer::delAll();// 慎用!会停止当前进程所有定时器

动态停止示例

$worker->onMessage =function($connection,$data)use($worker) {

// 收到特定指令时停止定时任务

if($data==='stop') {

Timer::del($worker->timerId);

$connection->send("定时任务已停止");

}

};

3. 重启定时任务

重启需要先停止旧任务,再重新注册新任务。

代码示例

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

// 假设 $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 控制:

1

2

3

4

5

$worker->onWorkerStart =function($worker) {

if($worker->id === 0) {// 仅第一个进程执行

Timer::add(1,function() {/* ... */});

}

};

分布式部署:多台服务器时,使用 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

$httpWorker=newWorker('http://0.0.0.0:8080');

$httpWorker->onMessage =function($connection,$request) {

$action=$request->get('action');

switch($action) {

case'start':

$timerId= Timer::add(1,function() {/* ... */});

$connection->send("定时任务 ID: $timerId");

break;

case'stop':

$timerId=$request->get('timer_id');

Timer::del($timerId);

$connection->send("已停止任务");

break;

}

};

示例:通过信号控制

1

2

3

4

5

6

// 注册自定义信号

Worker::$onMasterReload=function() {

// 收到 SIGUSR1 信号时重启某个任务

Timer::del($oldTimerId);

$newTimerId= Timer::add(3,function() {/* ... */});

};

7. 注意事项

持久化存储:定时器 ID 保存在内存中,进程重启后会丢失,需外部存储(如 Redis)记录关键任务状态。原子操作:多进程操作时,使用锁机制避免竞争条件。

http://www.jsqmd.com/news/589887/

相关文章:

  • 从“冷肿瘤”到“热肿瘤”:CAF亚型如何影响免疫治疗疗效?给临床医生的解读
  • 优质!2026年4月评价好的马路护栏厂家推荐,机非护栏/道路护栏/马路护栏/绿化护栏/护栏,马路护栏源头厂家推荐 - 品牌推荐师
  • OpenClaw安全防护指南:Qwen3-4B-Thinking模型权限管控方案
  • OpenClaw+Qwen3.5-9B自动化办公:会议纪要生成与重点提取
  • Linux系统下VMware虚拟机磁盘空间扩展实战:从40G到60G的详细步骤
  • PHP中内存溢出问题的分析与解决详解
  • OpenClaw成本优化方案:千问3.5-9B本地部署省下90%API费用
  • 2026年排名前五的GEO搜索/GEO搜索优化服务型公司推荐 - 品牌宣传支持者
  • OpenClaw极简配置:Qwen3.5-9B-AWQ-4bit快速体验方案
  • 策略路由选路进阶:用MQC实现双ISP链路智能负载均衡(附ENSP实验包)
  • 2026年知名的抽水蓄能电站沥青搅拌站/西安便捷式沥青搅拌站/便捷式沥青搅拌站源头厂家推荐 - 品牌宣传支持者
  • 2026年口碑好的垃圾渗滤液/湿垃圾渗滤液/餐厨渗滤液实力厂家推荐 - 品牌宣传支持者
  • 从Deb包到启动盘:手把手教你定制Orange Pi 3B的Debian系统镜像
  • ModelScope API 新手必看:从申请Key到调用Qwen3-32B模型的完整流程
  • OpenClaw技能组合:千问3.5-35B-A3B-FP8驱动的自动化工作流设计
  • 别再只算NDVI了!深入解读FVC:用ArcGIS的栅格计算器玩转植被覆盖度
  • Linux内存管理:malloc/free实现原理与优化
  • STM32CubeMX配置TB6612驱动编码器电机:从PWM生成到测速全流程
  • OpenClaw会议小助手:Qwen3.5-9B实时转录与待办项提取
  • PHP调用Workerman5.0实现一对一聊天
  • 2026年比较好的母猪饲料/四川母猪饲料/常规鱼饲料销售厂家推荐 - 品牌宣传支持者
  • OpenClaw数据整理:Qwen3.5-9B支持的Excel自动化处理
  • 别再折腾API了!用Cloudflare AI Gateway免费中转Google Gemini,5分钟搞定LobeChat配置
  • PHP使用互斥锁确保代码的线程安全的操作示例
  • 不用编程!用555定时器制作超简单呼吸灯(完整电路图+元件清单)
  • 跨境电商运营避坑指南:如何用IPIDEA动态长效ISP代理给每个店铺配‘独立IP身份证’
  • 2026年口碑好的垃圾站气浮/焚烧厂气浮厂家精选 - 品牌宣传支持者
  • OpenClaw+百川2-13B-4bits量化模型:个人知识管理自动化方案
  • Golang与AWS SDK Go V2实战:构建高效云存储解决方案
  • OpenClaw多任务队列:Qwen3.5-9B并行处理图片批分析