laravel队列浅析

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队列浅析)