用擴充套件的方式在 PHP 中使用 Kafka
前言:
由於之前在 PHP 中使用 Kafka 是透過 composer 包的方式,由於 nmred/kafka-php 很久沒有維護,並且網上相關問題的文章也比較少。所以我這次換成 PHP 擴充套件 RdKafka 繼續使用,主要介紹擴充套件安裝和這種方式的基本操作。
安裝:
1. 下載
找到與自己環境匹配的就可以
2. 目錄
由於 php-rdkafka 依賴 librdkafka,linux 就需要先安裝 librdkafka 後安裝 php-rdkafka,而 windows 版本是如下幾個檔案,安裝方法如下:
(1). 將 librdkafka.dll 和 librdkafka.pdb 放入 PHP 安裝的根目錄下,而 php_rdkafka.dll 和 php_rdkafka.pdb 放入 PHP 安裝目錄的 ext 下。
(2). php.ini 配置檔案新增 extension=php_rdkafka.dll,最後重啟 PHP。
(3). php-m 或這 phpinfo (); 就可以檢視到擴充套件了。
透過 get_declared_classes() 也可以檢視到擴充套件裡預設的函式了。
使用:
1. 生產
public function kafkaTest(){ $rk = new \RdKafka\Producer(); $rk->addBrokers("127.0.0.1:9092"); $topic = $rk->newTopic("shop"); $ret = []; for ($i = 0; $i < 5; $i++) { $content = "第" . $i . "次傳送失敗"; $message = ["mobile" => "15623652142", "content" => $content]; $payload = json_encode($message); // 指定向0號partition生產資料 $ret[]['produce_res'] = $topic->produce(0, 0, $payload, "sms_$i"); // 隨機選擇partition //$topic->produce(RD_KAFKA_PARTITION_UA, 0, $payload); if ($rk->getOutQLen() > 0) { $ret[]['produce_poll'] = $rk->poll(500); } else { $ret[]['produce_poll'] = $rk->poll(0); } } dump($ret); }
2. 消費(從指定的 partition 消費)
protected function execute(Input $input, Output $output){ $output->writeln("!!!hello kafka!!!"); $conf = new \RdKafka\Conf(); $conf->set('group.id', 'sms-consumer-group'); $rk = new \RdKafka\Consumer($conf); $rk->addBrokers("127.0.0.1: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("shop", $topicConf); $topic->consumeStart(0, RD_KAFKA_OFFSET_STORED); while(true) { // 設定消費時的時間間隔,單位毫秒,以下表示5秒消費一個 $message = $topic->consume(0, 5000); if ($message) { echo "讀取到訊息\n\r"; // 訊息物件,包括訊息主題,訊息建立時間戳,訊息分割槽編號,訊息主體,訊息鍵名,訊息長度等 var_dump($message); switch ($message->err) { case RD_KAFKA_RESP_ERR_NO_ERROR: echo "讀取訊息成功:\n\r"; var_dump($message->payload); break; case RD_KAFKA_RESP_ERR__PARTITION_EOF: echo "讀取訊息失敗\n\r"; break; case RD_KAFKA_RESP_ERR__TIMED_OUT: echo "請求超時\n\r"; break; default: throw new \Exception($message->errstr(), $message->err); break; } } else { echo "未讀取到訊息\n\r"; } } $output->writeln("!!!the end!!!"); }
附加:
在執行消費過程中,發現 kafka 停止服務,丟擲的異常:ERROR Shutdown broker because all log dirs in /tmp/kafka-logs have failed。
解決方法:
刪除 kafka-logs 下的所有日誌,再重新啟動 Kafaka, kafka-server-start.bat ..\..\config\server.properties &
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70029959/viewspace-2952429/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 在windows的php中安裝grpc擴充套件WindowsPHPRPC套件
- 好用的擴充套件,pretty-routes,在PHP7.3.9中的使用套件PHP
- 使用KEDA和Kafka在 Kubernetes 上自動擴充套件 - PiotrKafka套件
- 學習PHP中YAML操作擴充套件的使用PHPYAML套件
- PHP FFI詳解 - 一種全新的PHP擴充套件方式PHP套件
- PHP擴充套件開發就是一個自己的PHP擴充套件PHP套件
- laradock 中安裝 PHP 擴充套件PHP套件
- 一起了解PHP中YaConf擴充套件的使用PHP套件
- 學習PHP中統計擴充套件函式的使用PHP套件函式
- 新增php擴充套件PHP套件
- 學習PHP中好玩的Gmagick影像操作擴充套件的使用PHP套件
- 用 TDD 的方式為 Laravel 開發擴充套件Laravel套件
- 在Ubuntu16.04 中 使用pecl 為 php7.2 安裝swoole擴充套件UbuntuPHP套件
- spring bean 擴充套件方式SpringBean套件
- PHP實現Bitmap的探索 - GMP擴充套件使用PHP套件
- PHP 擴充套件安裝PHP套件
- 開發php擴充套件PHP套件
- PHP擴充套件php-redis 用起來so easyPHP套件Redis
- 使用 Zephir 輕鬆構建 PHP 擴充套件PHP套件
- 在Windows下為PHP安裝redis擴充套件WindowsPHPRedis套件
- PHP 容器中安裝原始碼包中的擴充套件PHP原始碼套件
- ?用Chrome擴充套件管理器, 管理你的擴充套件Chrome套件
- 用 PHP-CPP 開發 PHP 擴充套件:raylib-phpcppPHP套件
- SPI擴充套件點在業務中的使用及原理分析套件
- php8.2 redis擴充套件PHPRedis套件
- Go開發PHP擴充套件GoPHP套件
- php mysql擴充套件安裝PHPMySql套件
- php amqp擴充套件安裝PHPMQ套件
- PHP 安裝 yaconf 擴充套件PHP套件
- (MAC) PHP擴充套件安裝MacPHP套件
- PHP安裝redis擴充套件PHPRedis套件
- php新增pcntl擴充套件(Linux)PHP套件Linux
- 聊聊 Spring 的 XML Schema 擴充套件機制的使用方式SpringXML套件
- php以及php擴充套件memcache 安裝PHP套件
- Swift在擴充套件中關聯物件Swift套件物件
- 3 種擴充套件 Kubernetes 能力的方式套件
- 【PHP】Mcrypt 擴充套件模組安裝及使用PHP套件
- 在 laradock 安裝 PHP-swoole 擴充套件記錄PHP套件