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