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