美文网首页
laravel队列浅析

laravel队列浅析

作者: 云窗96 | 来源:发表于2018-08-08 17:38 被阅读0次
    laravel Queue

    原理:类似写一个死循环的脚本在Linux系统持续运行,新的队列任务push到这个脚本中。

    场景:一种是高并发的情况,一种是耗时的操作,可以将任务放到队列中去,消费者从队列取任务执行,当然还有失败的情况如何处理,以及延迟,重试,更复杂的情况还有优先级的实现。

    laravel队列

    本文讲的是浅析Laravel5中队列的配置

    Laravel默认支持以下几种队列服务:sync, database, beanstalkd, sqs, redis

    本文讲解的是database,redis队列

    数据库队列

    1.队列服务配置
    在配置文件queue.php的connections中已经默认定义了database的连接

    在.env环境配置文件中把默认的队列驱动改成database:

    QUEUE_DRIVER=database
    

    2.启动

    //DispatchesJobs trait
    // 1.生成迁移文件 
    php artisan queue:table
    php artisan migrate
    自动在数据库中创建了 jobs 表。
    
    // 2.创建任务类
    php artisan make:job  xxx
    生成 Jobs/xxx.php
    里面有__contruct()及handle(),handle()写队列执行的内容
    
    // 3.控制添加任务
    $this->dispatch(new xxx($para));
    任务不执行,放在jobs表中
    
    // 4.运行队列监听器(执行队列)
    php artisan queue:listen
    
    //在linux中,如果想让它在后台执行,可以这样:
     php artisan queue:listen &
    

    3.修改队列代码

    //需要重新重启队列
    php artisan queue:restart
    
    失败任务
    //生成失败迁移表
    php artisan queue:failed-table
    php artisan migrate
    //查看失败任务
    php artisan queue:failed
    //执行某个失败任务
    // retry id
    php artisan queue:retry id
    //全部 all
    php artisan queue:all
    //删除某个任务
    //forget id
    php artisan queue:forget id
    //删除所有任务
    php artisan queue:flush
    
    redis队列

    1.配置
    在.env环境配置文件中把默认的队列驱动改成redis:

    QUEUE_DRIVER=redis
    
    为了避免配置缓存的影响,执行以下命令清除并重建配置缓存:
    
    php artisan config:cache
    

    2.启动
    1.创建任务类
    php artisan make:job xxx 生成 Jobs/xxx.php
    里面有__contruct()及handle(),
    handle()写队列执行的内容

     public function __construct($key, $value)
     {
      $this->key = $key;
      $this->value = $value;
     }
    
     /**
      * Execute the job.
      *
      * @return void
      */
     public function handle()
     {
      Redis::hset('queue.test', $this->key, $this->value);
     }
    

    2.控制添加任务

    //在控制器中使用dispatch方法调用队列
    $this->dispatch(new xxx('key_'.str_random(4), str_random(10))));
    

    3.查看redis
    其中value内容如下,这是转换成json格式的,而实际上是经过序列号的字符串:

    {
     "job": "Illuminate\\Queue\\XXXQueuedHandler@XXX",
     "data": {
      "command": "O:14:\"App\\Jobs\\MyJob\":6:{s:19:\"\u0000App\\Jobs\\MyJob\u0000key\";i:1;s:21:\"\u0000App\\Jobs\\MyJob\u0000value\";i:2;s:10:\"connection\";N;s:5:\"queue\";N;s:5:\"delay\";N;s:6:\"\u0000*\u0000job\";N;}"
     },
     "id": "EV2bhqUlx0T8pRCVHw1qT0fkP8AQcyI8",
     "attempts": 1
    }
    

    这里data参数里包含了队列服务Job的名称,构造函数的参数等信息,消费者执行任务的依据。attempts表示重试的次数,往往执行队列任务失败了会重试,可以设置最多尝试次数。

    4.运行队列监听器(执行队列)

    php artisan queue:listen
    
    其他
    Queue::push('SendMail', array('message' => $message));
    Queue::push('SendEmail@send', array('message' => $message));
    

    下面是以上列出队列驱动需要安装的依赖:

    • Redis: predis/predis ~1.0
    • Amazon SQS: aws/aws-sdk-php ~3.0
    • Beanstalkd: pda/pheanstalk ~3.0
    • IronMQ: iron-io/iron_mq ~2.0

    正式环境通常搭配supervisord让队列长期监听

    supervisord.conf

    [program:laravel-worker]
    process_name=%(program_name)s_%(process_num)02d
    directory=/usr/local/nginx/html/xxx(项目目录)
    command=/usr/local/php/bin/php artisan queue:work --daemon --sleep=3 --tries=3
    
    autostart=true
    autorestart=true
    startretries=0
    numprocs=8  
    redirect_stderr=true
    stdout_logfile=/usr/local/nginx/html/xxx/worker.log
    

    参考地址:

    supervisord安装及配置

    https://www.load-page.com/manuals/web-server/chapter-tools/supervisor.html

    laravel队列

    https://laravel-china.org/docs/laravel/5.4/queues/1256

    相关文章

      网友评论

          本文标题:laravel队列浅析

          本文链接:https://www.haomeiwen.com/subject/zkvxbftx.html