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 相关文章推荐
用ADODB来让PHP操作ACCESS数据库的方法
Dec 31 PHP
全世界最小的php网页木马一枚 附PHP木马的防范方法
Oct 09 PHP
php实现的太平洋时间和北京时间互转的自定义函数分享
Aug 19 PHP
php从字符串创建函数的方法
Mar 16 PHP
php获取本周星期一具体日期的方法
Apr 20 PHP
DEDE实现转跳属性文档在模板上调用出转跳地址
Nov 04 PHP
php中this关键字用法分析
Dec 07 PHP
PHP简单留言本功能实现代码
Jun 09 PHP
PHP常用日期加减计算方法实例小结
Jul 31 PHP
实例讲解PHP中使用命名空间
Jan 27 PHP
Laravel推荐使用的十个辅助函数
May 10 PHP
laravel Model 执行事务的实现
Oct 10 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脚本数据库功能详解(中)
2006/10/09 PHP
PHP CURL获取cookies模拟登录的方法
2013/11/04 PHP
php获取网卡的MAC地址支持WIN/LINUX系统
2014/04/30 PHP
Laravel监听数据库访问,打印SQL的例子
2019/10/24 PHP
Javascript 日期对象Date扩展方法
2009/05/30 Javascript
javascript 用记忆函数快速计算递归函数
2010/03/15 Javascript
jquery 可拖拽的窗体控件实现代码
2010/03/21 Javascript
js中更短的 Array 类型转换
2011/10/30 Javascript
JavaScript中的toUTCString()方法使用详解
2015/06/12 Javascript
js带缩略图的图片轮播效果代码分享
2015/09/14 Javascript
分享纯手写漂亮的表单验证
2015/11/19 Javascript
第六篇Bootstrap表格样式介绍
2016/06/21 Javascript
AngularJS解决ng界面长表达式(ui-set)的方法分析
2016/11/07 Javascript
vue2滚动条加载更多数据实现代码
2017/01/10 Javascript
Vuex模块化实现待办事项的状态管理
2017/03/15 Javascript
关于Ajax的原理以及代码封装详解
2017/09/08 Javascript
Javascript 编码约定(编码规范)
2018/03/11 Javascript
小程序从手动埋点到自动埋点的实现方法
2019/01/24 Javascript
[50:48]LGD vs CHAOS 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
python函数返回多个值的示例方法
2013/12/04 Python
Python自定义线程类简单示例
2018/03/23 Python
python2和python3的输入和输出区别介绍
2018/11/20 Python
Python内存管理实例分析
2019/07/10 Python
python 异步async库的使用说明
2020/05/04 Python
Python如何实现线程间通信
2020/07/30 Python
属性与 @property 方法让你的python更高效
2020/09/21 Python
让IE可以变相支持CSS3选择器
2010/01/21 HTML / CSS
King Apparel官网:英国街头服饰品牌
2019/09/05 全球购物
荷兰最大的多品牌男装连锁店:Adam Brandstore
2019/12/31 全球购物
Linux中如何用命令创建目录
2016/12/02 面试题
Final类有什么特点
2012/04/25 面试题
金融专业个人求职信
2013/09/22 职场文书
愚人节活动策划方案
2014/03/11 职场文书
2014领导班子四风剖析对照检查材料思想汇报
2014/09/20 职场文书
离婚协议书应该怎么写
2014/10/12 职场文书