利用扩展的方式在PHP中使用Kafka的教程分享

 更新时间:2023年05月26日 09:24:23   作者:北桥苏  
这篇文章主要为大家详细介绍了如何利用扩展的方式实现在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 &

到此这篇关于利用扩展的方式在PHP中使用Kafka的教程分享的文章就介绍到这了,更多相关PHP使用Kafka内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • PHP7下协程的实现方法详解

    PHP7下协程的实现方法详解

    最近在学习中遇到了协程,发现这类文章介绍的较少,所以下面这篇文章主要给大家介绍了关于PHP7下协程的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2017-12-12
  • php 数组的一个悲剧?

    php 数组的一个悲剧?

    今天由于某篇代码需要修改。没经过测试就上线了,作为多年代码工。出现这种bug太可耻
    2011-05-05
  • php实现Mysql简易操作类

    php实现Mysql简易操作类

    这个PHP实现的mysql的操作类完整版已经使用过了,而这个简化版是经过修改完整版后的简化版,适用在一般的 PHP 应用中,功能上可以实现基本的增删改查的操作,以及打印 MYSQL 错误,自我感觉不错,如果网站应用不是很强大,应用这个 MYSQL 的操作类已经足够了,
    2015-10-10
  • PHP类的封装与继承详解

    PHP类的封装与继承详解

    类是面向对象中的重要概念,而封装和继承是面向对象的重要特点。这篇文章我们就重点讨论一下封装、继承这两个特点,给出一些列子,供大家学习参考。
    2015-09-09
  • PHP共享内存使用与信号控制实例分析

    PHP共享内存使用与信号控制实例分析

    这篇文章主要介绍了PHP共享内存使用与信号控制,结合实例形式分析了php基于shmop扩展实现共享内存的进程间通信以及信号控制等相关操作技巧,需要的朋友可以参考下
    2018-05-05
  • php数组函数序列之array_search()- 按元素值返回键名

    php数组函数序列之array_search()- 按元素值返回键名

    array_search() 函数与 in_array() 一样,在数组中查找一个键值。如果找到了该值,匹配元素的键名会被返回。如果没找到,则返回 false
    2011-11-11
  • 根据中文裁减字符串函数的php代码

    根据中文裁减字符串函数的php代码

    裁减字符串函数有很多,但是根据中文裁减字符串的却很少,在本文将为大家介绍下使用php是如何实现的,感兴趣的朋友不要错过
    2013-12-12
  • 一些PHP写的小东西

    一些PHP写的小东西

    一些PHP写的小东西...
    2006-12-12
  • 4种PHP异步执行的常用方式

    4种PHP异步执行的常用方式

    这篇文章主要介绍了4种PHP异步执行的常用方式,帮助大家更好地分析php异步调用方法,熟练掌握,感兴趣的小伙伴们可以参考一下
    2015-12-12
  • php设计模式 Interpreter(解释器模式)

    php设计模式 Interpreter(解释器模式)

    php设计模式 Interpreter(解释器模式),需要的朋友可以参考下。
    2011-06-06

最新评论