Laravel中简单使用队列加快访问速度
- 2019 年 11 月 13 日
- 筆記
前言
- Laravel 队列服务为各种不同的后台队列提供了统一的 API
- 允许推迟耗时任务(例如发送邮件)的执行,从而大幅提高 web 请求速度
总而言之,队列就是在后台执行一些耗时的任务,从而让前台访问速度加快。比较典型的例子就是发邮件。特别是同一时间发送多个邮件时。
程序员啊,就是折腾的命啊!
步骤
迁移队列需要的表
才开始尝试使用队列,还是简单点,使用数据库就行。
修改配置文件:
在.env
文件里默认有:
QUEUE_CONNECTION=sync
,也即默认使用的是sync
驱动,我们这里改为database
【数据库】

运行迁移文件
php artisan queue:table

以上是队列所需数据表
php artisan queue:failed-table

以上是队列任务运行失败的记录表
多了两张表,好了,不用管了。

执行迁移文件
php artisan migrate

编写任务类
1、创建一个任务类
php artisan make:job SendSeo

数据库就多了两张表:

2、修改创建的任务类
app/Jobs/SendSeo.php
其中handle方法就是处理任务的具体逻辑操作。

public function handle() { Log::info('task executed!!!!'); }
这里就记录一条日志就行
如果有额外的参数需要填写,那么就在构造方法里面传入即可。

推送队列
我这里建立了一个测试控制器,TestController
,里面有个测试方法test
,Web路径是:http://127.0.0.1/test/test
你的是多少就是多少,我们这里就是为了触发队列
public function test() { $this->dispatch(new SendSeo()); }
访问,然后看数据库:

还没完,还要后台监听
php artisan queue:listen --tries=3

看样子,成功啦。我们去日志文件看一下:

莫问题。
然后看数据库:

数据库清空了,因为任务已经执行了。
解答下小白(以前的我)的问题:
1、必须要后台执行?也即php artisan queue:listen --tries=3
?
肯定的啊,都是后台的队列了,那肯定就是后台执行啊。所以,laravel完全不适合在虚拟机里面运行,无论从composer包的安装还是其他方面来说。
2、在Linux中,你通过ssh后台执行 php artisan queue:listen --tries=3
需要在后面加上一个&
也即:
php artisan queue:listen --tries=3 &
为什么?因为你不想你退出ssh,它就不后台执行了嘛?
附命令
附上一些常用命令
1、运行队列监听器
php artisan queue:listen
- 如果执行成功, jobs 中的数据表就没有数据了
- 如果执行失败,可以在日志中查看原因, 默认是 storage/logs/laravel-xxx.log
2、处理失败的任务
在任务失败时, 你可以选择 清除失败的任务或者 重新执行失败的任务
- 查看所有失败的任务, 会将所有失败的任务查询出来输出到命令行 php artisan queue:failed
3、重新执行失败任务
- 重新执行指定id失败的任务 php artisan queue:retry 1
此处的 1 失败任务表中的任务的 id, 表示重新执行指定id失败任务
- 重新执行所有的失败任务 php artisan queue:retry all
4、清除失败任务
- 清除指定id失败的任务 php artisan queue:forget 2
此处的 2 失败任务表中的任务的 id, 表示清除指定id失败任务
- 清除所有失败的任务 php artisan queue:flush