• 任务队列
    • 使用
    • 部署
      • 1.简单部署,本地测试时可以选择这种方式
      • 2. 更安全的部署方式
      • 3. 更稳定,多进程部署
    • 最佳实践
      • 0.根据业务调整配置
      • 1.定期删除已完成任务

    任务队列

    version

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

    使用

    1.创建任务

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

    1. use Queue\Libs\Job;
    2. class UpdateJob extends Job {
    3. //定义 你的Job数据
    4. //注意:必须为public,否则不保存该数据!
    5. public $userid;
    6. public $username;
    7. //利用初始化函数导入数据
    8. public function __construct($userid, $username) {
    9. $this->userid = $userid;
    10. $this->username = $username;
    11. }
    12. //实现handle()
    13. public function handle() {
    14. //your code
    15. }
    16. }

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

    1. $job = new UpdateJob(time(), 'ztbcms');
    2. $queue = Queue::getInstance();
    3. $result = $queue->push('high', $job);//注: high即为队列名
    4. //或者延迟小时执行
    5. $result = $queue->push('high', $job, 1*60*60);//注: 第三个参数即为延迟执行时长,单位:秒

    部署

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

    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. 平滑停止

    1. $ php index.php /queue/worker/stop/_qsk/{你的私钥}

    2. 更安全的部署方式

    用于功能的实现基于Controller-Action,可能会被恶意请求URL,因此我们提供了私钥校验

    1.设置队列的私钥

    1. return array(
    2. 'QUEUE_SECRET_KEY' => 'ztbcms',//队列校验私钥
    3. );

    2.启动时带着私钥参数_qsk

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

    3. 更稳定,多进程部署

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

    最佳实践

    0.根据业务调整配置

    Queue/Confi/config.php:

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

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

    1.定期删除已完成任务

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

    1. class DeleteFinishJob extends Cron {
    2. public function run($cronId) {
    3. $hour = 7 * 24; //删除X小时前已完成的任务,你可以
    4. //....
    5. }
    6. }