Laravel中Kafka的使用详解


Posted in PHP onMarch 24, 2021

本文并没有kafka的安装教程,本文是针对已经安装kafka及其配置好kafka的php拓展并且使用laravel框架进行开发项目,配置一个可供laravel框架使用的生产及消费者类.

以下代码修改自本站的YII框架关于kafka类的代码,经过测试使用在本人的项目中,可正常运行,larvael版本:5.6 代码放置larvael框架位置:app/Tools/Kafka.php

<?php
namespace App\Tools;
  
use Illuminate\Config\Repository;
  
use Illuminate\Support\Facades\DB;
use Monolog\Logger;
use Monolog\Handler\StreamHandler;
  
use Illuminate\Http\Request;
  
class Kafka
{
  public $broker_list = '127.0.0.1';//配置kafka,可以用逗号隔开多个kafka
  public $topic = 'test';//管道名称
  public $partition = 0;
  
  protected $producer = null;
  protected $consumer = null;
  
  public function __construct()
  {
    if (empty($this->broker_list)) {
      throw new InvalidConfigException("broker not config");
    }
    $rk = new \RdKafka\Producer();
    if (empty($rk)) {
      throw new InvalidConfigException("producer error");
    }
    $rk->setLogLevel(LOG_DEBUG);
    if (!$rk->addBrokers($this->broker_list)) {
      throw new InvalidConfigException("producer error");
    }
    $this->producer = $rk;
  }
  
  /**
   * 生产者
   * @param array $messages
   * @return mixed
   */
  public function send($messages = [],$topic)
  {
    $topic = $this->producer->newTopic($topic);
    return $topic->produce(RD_KAFKA_PARTITION_UA, $this->partition, json_encode($messages));
  }
  
  /**
   * 消费者
   */
  public function consumer($object, $callback){
    $conf = new \RdKafka\Conf();
    $conf->set('group.id', 0);
    $conf->set('metadata.broker.list', $this->broker_list);
  
    $topicConf = new \RdKafka\TopicConf();
    $topicConf->set('auto.offset.reset', 'smallest');
  
    $conf->setDefaultTopicConf($topicConf);
  
    $consumer = new \RdKafka\KafkaConsumer($conf);
  
    $consumer->subscribe([$this->topic]);
  
    echo "waiting for messages.....\n";
    while(true) {
      $message = $consumer->consume(120*1000);
      switch ($message->err) {
        case RD_KAFKA_RESP_ERR_NO_ERROR:
          echo "message payload....";
          $object->$callback($message->payload);
          break;
      }
      sleep(1);
    }
  }
}
?>

在控制器中如何使用:

首先再头部导入这个类:use App\Tools\Kafka;

下面是使用生产者实例:

public function test(){
  
   $topic = 'tool';//输入使用管道名称
   $data['shop_id'] = 58;
   $data['bar_code']=586;
   $data['goods_num'] = 1;
   $data['goods_unit'] = '个';
  
$Kafka = new Kafka();
$Error_Msg = $Kafka->send($data,$topic);//传入数组会自动转换json
var_dump($Error_Msg);
  
  
  }

下面是消费者实例,消费者我这里使用了的是php脚本进行的操作:

<?php
  
$conf = new RdKafka\Conf();
  
$conf->set('group.id', 'myConsumerGroup');
  
$rk = new RdKafka\Consumer($conf);
$rk->addBrokers("localhost:9092");
  
$topicConf = new RdKafka\TopicConf();
$topicConf->set('auto.commit.interval.ms', 100);
$topicConf->set('offset.store.method', 'file');
$topicConf->set('offset.store.path', sys_get_temp_dir());
$topicConf->set('auto.offset.reset', 'smallest');
  
$topic = $rk->newTopic("tool", $topicConf);//读取的管道
  
// Start consuming partition 0
$topic->consumeStart(0, RD_KAFKA_OFFSET_STORED);
  
while (true) {
  $message = $topic->consume(0, 120*10000);
  switch ($message->err) {
    case RD_KAFKA_RESP_ERR_NO_ERROR:
    //没有错误打印信息
      $message = json_decode(json_encode($message),true);
      $data = json_decode($message['payload'],true);
      var_dump($data);
      break;
    case RD_KAFKA_RESP_ERR__PARTITION_EOF:
      echo "等待接收信息\n";
      break;
    case RD_KAFKA_RESP_ERR__TIMED_OUT:
      echo "超时\n";
      break;
    default:
      throw new \Exception($message->errstr(), $message->err);
      break;
  }
 sleep(1);
}
  
