安装predis
composer require "predis/predis:^1.1"接下来我们还需要修改环境变量 QUEUE_DRIVER 的值为 redis:
.env
QUEUE_DRIVER=redis
有时候队列中的任务会失败。
Laravel 内置了一个方便的方式来指定任务重试的最大次数。
当任务超出这个重试次数后,它就会被插入到 failed_jobs 数据表里面。
使用 queue:failed-table 命令来创建 failed_jobs 表的迁移文件:
php artisan queue:failed-table
接着使用 migrate Artisan 命令生成 failed_jobs 表:
php artisan migrate
使用以下 Artisan 命令来生成一个新的队列任务:
php artisan make:job QueueTest
该命令会在 app/Jobs 目录下生成一个新的类:
app/Jobs/QueueTest.php
编写队列处理
调用 (在model层)
$data = ['uid' => 1]; $job = (new QueueTest($data, 1))->onQueue('QueueTest'); dd($this->dispatch($job)); QUEUE_DRIVER=sync先改为同步 测试一个程序有没有问题
执行完毕,没有问题 数据库 isdel 字段已改变
改为redis 测试延时队列
$data = ['uid' => 1]; #延迟2分钟执行 指定队列QueueTest执行 $job = (new QueueTest($data, 1))->delay(now()->addMinutes(2))->onQueue('QueueTest'); dd($this->dispatch($job));打开一个窗口开始监听
Redis 中新增一个key
里面的score储存的是命令执行的时间
2分钟后
查看一下数据库,已经修改了
使用redis驱动来 异步队列完成!
遇到一个问题
使用 dispatch($job); 队列并没有执行
当在控制器中使用$this->dispatch($job); 可以执行
但是在模型层中使用$this->dispatch($job); 并没有执行
想要在模型层中使用 $this->dispatch($job); 还需要
use DispatchesJobs;但是在官方文档中 并没有这样调用 都是 dispatch($job);
我的laravel版本是5.5 如果谁知道什么原因 可以告诉我 谢谢。
d ispatch($job) didispatch($job)spatch($job)
$data = ['uid' => 1];$job = (new QueueTest($data, 1))->delay(now()->addMinutes(2))->onQueue('QueueTest');dd(dispatch($job));