laravel/Lumen队列

laravel队列

配置

  • 配置文件 config/queue.php 中添加代码

<?php

return [

    'default' => env('QUEUE_CONNECTION', 'sync'),

    'connections' => [

        'sync' => [

            'driver' => 'sync',

        ],

        'database' => [

            'driver' => 'database',

            'table' => env('QUEUE_TABLE', 'jobs'),

            'queue' => 'default',

            'retry_after' => 90,

        ],

        'beanstalkd' => [

            'driver' => 'beanstalkd',

            'host' => 'localhost',

            'queue' => 'default',

            'retry_after' => 90,

        ],

        'sqs' => [

            'driver' => 'sqs',

            'key' => env('SQS_KEY', 'your-public-key'),

            'secret' => env('SQS_SECRET', 'your-secret-key'),

            'prefix' => env('SQS_PREFIX', 'https://sqs.us-east-1.amazonaws.com/your-account-id'),

            'queue' => env('SQS_QUEUE', 'your-queue-name'),

            'region' => env('SQS_REGION', 'us-east-1'),

        ],

        'redis' => [

            'driver' => 'redis',

            'connection' => env('QUEUE_REDIS_CONNECTION', 'default'),

            'queue' => 'default',

            'retry_after' => 900,

            'block_for' => null,

        ],

    ],

    'failed' => [

        'database' => env('DB_CONNECTION', 'mysql'),

        'table' => env('QUEUE_FAILED_TABLE', 'failed_jobs'),

    ],

];

  • 配置文件 config/database.php 中redis部分如下
<?php

return [

    'default' => env('DB_CONNECTION', 'mysql'),

    'redis' => [

        'client' => 'predis',

        'cluster' => env('REDIS_CLUSTER', false),

        'default' => [
            'host' => env('LIANSHAN_REDIS_HOST', '127.0.0.1'),
            'password' => env('LIANSHAN_REDIS_PWD', null),
            'port' => env('LIANSHAN_REDIS_PROT', 6379),
            'database' => env('LIANSHAN_REDIS_DATABASE', 0),
        ],

        'cache' => [
            'host' => env('LIANSHAN_REDIS_HOST', '127.0.0.1'),
            'password' => env('LIANSHAN_REDIS_PWD', null),
            'port' => env('LIANSHAN_REDIS_PROT', 6379),
            'database' => env('LIANSHAN_CACHE_DB', 1),
        ],

    ],
];
  • .env文件中 QUEUE_CONNECTION=redis 有4种驱动选择,对应上步中的配置 默认是sync,即同步的,直接处理,无队列
  • 对应的mysql中有 jobs 与 failed_jobs 表,记录任务执行情况,对应配置文件的设置
迁移文件生成
jobs表
php artisan queue:table
失败任务表
php artisan queue:failed-table
  • 如果选择redis驱动,需要安装 predis 类库包,低版本 lumen 需要安装 illuminate/redis

使用


// 生产者

use App\Jobs\VideoReportJob;

dispatch((new VideoReportJob($param1, $param2))->onQueue('queue1'));



// 消费者

<?php

namespace App\Jobs;

class VideoReportJob extends Job

{

    protected $param1;

    protected $param2;

    public $timeout = 300;

    public $tries = 1; // 最多尝试执行次数

    /**

    * Create a new job instance.

    *

    * @return void

    */

    public function __construct($param1, $param2)

    {

        $this->param1 = $param1;

        $this->param2 = $param2;

    }

    /**

    * Execute the job.

    *

    * @return void

    */

    public function handle()

    {

        // 耗时的任务内容

        sleep(50);

    }

    public function failed()

    {

        // 任务执行失败,超时,代码报错拦截处理

    }

}

// 启动队列

php artisan queue:work --queue=queue1

执行失败的任务会在 config/queue.php 中配置的表中记录 默认是 failed_jobs 表

超时配置

config/queue.php 中的 retry_after ,该配置项的目的是定义任务在执行以后多少秒后释放回队列。如果retry_after设定的值为90, 任务在运行90秒后还未完成,那么将被释放回队列而不是删除掉,将会再次执行

消费者中的 timeout 控制队列进程执行每个任务的最长时间,如果超时,该进程将被关闭

配置项retry_after 和 Aritisan 参数项--timeout不同,但目的都是为了确保任务的安全,并且只被成功的执行一次。参数项--timeout的值应该是中小于配置项retry_after的值,这是为了确保队列进程总在任务重试以前关闭。如果--timeout比retry_after大,则你的任务可能被执行两次。

例如比如说你把 retry_after 设置为 20,好,假设现在有一个 job 它需要耗费 15 到 25 秒不等的时间来完成,假设处理 job 的那个程序在处理到第 20 秒还没完成时,它就不继续处理了,把这个 job 放回任务队列中,然后再尝试处理(retry),这次运气好,它处理到 17 秒就完成了,那就完事了,接着处理下一个 job

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,063评论 6 510
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,805评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,403评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,110评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,130评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,877评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,533评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,429评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,947评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,078评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,204评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,894评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,546评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,086评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,195评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,519评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,198评论 2 357

推荐阅读更多精彩内容