用擴充套件的方式在 PHP 中使用 Kafka

beiqiaosu發表於2023-05-16

前言:

        由於之前在 PHP 中使用 Kafka 是透過 composer 包的方式,由於 nmred/kafka-php 很久沒有維護,並且網上相關問題的文章也比較少。所以我這次換成 PHP 擴充套件 RdKafka 繼續使用,主要介紹擴充套件安裝和這種方式的基本操作。

 

安裝:

1. 下載

找到與自己環境匹配的就可以

用擴充套件的方式在 PHP 中使用 Kafka

用擴充套件的方式在 PHP 中使用 Kafka

2. 目錄

       由於 php-rdkafka 依賴 librdkafka,linux 就需要先安裝 librdkafka 後安裝 php-rdkafka,而 windows 版本是如下幾個檔案,安裝方法如下:

用擴充套件的方式在 PHP 中使用 Kafka

(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 (); 就可以檢視到擴充套件了。

用擴充套件的方式在 PHP 中使用 Kafka

用擴充套件的方式在 PHP 中使用 Kafka

透過 get_declared_classes() 也可以檢視到擴充套件裡預設的函式了。

用擴充套件的方式在 PHP 中使用 Kafka

 

使用:

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);
}

用擴充套件的方式在 PHP 中使用 Kafka

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!!!");
}

用擴充套件的方式在 PHP 中使用 Kafka

 

附加:

        在執行消費過程中,發現 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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章