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脚本数据库功能详解(中)
Oct 09 PHP
php 正则匹配函数体
Aug 25 PHP
为PHP初学者的8点有效建议
Nov 20 PHP
php array_pop()数组函数将数组最后一个单元弹出(出栈)
Jul 12 PHP
ThinkPHP模板判断输出Defined标签用法详解
Jun 30 PHP
php中file_get_content 和curl以及fopen 效率分析
Sep 19 PHP
Laravel 4 初级教程之视图、命名空间、路由
Oct 30 PHP
PHP中文乱码解决方案
Mar 05 PHP
PHP Streams(流)详细介绍及使用
May 12 PHP
php 5.4 全新的代码复用Trait详解
Jan 05 PHP
阿里云PHP SMS短信服务验证码发送方法
Jul 11 PHP
PHP ADODB实现事务处理功能示例
May 25 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
索尼SONY ICF-7600A(W)电路分析
2021/03/01 无线电
基于MySQL分区性能的详细介绍
2013/05/02 PHP
php中生成随机密码的自定义函数代码
2013/10/21 PHP
thinkphp浏览历史功能实现方法
2014/10/29 PHP
php实现的单一入口应用程序实例分析
2015/09/23 PHP
PDO::getAvailableDrivers讲解
2019/01/28 PHP
Laravel timestamps 设置为unix时间戳的方法
2019/10/11 PHP
jquery 注意事项与常用语法小结
2010/06/07 Javascript
NodeJs中的非阻塞方法介绍
2012/06/05 NodeJs
js 在定义的时候立即执行的函数表达式(function)写法
2013/01/16 Javascript
简单实现JS计算器功能
2016/12/21 Javascript
easyui combotree加载静态数据问题(选不上)解决方法
2016/12/26 Javascript
bootstrap警告框使用方法解析
2017/01/13 Javascript
jQuery插件HighCharts绘制2D金字塔图效果示例【附demo源码下载】
2017/03/09 Javascript
js实现下拉框二级联动
2018/12/04 Javascript
在Vant的基础上实现添加表单验证框架的方法示例
2018/12/05 Javascript
Windows上node.js的多版本管理工具用法实例分析
2019/11/06 Javascript
Python while、for、生成器、列表推导等语句的执行效率测试
2015/06/03 Python
Python告诉你木马程序的键盘记录原理
2019/02/02 Python
Python流行ORM框架sqlalchemy安装与使用教程
2019/06/04 Python
Django+uni-app实现数据通信中的请求跨域的示例代码
2019/10/12 Python
浅谈tensorflow之内存暴涨问题
2020/02/05 Python
Python爬虫爬取电影票房数据及图表展示操作示例
2020/03/27 Python
安装并免费使用Pycharm专业版(学生/教师)
2020/09/24 Python
雅萌 (YA-MAN) :日本美容家电领域的龙头企业
2017/05/12 全球购物
蒂娜商店:Tiina the Store
2019/12/07 全球购物
会计师事务所审计实习自我鉴定
2013/09/20 职场文书
社会学专业求职信
2014/02/24 职场文书
合作意向书格式及范文
2014/03/31 职场文书
师范类求职信
2014/06/21 职场文书
单位领导婚礼致辞
2015/07/28 职场文书
售房协议书范本
2015/08/11 职场文书
手把手教你用SpringBoot将文件打包成zip存放或导出
2021/06/11 Java/Android
SpringBoot+Vue+JWT的前后端分离登录认证详细步骤
2021/09/25 Java/Android
MySQL基于索引的压力测试的实现
2021/11/07 MySQL
Python 中的 copy()和deepcopy()
2021/11/07 Python