最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Laravel中Kafka的使用詳解

 更新時(shí)間:2021年03月22日 11:19:20   作者:李嵐加洛斯  
這篇文章主要介紹了Laravel中Kafka的使用詳解,kafka是一個(gè)分布式消息隊(duì)列,具有高性能、持久化、多副本備份、橫向擴(kuò)展能力,有對(duì)于消息隊(duì)列感興趣的同學(xué)可以參考下

本文并沒(méi)有kafka的安裝教程,本文是針對(duì)已經(jīng)安裝kafka及其配置好kafka的php拓展并且使用laravel框架進(jìn)行開(kāi)發(fā)項(xiàng)目,配置一個(gè)可供laravel框架使用的生產(chǎn)及消費(fèi)者類.

以下代碼修改自本站的YII框架關(guān)于kafka類的代碼,經(jīng)過(guò)測(cè)試使用在本人的項(xiàng)目中,可正常運(yùn)行,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,可以用逗號(hào)隔開(kāi)多個(gè)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;
  }
 
  /**
   * 生產(chǎn)者
   * @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));
  }
 
  /**
   * 消費(fèi)者
   */
  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);
    }
  }
}
?>

在控制器中如何使用:

首先再頭部導(dǎo)入這個(gè)類:use App\Tools\Kafka;

下面是使用生產(chǎn)者實(shí)例:

public function test(){
 
   $topic = 'tool';//輸入使用管道名稱
   $data['shop_id'] = 58;
   $data['bar_code']=586;
   $data['goods_num'] = 1;
   $data['goods_unit'] = '個(gè)';
 
$Kafka = new Kafka();
$Error_Msg = $Kafka->send($data,$topic);//傳入數(shù)組會(huì)自動(dòng)轉(zhuǎn)換json
var_dump($Error_Msg);
 
 
  }

下面是消費(fèi)者實(shí)例,消費(fèi)者我這里使用了的是php腳本進(jìn)行的操作:

<?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:
    //沒(méi)有錯(cuò)誤打印信息
      $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 "超時(shí)\n";
      break;
    default:
      throw new \Exception($message->errstr(), $message->err);
      break;
  }
 sleep(1);
}
 
?>

到此這篇關(guān)于Laravel中Kafka的使用詳解的文章就介紹到這了,更多相關(guān)Laravel中Kafka內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

  • ThinkPHP中U方法的使用淺析

    ThinkPHP中U方法的使用淺析

    這篇文章主要介紹了ThinkPHP中U方法的使用,需要的朋友可以參考下
    2014-06-06
  • php根據(jù)操作系統(tǒng)轉(zhuǎn)換文件名大小寫的方法

    php根據(jù)操作系統(tǒng)轉(zhuǎn)換文件名大小寫的方法

    這篇文章主要介紹了php根據(jù)操作系統(tǒng)轉(zhuǎn)換文件名大小寫的方法,需要的朋友可以參考下
    2014-02-02
  • php+layui數(shù)據(jù)表格實(shí)現(xiàn)數(shù)據(jù)分頁(yè)渲染代碼

    php+layui數(shù)據(jù)表格實(shí)現(xiàn)數(shù)據(jù)分頁(yè)渲染代碼

    今天小編就為大家分享一篇php+layui數(shù)據(jù)表格實(shí)現(xiàn)數(shù)據(jù)分頁(yè)渲染代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-10-10
  • PHP sdk文檔處理常用代碼示例解析

    PHP sdk文檔處理常用代碼示例解析

    這篇文章主要介紹了PHP sdk文檔處理常用代碼示例解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-12-12
  • 利用PHPStorm如何開(kāi)發(fā)Laravel應(yīng)用詳解

    利用PHPStorm如何開(kāi)發(fā)Laravel應(yīng)用詳解

    這篇文章主要給大家介紹了關(guān)于利用PHPStorm如何開(kāi)發(fā)Laravel應(yīng)用的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面跟著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)下吧。
    2017-08-08
  • php遍歷目錄與文件夾的多種方法詳解

    php遍歷目錄與文件夾的多種方法詳解

    介紹幾個(gè)php遍歷目錄的方法,可以遍歷目錄及目錄中的文件,供大家參考
    2013-11-11
  • 最新版本PHP 7 vs HHVM 多角度比較

    最新版本PHP 7 vs HHVM 多角度比較

    PHP 7 是 PHP 社區(qū)對(duì) HHVM 的回應(yīng)。PHP 7 發(fā)布的預(yù)覽版本號(hào)稱比之前的 PHP 5 的性能要提升100%。不過(guò),PHP 還有一個(gè)競(jìng)爭(zhēng)對(duì)手 HHVM (HipHop Virtual Machine) 一個(gè)運(yùn)行 PHP 代碼的虛擬工具。二者直接的比較正在升溫,那么讓我們來(lái)看一下他們直接的性能對(duì)比吧
    2016-02-02
  • php IIS日志分析搜索引擎爬蟲記錄程序

    php IIS日志分析搜索引擎爬蟲記錄程序

    由于最近比較忙,代碼寫得不怎么規(guī)范,界面也沒(méi)有怎么美化,大家先用著吧,以后增加新功能會(huì)第一時(shí)間發(fā)布給大家!
    2008-08-08
  • Yii框架參數(shù)化查詢中IN查詢只能查詢一個(gè)的解決方法

    Yii框架參數(shù)化查詢中IN查詢只能查詢一個(gè)的解決方法

    這篇文章主要介紹了Yii框架參數(shù)化查詢中IN查詢只能查詢一個(gè)的解決方法,結(jié)合實(shí)例形式分析了Yii框架中IN查詢只能查一個(gè)的原因及FIND_IN_SET函數(shù)相關(guān)功能與使用技巧,需要的朋友可以參考下
    2017-05-05
  • 最新評(píng)論

    综艺| 临桂县| 汪清县| 定州市| 石首市| 克拉玛依市| 呼图壁县| 上虞市| 麦盖提县| 临洮县| 荆州市| 精河县| 依安县| 安西县| 永丰县| 乌恰县| 永昌县| 虞城县| 仲巴县| 滦南县| 沛县| 恩施市| 中西区| 乌兰察布市| 夹江县| 礼泉县| 银川市| 房山区| 江都市| 霞浦县| 岳阳县| 钟祥市| 安泽县| 兴化市| 吉水县| 长丰县| 神木县| 望都县| 汉沽区| 屯留县| 景泰县|