当前位置: 首页 > 文档资料 > ZTBCMS 中文文档 >

3.15 Queue

优质
小牛编辑
133浏览
2023-12-01

任务队列

任务队列适用后台长时间,批量、异步执行任务,如邮件、短信发送,每日生成报表等。

使用

1.创建任务

要点:继承 Queue\Libs\Job 并实现handle()方法

use Queue\Libs\Job;

class UpdateJob extends Job {

    //定义 你的Job数据  
    //注意:必须为public,否则不保存该数据!
    public $userid;
    public $username;

    //利用初始化函数导入数据
    public function __construct($userid, $username) {
        $this->userid = $userid;
        $this->username = $username;
    }

    //实现handle()
    public function handle() {
        //your code
    }
}

2.把任务推送到指定队列中

$job = new UpdateJob(time(), 'ztbcms');

$queue = Queue::getInstance();
$result = $queue->push('high', $job);//注: high即为队列名

//或者延迟小时执行
$result = $queue->push('high', $job, 1*60*60);//注: 第三个参数即为延迟执行时长,单位:秒

部署

1.简单部署,本地测试时可以选择这种方式

1.1. 启动队列

$ php index.php /queue/worker/run/queue/high,mid,low

上述命令监听了3个名为high,mid,low的队列。路由解析方式跟TP重写URL原理一样,/queue/worker/run分别对应Module,Controller,Action,后面则是key-value的 参数

1.2. 平滑停止

即运行完当前的任务就退出当前队列

$ php index.php /queue/worker/stop

3. 更稳定,多进程部署

使用进程管理软件进行配置。如:supervisor, PM2

最佳实践

0.根据业务调整配置

Queue/Confi/config.php:

return array(
    'QUEUE_SLEEP' => 3,//队列空闲时,休眠时间
    'QUEUE_MAX_RETRY' => 3, //最大重试次数
);

若日常队列任务不多,QUEUE_SLEEP可以适当延长

1.定期删除已完成任务

安装[计划任务模块],添加计划任务Queue\DeleteFinishJob,推荐每日执行一次,每次删除7日前的已完成的任务。当然,可以根据你的业务逻辑调整其执行频率。

class DeleteFinishJob extends Cron {

    public function run($cronId) {
        $hour = 7 * 24; //删除X小时前已完成的任务,你可以
        //....
    }
}