很多时候在实际开发中我们都需要启动一些定时任务,来处理定时业务,SW-X中提供了定时器统一加载的服务,
开发者只需要将定时任务创建在/box/crontab/
目录下,建议但不强制。
然后修改配置文件/config/crontab.php
。进行定时任务挂载。
该目录下的定时任务,会在onWorkerStart
事件中自动触发载入。
对于Swoole在多核CPU下会有多个Worker
进程,从而导致定时器重复执行的问题,开发者无需担心,框架只会在第一个Worker
进程中载入定时任务。
挂载某个定时器任务,需要修改/config/crontab.php
配置文件。
SW-X的定时任务支持Linux的Crontab风格,每个任务项的参数如下:
[
'rule' => '3 1 * * * *', // 时间
'use' => '\box\crontab\demo2', //任务对应的命名空间地址
'status' => false, // 是否启用任务
'bin_log' => false, // 是否记录任务执行日志
]
四个字段的详细说明:
rule :定时器规则,若为int类型则是自定义毫秒,字符串则为linux的crontab规则
use :定时器的命名空间地址
status :是否启用 true.开启 false.关闭 默认.true
bin_log :是否记录日志 true.开启 false.关闭 默认.false
Linux的Crontab规则详解,对应rule
字段:
秒 分 时 天 月 星期
* * * * * * 要执行的命令
- - - - - -
| | | | | |
| | | | | ----- 星期几 (0 - 7) (星期天=0 或者 7)
| | | | ------ 月份 (1 - 12)
| | | ------- 天数 (1 - 31)
| | -------- 小时 (0 - 23)
| --------- 分钟 (0 - 59)
----------- 秒 (0 - 59)
SW-X建议定时任务业务类统一存放在/box/crontab/
目录下,但不强制要求。
所有定时任务业务类,必须继承use x\Crontab;
系统基类。
所有定时任务业务类,都需要实现public function run(){}
方法。
假设,我们现在需要创建一个2分钟
执行一次的定时任务。
业务类命名为:HelloWord
,业务内容为输出hello word sw-x!
。
那么定时器的创建位置则应该是:/box/crontab/HelloWord.php
,代码如下:
namespace box\crontab;
use x\Crontab;
class HelloWord extends Crontab{
/**
* 统一入口
* @todo 无
* @author 小黄牛
* @version v2.5.0 + 2021.07.20
* @deprecated 暂不启用
* @global 无
* @return void
*/
public function run() {
echo "hello word sw-x!\n";
}
}
完成后,/config/crontab.php
配置文件,还需要挂载一条新的配置项:
[
'rule' => '* 2 * * * *',
'use' => '\box\crontab\HelloWord',
'status' => true,
'bin_log' => false,
]
为应对日常开发需要,\x\Crontab
基类还提供了三个公共方法。
用途:获取当前定时任务的挂载规则。
依赖类:\x\Crontab
方法名:get_rule()
参数:无
返回值:
[
'rule' => '', // 时间
'use' => '', //任务对应的命名空间地址
'status' => '', // 是否启用任务
'bin_log' => '', // 是否记录任务执行日志
]
用途:获取Swoole-Server服务实例。某些服务下,可以调用swoole的push()进行定时推送之类的业务。
依赖类:\x\Crontab
方法名:get_server()
参数:无
返回值:Swoole/Server 实例
用途:获取当前定时任务在Swoole中的ID。可以结合Swoole的Timer::clear进行定时器停止操作。
依赖类:\x\Crontab
方法名:get_timer_id()
参数:无
返回值:定时器的 ID