在开发Web应用程序时,我们经常遇到需要执行耗时操作的情况,例如发送电子邮件、大文件导出、生成报告或进行大量数据处理。如果这些操作在用户请求时立即执行,将会严重影响应用程序的性能和用户体验。为了解决这个问题,经过多日来的研发,YzmCMS终于开发出了 队列 这一功能强大的工具。
队列是一种将任务组织成队列以按顺序处理的技术。在YzmCMS中,这些任务被表示为类,通过将任务推送到队列中,我们可以将耗时的操作放到后台处理,而不会阻塞用户的请求。
YzmCMS队列的使用方法:
要使用YzmCMS队列,首先需保证 YzmCMS版本为V7.1及以上版本,然后配置队列驱动类型。YzmCMS目前支持 database 和 redis 两种驱动类型。在/common/config/config.php文件中,您可以根据需求指定要使用的队列参数。
//队列配置 'queue_connection' => 'database', //队列驱动类型,支持 database 和 redis 'queue_name' => 'default', //队列名称
如果是 database 类型,则必须创建,如果是redis类型,可不创建,但也推荐创建,因为当队列执行失败时,YzmCMS会把执行失败的队列信息存入到数据库表中,方便查看日志及再次执行。
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'=>'yzmcms@qq.com'], 'default'); P($res);
这将在后台处理队列任务,而不会阻塞您的应用程序。您可以在控制器、事件监听器或其他适当的位置调用dispatch方法来推送任务。
'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' => '创建队列表',