Laravel5.7 队列使用Redis驱动
安装redis扩展
用pecl安装php redis扩展
sudo pecl install redis
安装predis/predis包
用composer安装predis/predis扩展
composer require predis/predis
修改配置文件 config/database.php
修改为自己的redis服务对应的配置(我这里使用的是默认的配置)
'redis' => [
'client' => 'predis',
'default' => [
'host' => env('REDIS_HOST', '127.0.0.1'),
'password' => env('REDIS_PASSWORD', null),
'port' => env('REDIS_PORT', 6379),
'database' => env('REDIS_DB', 0),
],
]
修改配置文件 config/queue.php
queue默认default修改为{default}(注:一定要修改 否则onQueue()分发任务到指定队列无法使用)
'redis' => [
'driver' => 'redis',
'connection' => 'default',
'queue' => '{default}',
'retry_after' => 90,
'block_for' => null,
],
将队列驱动改为redis修改.env
QUEUE_CONNECTION=redis
创建任务
1.生成任务类
在你的应用程序中,队列的任务类都默认放在 app/Jobs 目录下。如果这个目录不存在,那当你运行 make:job Artisan 命令时目录就会被自动创建。你可以用以下的 Artisan 命令来生成一个新的队列任务:
php artisan make:job ApiBehavior
2.任务类结构
任务类的结构很简单,一般来说只会包含一个让队列用来调用此任务的 handle 方法。我们来看一个示例的任务类。
<?php
namespace App\Jobs;
use App\BehaviorLog;
use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Support\Facades\DB;
class ApiBehavior implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
protected $data;
/**
* Create a new job instance.
*
* @return void
*/
public function __construct(array $data)
{
//
$this->data = $data;
}
/**
* Execute the job.
*
* @return void
*/
public function handle()
{
DB::table('behavior_log')->insert(['appid'=>$this->data['appid']]);
}
}
任务调用
1.在需要执行队列的地方:
// 这个任务将被分发到默认队列...
ApiBehavior::dispatch($data);
//这个任务将被发送到「behavior」队列..
ApiBehavior::dispatch($data)->onQueue('behavior');
2.运行队列处理器
Laravel 包含了一个队列处理器以将推送到队列中的任务执行。你可以使用 queue:work Artisan 命令运行处理器。 注意一旦 queue:work 命令开始执行,它会一直运行直到它被手动停止或终端被关闭。
php artisan queue:work
然后执行代码可以看到终端显示:
Sakura@My-MacBook ~/points master ● php artisan queue:work
[2019-04-12 08:17:53][akR1aOCOIbCNhXZWHWeKAgOXczXxpUX6] Processing: App\Jobs\ApiBehavior
[2019-04-12 08:17:53][akR1aOCOIbCNhXZWHWeKAgOXczXxpUX6] Processed: App\Jobs\ApiBehavior
3.指定连接 & 队列
处理器应该使用哪个队列连接。 传递给 work 的连接名应该与你的 config/queue.php 配置文件中定义的连接之一相符。
//指定链接
php artisan queue:work redis
//连接中指定的队列 (如果php artisan queue:work监听默认队列 如果自定队列需要指定队列--queue='队列名称')
php artisan queue:work redis --queue=behavior
处理失败的任务
有时你的队列任务会失败。别担心,凡事无完美! Laravel 包含了一个便捷的方式指定任务会被最大尝试的次数。在一个任务达到了它最大尝试次数后,它会被放入 failed_jobs 表。要创建 failed_jobs 表你可以使用 queue:failed-table 命令:
php artisan queue:failed-table
php artisan migrate
然后,运行你的 队列处理器 ,你应该在 queue:work 命令上使用 --tries 选项。如果你没有指定 --tries 的值,任务将会被无限次尝试。
php artisan queue:work --tries=3