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 命令!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; }创作不易您的支持就是我最大的动力