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 相关文章推荐
smarty实例教程
Nov 19 PHP
目录,文件操作详谈―PHP
Nov 25 PHP
PHP eval函数使用介绍
Dec 08 PHP
PHP6 中可能会出现的新特性预览
Apr 04 PHP
php数组操作之键名比较与差集、交集赋值的方法
Nov 10 PHP
php上传大文件失败的原因及应对策略
Oct 20 PHP
46 个非常有用的 PHP 代码片段
Feb 16 PHP
thinkPHP3.2简单实现文件上传的方法
May 16 PHP
thinkphp3.2实现在线留言提交验证码功能
Jul 19 PHP
阿里云Win2016安装Apache和PHP环境图文教程
Mar 11 PHP
YII分模块加载路由的实现方法
Oct 01 PHP
ThinkPHP框架实现FTP图片上传功能示例
Apr 08 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
967 个函式
2006/10/09 PHP
php上传文件,创建递归目录的实例代码
2013/10/18 PHP
简单的自定义php模板引擎
2016/08/26 PHP
Laravel使用PHPQRCODE实现生成带有LOGO的二维码图片功能示例
2017/07/07 PHP
PHP数据分析引擎计算余弦相似度算法示例
2017/08/08 PHP
Thinkphp 框架扩展之标签库驱动原理与用法分析
2020/04/23 PHP
nodejs中exports与module.exports的区别详细介绍
2013/01/14 NodeJs
jQuery根据ID获取input、checkbox、radio、select的示例
2014/08/11 Javascript
swtich/if...else的替代语句
2015/08/16 Javascript
Javascript验证方法大全
2015/09/21 Javascript
jQuery Dialog对话框事件用法实例分析
2016/05/10 Javascript
基于vuejs实现一个todolist项目
2017/04/11 Javascript
JavaScript学习总结(一) ECMAScript、BOM、DOM(核心、浏览器对象模型与文档对象模型)
2018/01/07 Javascript
Nodejs实现多文件夹文件同步
2018/10/17 NodeJs
微信小程序在地图选择地址并返回经纬度简单示例
2018/12/03 Javascript
Vant+postcss-pxtorem 实现浏览器适配功能
2021/02/05 Javascript
web.py在模板中输出美元符号的方法
2014/08/26 Python
使用Python的turtle模块画图的方法
2017/11/15 Python
在dataframe两列日期相减并且得到具体的月数实例
2018/07/03 Python
Windows下python3.6.4安装教程
2018/07/31 Python
python实现猜数字游戏
2020/03/25 Python
CSS3——齿轮转动关键代码
2013/05/02 HTML / CSS
canvas 橡皮筋式线条绘图应用方法
2019/02/13 HTML / CSS
怎样实现H5+CSS3手指滑动切换图片的示例代码
2019/05/05 HTML / CSS
canvas实现烟花的示例代码
2020/01/16 HTML / CSS
新加坡最佳婴儿用品店:Mamahood.com.sg
2018/08/26 全球购物
伦敦香水公司:The London Perfume Company
2019/11/13 全球购物
会计职业生涯规划书
2014/01/13 职场文书
汽车队司机先进事迹材料
2014/02/01 职场文书
银行给客户的感谢信
2015/01/23 职场文书
刑事案件上诉状
2015/05/23 职场文书
教师节老师寄语
2015/05/28 职场文书
导游词之崇武古城
2019/10/07 职场文书
Oracle笔记
2021/04/05 Oracle
springboot @ConfigurationProperties和@PropertySource的区别
2021/06/11 Java/Android
QT连接MYSQL数据库的详细步骤
2021/07/07 MySQL