?>
PHP 相关文章推荐
PHP定时自动生成静态HTML的实现代码
Jun 20 PHP
PHP 图片文件上传实现代码
Dec 29 PHP
php stripslashes和addslashes的区别
Feb 03 PHP
PHP输出两个数字中间有多少个回文数的方法
Mar 23 PHP
php获取网页上所有链接的方法
Apr 03 PHP
PHP实现删除字符串中任何字符的函数
Aug 11 PHP
PHP的Yii框架使用中的一些错误解决方法与建议
Aug 21 PHP
深入解析PHP中foreach语句控制数组循环的用法
Nov 30 PHP
php获取本机真实IP地址实例代码
Mar 31 PHP
php分页原理 分页代码 分页类制作教程
Sep 23 PHP
作为PHP程序员你要知道的另外一种日志
Jul 30 PHP
PHP检测一个数组有没有定义的方法步骤
Jul 20 PHP
thinkphp5 redis缓存新增方法实例讲解
php优化查询foreach代码实例讲解
Mar 24 #PHP
PHP引擎php.ini参数优化深入讲解
Mar 24 #PHP
PHP使用Redis队列执行定时任务实例讲解
Mar 24 #PHP
YII2 全局异常处理深入讲解
Laravel的加密解密与哈希实例讲解
Mar 24 #PHP
laravel使用redis队列实例讲解
You might like
php正则匹配文章中的远程图片地址并下载图片至本地
2015/09/29 PHP
php关键字仅替换一次的实现函数
2015/10/29 PHP
PHP调试的强悍利器之PHPDBG
2016/02/22 PHP
用PHP写的一个冒泡排序法的函数简单实例
2016/05/26 PHP
PHP实现针对日期,月数,天数,周数,小时,分,秒等的加减运算示例【基于strtotime】
2017/04/19 PHP
Laravel框架处理用户的请求操作详解
2019/12/20 PHP
JQuery动画和停止动画实例代码
2013/03/01 Javascript
js实现浏览器的各种菜单命令比如打印、查看源文件等等
2013/10/24 Javascript
javascript实现数字+字母验证码的简单实例
2014/02/10 Javascript
完美兼容各大浏览器的jQuery仿新浪图文淡入淡出间歇滚动特效
2014/11/12 Javascript
jquery实现上下左右滑动的方法
2015/02/09 Javascript
JS日期格式化之javascript Date format
2015/10/01 Javascript
js实现简单的省市县三级联动效果实例
2016/02/18 Javascript
基于JS实现数字动态变化显示效果附源码
2019/07/18 Javascript
vue实现自定义多选按钮
2020/07/16 Javascript
vue打包npm run build时候界面报错的解决
2020/08/13 Javascript
有关wxpython pyqt内存占用问题分析
2014/06/09 Python
详细解析Python中__init__()方法的高级应用
2015/05/11 Python
Django中对数据查询结果进行排序的方法
2015/07/17 Python
pyenv命令管理多个Python版本
2017/03/26 Python
Python数据拟合与广义线性回归算法学习
2017/12/22 Python
Python数字图像处理之霍夫线变换实现详解
2018/01/12 Python
PyTorch搭建多项式回归模型(三)
2019/05/22 Python
Python 读取用户指令和格式化打印实现解析
2019/09/02 Python
详解Python 重学requests发起请求的基本方式
2020/02/07 Python
python shell命令行中import多层目录下的模块操作
2020/03/09 Python
浅谈Django中的QueryDict元素为数组的坑
2020/03/31 Python
python简单的三元一次方程求解实例
2020/04/02 Python
Django 设置admin后台表和App(应用)为中文名的操作方法
2020/05/10 Python
python爬虫实例之获取动漫截图
2020/05/31 Python
葡萄牙鞋子品牌:Fair
2016/12/10 全球购物
大学总结自我鉴定
2014/01/18 职场文书
新员工试用期自我鉴定
2014/04/17 职场文书
催款函范本大全
2015/06/24 职场文书
小程序wx.getUserProfile接口的具体使用
2021/06/02 Javascript
深入浅出讲解Java8函数式编程
2022/01/18 Java/Android