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 相关文章推荐
example2.php
Oct 09 PHP
转换中文日期的PHP程序
Oct 09 PHP
在mysql数据库原有字段后增加新内容
Nov 26 PHP
PHP生成唯一的促销/优惠/折扣码(附源码)
Dec 28 PHP
微信公众平台之快递查询功能用法实例
Apr 14 PHP
PHP根据图片色界在不同位置加水印的方法
Jul 01 PHP
详解WordPress中用于合成数组的wp_parse_args()函数
Dec 18 PHP
php实现搜索类封装示例
Mar 31 PHP
PHP 配置后台登录以及模板引入
Jan 24 PHP
php记录搜索引擎爬行记录的实现代码
Mar 02 PHP
php使用fputcsv实现大数据的导出操作详解
Feb 27 PHP
php中yar框架实例用法讲解
Dec 27 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 smarty模版引擎中的缓存应用
2009/12/11 PHP
PHP session有效期session.gc_maxlifetime
2011/04/20 PHP
php生成图片缩略图的方法
2015/04/07 PHP
通过修改配置真正解决php文件上传大小限制问题(nginx+php)
2015/09/23 PHP
php文件包含的几种方式总结
2019/09/19 PHP
用javascript实现的图片马赛克后显示并切换加文字功能
2007/04/21 Javascript
走出JavaScript初学困境—js初学
2008/12/29 Javascript
Jquery 基础学习笔记之文档处理
2009/05/29 Javascript
Jquery AJAX 用于计算点击率(统计)
2010/06/30 Javascript
javascript onmouseout 解决办法
2010/07/17 Javascript
兼容IE和Firefox火狐的上下、左右循环无间断滚动JS代码
2013/04/19 Javascript
jQuery ajax serialize() 方法使用示例
2014/11/02 Javascript
JavaScript将当前时间转换成UTC标准时间的方法
2015/04/06 Javascript
利用Angularjs和原生JS分别实现动态效果的输入框
2016/09/01 Javascript
jQuery使用getJSON方法获取json数据完整示例
2016/09/13 Javascript
详解js中==与===的区别
2017/01/08 Javascript
docker中编译nodejs并使用nginx启动
2017/06/23 NodeJs
Popup弹出框添加数据实现方法
2017/10/27 Javascript
JS遍历DOM文档树的方法实例详解
2018/04/03 Javascript
JQuery特殊效果和链式调用操作示例
2019/05/13 jQuery
vue里的data要用return返回的原因浅析
2019/05/28 Javascript
JavaScript中var的重要性实例分析
2019/07/09 Javascript
vue图片裁剪插件vue-cropper使用方法详解
2020/12/16 Vue.js
python基于queue和threading实现多线程下载实例
2014/10/08 Python
在阿里云服务器上配置CentOS+Nginx+Python+Flask环境
2016/06/18 Python
Python3.4学习笔记之列表、数组操作示例
2019/03/01 Python
Django接收照片储存文件的实例代码
2020/03/07 Python
汽车维修专业毕业生的求职信分享
2013/12/04 职场文书
客户服务经理岗位职责
2014/01/29 职场文书
教师专业自荐信
2014/05/31 职场文书
2014教师“四风问题”对照检查材料思想汇报
2014/09/16 职场文书
村党支部群众路线教育实践活动对照检查材料
2014/09/26 职场文书
2015最新婚礼主持词
2015/06/30 职场文书
Python基础之函数嵌套知识总结
2021/05/23 Python
pytorch 使用半精度模型部署的操作
2021/05/24 Python
html中相对位置与绝对位置的具体使用
2022/05/15 HTML / CSS