laravel 任务队列_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安装及配置

laravel队列

你可能感兴趣的:(laravel,任务队列)