Laravel队列的用法

laravel队列 可分为【同步队列】和【延时队列】两种
一,默认QUEUE_DRIVER=sync 是同步的,使用delay延时队列不能使用同步的,否则不起作用。
要想使用延时队列必须把 QUEUE_DRIVER设置成 redis 或者 datebase 延迟才起作用

二,一般什么情况下会用到延迟队列呢?举个栗子(商城用户生成订单后没有付款三十分钟后取消订单,这个时候用延时队列来处理岂不快哉,或者群发邮件短信等一些耗时的操作时就需要用到延时队列,这样就可以减轻服务器的压力,减少等待时间)

三,创建任务类

php artisan make:job  SendReminderEmail

执行上面命令生成 Jobs/SendReminderEmail.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('[email protected]');
        dd($res);
    }

Laravel队列的用法_第1张图片

五,延时队列的用法
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('[email protected]')->delay(3);
        dd($res);
    }

3,查看监听,访问路由三秒钟后会出现下图结果在这里插入图片描述
六,队列不仅可以延迟执行,而且还可以设置执行的时间和执行失败的次数


namespace App\Jobs;
class SendReminderEmail implements ShouldQueue
{
    /**
     * 任务最大尝试次数。
     * @var int
     */
    public $tries = 5;
    /**
     * 任务执行的最大秒数。
     * @var int
     */
    public $timeout = 30;
}

创作不易您的支持就是我最大的动力

你可能感兴趣的:(Lavarel,队列,php)