在开发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' => '创建队列表',