php使用kafka

安裝librdkafka

 

git clone https://github.com/edenhill/librdkafka.git
 ./configure
 make
 sudo make install

安裝php-rdkafka 擴展

 

$ git clone https://github.com/arnaud-lb/php-rdkafka.git
 
#生成configure文件
$ /Users/shiyibo/LNMP/php/bin/phpize 
 
#編譯安裝
$ ./configure --with-php-config=/Users/shiyibo/LNMP/php/bin/php-config
$ make
$ make install 
 
#在php.ini 文件中配置 rdkafka擴展
$ vim /Users/shiyibo/LNMP/php/etc/php.ini
extension=rdkafka.so
 
#查看擴展是否生效
$php -m | grep kafka

image.png

編碼實現

生產者

  • 代碼實現

 

<?php
/**
 * Created by PhpStorm.
 * User: shiyibo
 * Date: 2019/2/24
 * Time: 12:57 PM
 */

/**
 * 消息生產者
 *
 * 實現的例子來源於:
 *
 * https://github.com/arnaud-lb/php-rdkafka#examples
 */

$objRdKafka = new RdKafka\Producer();
$objRdKafka->setLogLevel(LOG_DEBUG);
$objRdKafka->addBrokers("localhost:9092");

$oObjTopic = $objRdKafka->newTopic("test");

// 從終端接收輸入 
$oInputHandler = fopen('php://stdin', 'r');

while (true) {
    echo "\nEnter  messages:\n";
    $sMsg = trim(fgets($oInputHandler));

   // 空消息意味着退出
    if (empty($sMsg)) {
        break;
    }

    // 發送消息
    $oObjTopic->produce(RD_KAFKA_PARTITION_UA, 0, $sMsg);
}

echo "done\n";
  • 檢驗發送是否成功

終端開啓一個消費者:

 

# 因爲生產者會往test的topic中發送消息,消費者直接消費test即可
kafka-console-consumer --bootstrap-server localhost:9092 --topic test

生產者端發送:

 

image.png

消費者端接收:

 

image.png

消費者

  • 代碼實現

 

<?php

/**
 * 消費者消費消息
 *
 * 實現的例子來源於:
 *
 * https://github.com/arnaud-lb/php-rdkafka#examples
 */

$objRdKafka = new RdKafka\Consumer();
$objRdKafka->setLogLevel(LOG_DEBUG);
$objRdKafka->addBrokers("localhost:9092");

$oObjTopic = $objRdKafka->newTopic("test");

/**
 * consumeStart
 *   第一個參數標識分區,生產者是往分區0發送的消息,這裏也從分區0拉取消息
 *   第二個參數標識從什麼位置開始拉取消息,可選值爲
 *     RD_KAFKA_OFFSET_BEGINNING : 從開始拉取消息
 *     RD_KAFKA_OFFSET_END : 從當前位置開始拉取消息
 *     RD_KAFKA_OFFSET_STORED : 猜測跟RD_KAFKA_OFFSET_END一樣
 */
$oObjTopic->consumeStart(0, RD_KAFKA_OFFSET_END);

while (true) {
    // 第一個參數是分區,第二個參數是超時時間
    $oMsg = $oObjTopic->consume(0, 1000);

    // 沒拉取到消息時,返回NULL
    if (!$oMsg) {
        usleep(10000);
        continue;
    }

    if ($oMsg->err) {
        echo $msg->errstr(), "\n";
        break;
    } else {
        echo $oMsg->payload, "\n";
    }
}
  • 校驗
    生產者端發送:

     

    image.png

消費者端接收:

 



作者:dayeshisir
鏈接:https://www.jianshu.com/p/fd8ce54e1156
來源:簡書
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章