#### 引入包
~~~
composer require "predis/predis:~1.0"
~~~
#### 配置队列驱动
这些驱动包括:数据库,Beanstalkd,Amazon SQS,Redis,和一个同步(本地使用)的驱动。还有一个名为 null 的驱动表明不使用队列任务。
~~~
QUEUE_DRIVER=redis
~~~
#### 使用Database作为驱动
使用database作为驱动的时候要创建jobs表,通过以下命令
~~~
php artisan queue:table
~~~
#### 创建失败任务表
有时候队列中的任务会失败。Laravel 内置了一个方便的方式来指定任务重试的最大次数。当任务超出这个重试次数后,它就会被插入到 failed_jobs 数据表里面。我们可以使用 queue:failed-table 命令来创建 failed_jobs 表的迁移文件:
~~~
php artisan queue:failed-table
~~~
生成迁移文件
~~~
php artisan migrate
~~~
#### 创建任务类
~~~
php artisan make:job TestJob
~~~
会在app/Jobs目录下生成任务类.该类实现了 Illuminate\Contracts\Queue\ShouldQueue 接口,该接口表明 Laravel 应该将该任务添加到后台的任务队列中,而不是同步执行。
引入了 SerializesModels trait,Eloquent 模型会被优雅的序列化和反序列化。队列任务构造器中接收了 Eloquent 模型,将会只序列化模型的 ID。这样子在任务执行时,队列系统会从数据库中自动的根据 ID 检索出模型实例。这样可以避免序列化完整的模型可能在队列中出现的问题。
handle 方法会在队列任务执行时被调用。值得注意的是,我们可以在任务的 handle 方法中可以使用类型提示来进行依赖的注入。Laravel 的服务容器会自动的将这些依赖注入进去,与控制器方法类似。
还有一点需要注意,我们将会在模型监控器中分发任务,任务中要避免使用 Eloquent 模型接口调用,如:create(), update(), save() 等操作。否则会陷入调用死循环 —— 模型监控器分发任务,任务触发模型监控器,模型监控器再次分发任务,任务再次触发模型监控器.... 死循环。在这种情况下,使用 DB 类直接对数据库进行操作即可。
#### 任务分发
~~~
dispatch(new TestJob()) //这里是进行任务分发,只分发任务,并不立刻执行
~~~
#### 测试
~~~
php artisan queue:work //此命令启动消息队列系统,并进行监听
~~~
#### 注意
在使用database作为驱动的时候,如果任务分发了,没有执行成功,laravel会不断的重试任务.需要把任务清空.
