数据库 - Model 前置说明
官方开源项目 抓取代理IP

介绍

很多时候在实际开发中我们都需要启动一些定时任务,来处理定时业务,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基类还提供了三个公共方法。

get_rule()

用途:获取当前定时任务的挂载规则。
依赖类:\x\Crontab
方法名:get_rule()

参数:无

返回值:

[
    'rule' => '', // 时间
    'use' => '', //任务对应的命名空间地址
    'status' => '', // 是否启用任务
    'bin_log' => '', // 是否记录任务执行日志
]

get_server()

用途:获取Swoole-Server服务实例。某些服务下,可以调用swoole的push()进行定时推送之类的业务
依赖类:\x\Crontab
方法名:get_server()

参数:无

返回值:Swoole/Server 实例

get_timer_id()

用途:获取当前定时任务在Swoole中的ID。可以结合Swoole的Timer::clear进行定时器停止操作
依赖类:\x\Crontab
方法名:get_timer_id()

参数:无

返回值:定时器的 ID

SW-X

企业级 - 高性能 PHP 框架

最后更新:3年前 . 作者-小黄牛

本篇目录