####################################################
# 生产者 producer.php
$max = 100;
$configBrokers = '127.0.0.1:9092';
$configTopic = 'test';
$conf = new \RdKafka\Conf();
// 注册发送消息事件
$conf->setDrMsgCb(function ($kafka, $message) {
var_dump('msg:', $kafka, $message);
});
// 注册错误发送的事件回调
$conf->setErrorCb(function ($kafka, $err, $reason) {
dump('error', $kafka, $err, $reason);
});
// 实例化生产者
$producer = new \RdKafka\Producer($conf);
$producer->addBrokers($configBrokers);
$configObj = new \RdKafka\TopicConf();
$topic = $producer->newTopic($configTopic, $configObj);
// 尝试发送几个消息, 这里注意,发送是异步的
for ($i = 0; $i < $max; ++ $i) {
// RD_KAFKA_PARTITION_UA 让 kafka 自由选择分区
$topic->produce(RD_KAFKA_PARTITION_UA, 0, "php send " . $i);
}
// 这里必须 poll 消息发送完毕
while (($len = $producer->getOutQLen()) > 0) {
$producer->poll(1);
}
####################################################
# 消费者 consumer.php
$configBrokers = '127.0.0.1:9092';
$configTopic = 'test';
$consumer = new \RdKafka\Consumer();
$consumer->addBrokers($configBrokers);
$topic = $consumer->newTopic($configTopic);
// 从上一次记录的偏移量消费
$topic->consumeStart(0, RD_KAFKA_OFFSET_END);
while (true) {
// 连接的超时时间, 如果常驻内存消费, 设置时间长点
$message = $topic->consume(0, 60*60);
switch ($message->err) {
case RD_KAFKA_RESP_ERR_NO_ERROR:
var_dump($message, Carbon::now()->toDateTimeString(), 'count:' . $count);
break;
case RD_KAFKA_RESP_ERR__PARTITION_EOF:
var_dump("No more messages; will wait for more\n");
break;
case RD_KAFKA_RESP_ERR__TIMED_OUT:
var_dump("Timed out\n");
break;
default:
var_dump('error', $message);
break;
}
}