浅析Laravel5中队列的配置及使用


Posted in PHP onAugust 04, 2016

前言

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

在Laravel 5中使用队列非常简单,并且失败处理,延迟,重试的方法都已经实现,下面简单尝试了一下Laravel的队列服务。

Laravel默认支持以下几种队列服务:sync, database, beanstalkd, sqs, redis,本例使用redis作为队列服务,需先配置好Redis服务。

1.队列服务配置

在配置文件queue.php的connections中已经默认定义了redis的连接:

'redis' => [
 'driver'  => 'redis',
 'connection' => 'default',
 'queue'  => 'default',
 'expire'  => 60,
],

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

QUEUE_DRIVER=redis

为了避免配置缓存的影响,执行以下命令清除并重建配置缓存:

php artisan config:cache

2.新建Queueable Jobs

使用命令:

php artisan make:job MyJob

新建一个名为MyJob的队列处理类,在App/Jobs目录下自动生成一个MyJob.php文件。

浅析Laravel5中队列的配置及使用

MyJob.php需要实现handle方法,用来具体执行队列任务,构造函数可以用来传递需要的参数,handle方法支持依赖注入。

这里handle方法随便写了一个,就是往一个list类型数据结构中存一个key-value数据,测试消费队列的时候有没有起作用,构造函数传两个参数就是keyvalue.

<?php

namespace App\Jobs;

use App\Jobs\Job;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Support\Facades\Redis;

class MyJob extends Job implements ShouldQueue
{
 use InteractsWithQueue, SerializesModels;

 private $key;
 private $value;

 /**
  * Create a new job instance.
  *
  * @return void
  */
 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);
 }

 public function failed()
 {
  dump('failed');
 }
}

在控制器中使用dispatch方法调用队列,将任务放入队列中,控制器中写个方法如public function test()new MyJob的构造函数传两个随机生成的字符串参数:

$queueId = $this->dispatch(new MyJob('key_'.str_random(4), str_random(10)));
dd($queueId);

配置并访问路由,可以多访问几次,然后到Redis中查看,会发现把队列存入了一个queue::queue:defaultList结构中:

浅析Laravel5中队列的配置及使用

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

{
 "job": "Illuminate\\Queue\\CallQueuedHandler@call",
 "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表示重试的次数,往往执行队列任务失败了会重试,可以设置最多尝试次数。

3.消费队列

这个时候任务只是入了队列,但并没有消费,执行:

php artisan queue:listen

这个命令,Laravel就开始消费队列。

浅析Laravel5中队列的配置及使用

可以看到这几个任务以此被消费,再去Redis看看有没有实现预期要达到的效果,每个任务往一个List类型的结构写入数据。

浅析Laravel5中队列的配置及使用

这证明队列任务消费成功。

总结

本文的内容到这就结束了,当然,还有更多Laravel队列的用法,可以请大家继续参考官方手册。希望本文的内容对大家学习Laravel有所帮助。

PHP 相关文章推荐
php mysql Errcode: 28 终极解决方法
Jul 01 PHP
PHP采集利器 Snoopy 试用心得
Jul 03 PHP
php删除页面记录 同时刷新页面 删除条件用GET方式获得
Jan 10 PHP
PHP版网站缓存加快打开速度的方法分享
Jun 03 PHP
一漂亮的PHP图片验证码实例
Mar 21 PHP
PHP类中的魔术方法(Magic Method)简明总结
Jul 08 PHP
php批量添加数据与批量更新数据的实现方法
Dec 16 PHP
PHP使用Face++接口开发微信公众平台人脸识别系统的方法
Apr 17 PHP
Ajax PHP JavaScript MySQL实现简易无刷新在线聊天室
Aug 17 PHP
利用 fsockopen() 函数开放端口扫描器的实例
Aug 19 PHP
Laravel框架生命周期与原理分析
Jun 12 PHP
phpquery中文手册
Mar 18 PHP
PHP中如何判断exec函数执行成功?
Aug 04 #PHP
详解Laravel视图间共享数据与视图Composer
Aug 04 #PHP
yii的入口文件index.php中为什么会有这两句
Aug 04 #PHP
Laravel最佳分割路由文件(routes.php)的方式
Aug 04 #PHP
基于Swoole实现PHP与websocket聊天室
Aug 03 #PHP
浅析php如何实现App常用的秒发功能
Aug 03 #PHP
php微信开发之带参数二维码的使用
Aug 03 #PHP
You might like
PHP中把错误日志保存在系统日志中(Windows系统)
2015/06/23 PHP
php+redis实现多台服务器内网存储session并读取示例
2017/01/12 PHP
详细解读php的命名空间(二)
2018/02/21 PHP
很可爱的输入框
2008/08/03 Javascript
JavaScript入门教程(2) JS基础知识
2009/01/31 Javascript
javascript下数值型比较难点说明
2010/06/07 Javascript
js事件监听机制(事件捕获)总结
2014/08/08 Javascript
JavaScript日期时间与时间戳的转换函数分享
2015/01/31 Javascript
JavaScript中Number.MIN_VALUE属性的使用示例
2015/06/04 Javascript
详解JavaScript的Polymer框架中的通知交互
2015/07/29 Javascript
Vue监听数组变化源码解析
2017/03/09 Javascript
浅谈Vue Element中Select下拉框选取值的问题
2018/03/01 Javascript
学习JS中的DOM节点以及操作
2018/04/30 Javascript
利用Promise自定义一个GET请求的函数示例代码
2019/03/20 Javascript
vue组件创建的三种方式小结
2020/02/03 Javascript
Vue实现PC端靠边悬浮球的代码
2020/05/09 Javascript
[01:05:40]VG vs Newbee 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
python检测远程udp端口是否打开的方法
2015/03/14 Python
如何高效使用Python字典的方法详解
2017/08/31 Python
Python判断两个list是否是父子集关系的实例
2018/05/04 Python
python用post访问restful服务接口的方法
2018/12/07 Python
基于python历史天气采集的分析
2019/02/14 Python
python实现简单日期工具类
2019/04/24 Python
Python 实现微信防撤回功能
2019/04/29 Python
在Python 的线程中运行协程的方法
2020/02/24 Python
使用卷积神经网络(CNN)做人脸识别的示例代码
2020/03/27 Python
用CSS3实现瀑布流布局的示例代码
2017/11/10 HTML / CSS
HTML5中的拖放实现详解
2017/08/23 HTML / CSS
中国排名第一的外贸销售网站:LightInTheBox.com(兰亭集势)
2016/10/28 全球购物
函授本科自我鉴定
2013/11/03 职场文书
大学理论知识学习自我鉴定
2014/04/28 职场文书
学期个人自我总结
2015/02/13 职场文书
2016国庆促销广告语
2016/01/28 职场文书
pandas 操作 Excel操作总结
2021/03/31 Python
Win11开始菜单添加休眠选项
2022/04/19 数码科技
MySQL中LAG()函数和LEAD()函数的使用
2022/08/14 MySQL