一、准备工作

虽然 Kafka 是用 Java/Scala 语言编写的,但这不妨碍它对多语言的支持。可以在 Kafka 官网的 CLIENTS 查看 Kafka 支持的语言,其中包括 C/C++、Python、Go 等语言。

PHP 操作 Kafka 需要安装 librdkafka 库和 kafka 的 PHP 扩展。

1.安装 librdkafka 库

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

2.安装 php-kafka 扩展

$ git clone https://github.com/arnaud-lb/php-rdkafka.git
$ cd librdkafka/
$ phpize
$ ./configure
$ make
$ sudo make install #在php.ini 文件中配置 rdkafka扩展
extension=rdkafka.so #查看扩展是否生效
php -m | grep kafka

二、代码实现

demo 来源于 https://github.com/arnaud-lb/php-rdkafka#examples

正常的生产逻辑如下:

1.配置生产者客户端参数及创建相应的生产者实例;

/**
* Create a producer
*/
$conf = new RdKafka\Conf();
$conf->set('log_level', LOG_DEBUG);
//$conf->set('debug', 'all');
$rk = new RdKafka\Producer($conf);
$rk->addBrokers("127.0.0.1");

2.构建主题;

/**
* Create a topic instance from the producer
*/
$topic = $rk->newTopic("test");

3.发送消息;

/**
* Producing messages
* The first argument is the partition. RD_KAFKA_PARTITION_UA stands for unassigned, and lets librdkafka choose the partition.
* 第一个参数是分区,RD_KAFKA_PARTITION_UA 表示未分配,并且由 librdkafka 选择分区。
* The second argument are message flags and should be either 0 or RD_KAFKA_MSG_F_BLOCK to block produce on full queue.
* 第二个参数是消息标志,为 0 或 RD_KAFKA_MSG_F_BLOCK,当队列满了时阻止生产消息。
* The message payload can be anything.
* 消息可以是任何内容。
*/
$topic->produce(RD_KAFKA_PARTITION_UA, 0, "Message payload");

4.关闭生产者实例。

/**
* Proper shutdown
* This should be done prior to destroying a producer instance
* to make sure all queued and in-flight produce requests are completed before terminating.
* 关闭生产者实例前需确保所有在队列中和正在生产的生产请求都已完成。
* Not calling flush can lead to message loss!
* 不调用flush会导致消息丢失!
*/
$timeout_ms = 60000; // 1 minute
$rk->flush($timeout_ms);

检验消息是否发送成功

终端开启一个消费者:

bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test

在另一个窗口执行 php producer.php,

可看到消费者终端接收到消息。

完整代码如下:

<?php
/**
* Created by PhpStorm.
* User: liulu
* Date: 2020/1/1
* Time: 18:38
*/ /**
* Create a producer
*/
$conf = new RdKafka\Conf();
$conf->set('log_level', LOG_DEBUG);
//$conf->set('debug', 'all');
$rk = new RdKafka\Producer($conf);
$rk->addBrokers("127.0.0.1"); /**
* Create a topic instance from the producer
*/
$topic = $rk->newTopic("test"); /**
* Producing messages
* The first argument is the partition. RD_KAFKA_PARTITION_UA stands for unassigned, and lets librdkafka choose the partition.
* 第一个参数是分区,RD_KAFKA_PARTITION_UA 表示未分配,并且由 librdkafka 选择分区。
* The second argument are message flags and should be either 0 or RD_KAFKA_MSG_F_BLOCK to block produce on full queue.
* 第二个参数是消息标志,为 0 或 RD_KAFKA_MSG_F_BLOCK,当队列满了时阻止生产消息。
* The message payload can be anything.
* 消息可以是任何内容。
*/
$topic->produce(RD_KAFKA_PARTITION_UA, 0, "Message payload"); /**
* Proper shutdown
* This should be done prior to destroying a producer instance
* to make sure all queued and in-flight produce requests are completed before terminating.
* 关闭生产者实例前需确保所有在队列中和正在生产的生产请求都已完成。
* Not calling flush can lead to message loss!
* 不调用flush会导致消息丢失!
*/
$timeout_ms = 60000; // 1 minute
$rk->flush($timeout_ms); echo 'finished';exit;

