laravel5.5使用redis队列

首先laravel 安装了redis扩展

  composer require  predis/predis

在.env文件里修改了redis的服务配置(这里是默认配置)

REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379

1.配置

  1. 首先我们需要在配置文件中配置默认队列驱动为Redis。
    在.env文件里配置
 QUEUE_DRIVER=redis
  1. 修改配置文件 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);
}

转载自https://segmentfault.com/a/1190000015097364

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值