laravel队列 可分为【同步队列】和【延时队列】两种
一,默认QUEUE_DRIVER=sync 是同步的,使用delay延时队列不能使用同步的,否则不起作用。
要想使用延时队列必须把 QUEUE_DRIVER设置成 redis 或者 datebase 延迟才起作用
二,一般什么情况下会用到延迟队列呢?举个栗子(商城用户生成订单后没有付款三十分钟后取消订单,这个时候用延时队列来处理岂不快哉,或者群发邮件短信等一些耗时的操作时就需要用到延时队列,这样就可以减轻服务器的压力,减少等待时间)
三,创建任务类
php artisan make:job SendReminderEmail
执行上面命令生成 Jobs/SendReminderEmail.php文件
<?php
namespace App\Jobs;
use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
class SendReminderEmail implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
protected $mail;
public $tries = 5;
/**
* SendReminderEmail constructor.
* @param $mail
*/
public function __construct($mail)
{
$this->mail = $mail;
}
/**
* Execute the job.
* @return void
*/
public function handle()
{
echo $this->mail;
}
}
四,先来看一下时时队列
自己创建路由及方法并访问,把任务塞进队列,打印查看数据。
public function index()
{
$res = SendReminderEmail::dispatch('123@qq.com');
dd($res);
}
五,延时队列的用法
1,修改evn文件中
QUEUE_DRIVER=redis
每次修改代码都需要执行
php artisan queue:restart 命令!
然后再次执行
php artisan queue:work 命令!
这两个命令是重点哦!敲黑板划重点!! 不然你都找不出错误的原因
然后开启监听
执行 php artisan queue:listen 命令!
指定任务
php artisan queue:work --queue=change_user_chief
2,访问自己的路由及方法,将任务塞进队列;
我这里面设置的是将任务延迟3秒分发;
public function index()
{
$res = SendReminderEmail::dispatch('66666@qq.com')->delay(3);
dd($res);
}
3,查看监听,访问路由三秒钟后会出现下图结果
六,队列不仅可以延迟执行,而且还可以设置执行的时间和执行失败的次数
<?php
namespace App\Jobs;
class SendReminderEmail implements ShouldQueue
{
/**
* 任务最大尝试次数。
* @var int
*/
public $tries = 5;
/**
* 任务执行的最大秒数。
* @var int
*/
public $timeout = 30;
}
创作不易您的支持就是我最大的动力