黑马CMS内容管理系统

首页 > 动态

黑马CMS队列:后台处理任务的强大工具

来源:原创    2022-01-21 01:11:46   编辑:管理员   浏览:320

在开发Web应用程序时,我们经常遇到需要执行耗时操作的情况,例如发送电子邮件、大文件导出、生成报告或进行大量数据处理。如果这些操作在用户请求时立即执行,将会严重影响应用程序的性能和用户体验。为了解决这个问题,经过多日来的研发,黑马CMS终于开发出了 队列 这一功能强大的工具。

队列的基本概念

队列是一种将任务组织成队列以按顺序处理的技术。在黑马CMS中,这些任务被表示为类,通过将任务推送到队列中,我们可以将耗时的操作放到后台处理,而不会阻塞用户的请求。


黑马CMS队列的使用方法:

一、配置队列

要使用黑马CMS队列,首先需保证 黑马CMS版本为V5.1及以上版本,然后配置队列驱动类型。黑马CMS目前支持 database 和 redis 两种驱动类型。在/common/config/config.php文件中,您可以根据需求指定要使用的队列参数。

//队列配置
'queue_connection'   => 'database',      //队列驱动类型,支持 database 和 redis
'queue_name'         => 'default',       //队列名称

二、创建表

如果是 database 类型,则必须创建,如果是redis类型,可不创建,但也推荐创建,因为当队列执行失败时,黑马CMS会把执行失败的队列信息存入到数据库表中,方便查看日志及再次执行。

php yzm queue table

三、创建队列任务

每个队列任务都是一个类。您可以使用 php yzm make job 命令生成一个新的队列任务类。例如,要创建一个发送电子邮件的队列任务,可以运行以下命令:

php yzm make job sendemail_job

这将在 /jobs 目录下创建一个名为 sendemail_job.class.php 的新文件。在这个文件中,您需要在 handle 方法中定义任务的逻辑,例如:

<?php
defined('IN_YZMPHP') or exit('Access Denied'); 

class sendemail_job{

    private $params;

    public function __construct($params = []) {
        $this->params = $params;
    }

    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle() {
        $email = new SampleEmail($this->params);  
        Mail::to($this->params['email'])->send($email);  
    }
}

四、启动队列监听器

php yzm queue work

五、将一个任务添加到队列中

要执行队列任务,需要将其推送到队列中。您可以使用 dispatch 方法将任务推送到队列中。例如:

/**
 * 下发任务
 * @param  string $job    队列任务类名称
 * @param  array  $params 传入的参数,可选
 * @param  string $queue  队列名称,可选
 * @return string|false         任务id
 */
$res = dispatch('sendemail_job', ['email'=>'HMCMS@163.com'], 'default');
P($res);

这将在后台处理队列任务,而不会阻塞您的应用程序。您可以在控制器、事件监听器或其他适当的位置调用dispatch方法来推送任务。

六、黑马CMS队列命令详情

'php yzm queue work' => '启动队列工作',
                -queue=test,指定队列名称
                -sleep=5,指定连续的任务之间休眠的秒数
                -timeout=30,指定队列任务可以运行的最大秒数
                -tries=1,指定队列任务失败之前可以尝试的最大次数
                -once=1,只处理一个任务,当任务完成后,工作器将自动退出

'php yzm queue lists' => '查看队列列表,-queue=test,查看指定队列(可选)',
'php yzm queue restart' => '重启队列工作',
'php yzm queue failed' => '查看所有失败的任务',
'php yzm queue retry' => '重试失败任务,需指定一个任务ID(如 queue retry -id=xxxxx)',
'php yzm queue delete' => '删除单个失败任务,需指定一个任务ID(如 queue delete -id=xxxxx)',
'php yzm queue flush' => '删除所有失败任务',
'php yzm queue table' => '创建队列表',