Kafka学习笔记4--Kafka消费者的客户端(PHP)开发的更多相关文章

  1. Kafka学习笔记之Kafka Consumer设计解析

    0x00 摘要 本文主要介绍了Kafka High Level Consumer,Consumer Group,Consumer Rebalance,Low Level Consumer实现的语义,以 ...

  2. Kafka学习笔记之Kafka背景及架构介绍

    0x00 概述 本文介绍了Kafka的创建背景,设计目标,使用消息系统的优势以及目前流行的消息系统对比.并介绍了Kafka的架构,Producer消息路由,Consumer Group以及由其实现的不 ...

  3. Kafka学习笔记之Kafka三款监控工具

    0x00 概述 在之前的博客中,介绍了Kafka Web Console这 个监控工具,在生产环境中使用,运行一段时间后,发现该工具会和Kafka生产者.消费者.ZooKeeper建立大量连接,从而导 ...

  4. Kafka学习笔记之Kafka性能测试方法及Benchmark报告

    0x00 概述 本文主要介绍了如何利用Kafka自带的性能测试脚本及Kafka Manager测试Kafka的性能,以及如何使用Kafka Manager监控Kafka的工作状态,最后给出了Kafka ...

  5. Kafka学习笔记1——Kafka的安装和启动

    一.准备工作 1. 安装JDK 可以用命令 java -version 查看版本

  6. 【kafka学习笔记】kafka的基本概念

    在了解了背景知识后,我们来整体看一下kafka的基本概念,这里不做深入讲解,只是初步了解一下. kafka的消息架构 注意这里不是设计的架构,只是为了方便理解,脑补的三层架构.从代码的实现来看,kaf ...

  7. Kafka学习笔记之Kafka High Availability(下)

    0x00 摘要 本文在上篇文章基础上,更加深入讲解了Kafka的HA机制,主要阐述了HA相关各种场景,如Broker failover,Controller failover,Topic创建/删除,B ...

  8. Kafka学习笔记之Kafka High Availability(上)

    0x00 摘要 Kafka在0.8以前的版本中,并不提供High Availablity机制,一旦一个或多个Broker宕机,则宕机期间其上所有Partition都无法继续提供服务.若该Broker永 ...

  9. Kafka学习笔记之Kafka自身操作日志的清理方法(非Topic数据)

    0x00 概述 本文主要讲Kafka自身操作日志的清理方法(非Topic数据),Topic数据自己有对应的删除策略,请看这里. Kafka长时间运行过程中,在kafka/logs目录下产生了大量的ka ...

  10. Kafka学习笔记之Kafka日志删出策略

    0x00 概述 kafka将topic分成不同的partitions,每个partition的日志分成不同的segments,最后以segment为单位将陈旧的日志从文件系统删除. 假设kafka的在 ...

随机推荐

  1. 3DMAX安装失败怎样卸载重新安装3DMAX,解决3DMAX安装失败的方法总结

    技术帖:3DMAX没有按照正确方式卸载,导致3DMAX安装失败.楼主也查过网上关于如何解决3DMAX安装失败的一些文章,是说删除几个3DMAX文件和3DMAX软件注册表就可以解决3DMAX安装失败的问 ...

  2. JAVA内存dump

    # 注意点: # 项目运行的用户 # 使用的jdk版本下的jstack去查看 /opt/jdk1..0_191/bin/jmap -dump:format=b,file=/webser/www/`da ...

  3. 【转】solr deltaImportQuery deltaQuery parentDeltaQuery 用法规则

    solr deltaImportQuery deltaQuery parentDeltaQuery 用法规则 by 建良 · 2013 年 6 月 20 日 query是获取全部数据的SQL delt ...

  4. 2019-7-20-win10-uwp-使用-msbuild-命令行编译-UWP-程序

    title author date CreateTime categories win10 uwp 使用 msbuild 命令行编译 UWP 程序 lindexi 2019-07-20 21:56:2 ...

  5. @atcoder - ARC066F@ Contest with Drinks Hard

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定序列 T1, T2, ... TN,你可以从中选择一些 Ti ...

  6. H3C用Telnet登录

  7. H3C 传输层

  8. supersockets和 AppSession,AppServer 配合工作

    现在, 你已经有了 RequestInfo, ReceiveFilter 和 ReceiveFilterFactory, 但是你还没有正式使用它们. 如果你想让他们在你的程序里面可用, 你需要定义你们 ...

  9. 通过git从码云克隆项目到本地

    1.下载安装Git,傻瓜式下一步下一步即可... 2.配置Git: 2.1.选择你要clone到本地的路径:右键--->$ Git Bash Here,弹出Linux命令窗口:$ cd ~直接回 ...

  10. JS中数组声明

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...