首先laravel 安装了redis扩展
composer require predis/predis
在.env文件里修改了redis的服务配置(这里是默认配置)
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
1.配置
- 首先我们需要在配置文件中配置默认队列驱动为Redis。
在.env文件里配置
QUEUE_DRIVER=redis
- 修改配置文件 config/queue.php
queue默认default修改为{default}(注:一定要修改 否则onQueue()分发任务到指定队列无法使用)
'redis' => [
'driver' => 'redis',
'connection' => 'default',
'queue' => '{default}',
'retry_after' => 90,
'block_for' => null,
],
2.创建任务
通常,所有的任务类都保存在 app/Jobs 目录。laravel中 app/Jobs 不存在,在运行 Artisan 命令 make:job 的时候,它将会自动创建。
php artisan make:job SendReminderEmail
生成的类都实现了 Illuminate\Contracts\Queue\ShouldQueue 接口, 告诉 Laravel 将该任务推送到队列,而不是立即运行:
<?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;
use Illuminate\Support\Facades\Mail;
use PHPUnit\Framework\Exception;
class SendReminderEmail implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
/**
* Create a new job instance.
*
* @return void
*/
public function __construct()
{
//
}
/**
* Execute the job.
*
* @return void
*/
public function handle()
{
//业务逻辑,譬如 发邮件
}
}
任务类非常简单,通常只包含处理该任务的 handle 方法,在任务被处理的时候调用,注意我们可以在任务的 handle 方法中进行依赖注入。Laravel 服务容器会自动注入这些依赖。
创建好任务类后,就可以通过任务自身的 dispatch 方法将其分发到队列。dispatch 方法需要的唯一参数就是该任务的实例:
<?php
namespace App\Http\Controllers;
use App\Jobs\SendReminderEmail;
use App\Http\Controllers\Controller;
use Carbon\Carbon;
use Illuminate\Support\Facades\Mail;
class stmpController extends Controller
{
public function send()
{
// 这个任务将被分发到默认队列...
SendReminderEmail::dispatch();
//延时分发 SendReminderEmail::dispatch()->delay(now()->addMinutes(10));
//这个任务将被发送到「behavior」队列..
SendReminderEmail::dispatch()->onQueue('behavior');
}
}
为此控制器加路由route.php
Route::get('/stmp','stmpController@send');
访问一次路由就往redis的队列里放入了一个任务,然后通过下面的进程命令来消化队列里的任务
//默认队列 队列名称为 default
php artisan queue:work
//或者指定队列名称 队列名称为behavior
php artisan queue:work redis --queue=behavior
指定最大失败次数
php artisan queue:work --tries=3
处理失败的任务
有时你的队列任务会失败。别担心,凡事无完美! Laravel 包含了一个便捷的方式指定任务会被最大尝试的次数。在一个任务达到了它最大尝试次数后,它会被放入 failed_jobs 表。要创建 failed_jobs 表你可以使用 queue:failed-table 命令:
php artisan queue:failed-table
php artisan migrate
超时
php artisan queue:work --timeout=30
基于时间的尝试次数
除了定义在任务失败前的最大尝试次数外,还可以定义在指定时间内允许任务的最大尝试次数,这可以通过在任务类中添加 retryUntil 方法来实现:
/**
* Determine the time at which the job should timeout.
*
* @return \DateTime
*/
public function retryUntil()
{
return now()->addSeconds(5);
}