首页 > 编程 > PHP > 正文

php kafka使用

2020-03-22 18:41:18
字体:
来源:转载
供稿:网友
这篇文章主要介绍了php kafka使用 ,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下

一、安装以及使用shell命令终端操作kafka
环境配置
1、下载最新版本的kafka: kafka_2.11-1.0.0.tgz
http://mirrors.shu.edu.cn/apache/kafka/1.0.0/kafka_2.11-1.0.0.tgz

2、配置,解压后进入config目录
2.1、配置zookeeper.properties
默认监听端口2181

2.2、配置server.properties
开启监听端口,比如监听本地
listeners=PLAINTEXT://10.168.1.99:9092

3、启动
3.1、启动zookeeper
./bin/zookeeper-server-start.sh config/zookeeper.properties

3.2、启动server
./bin/kafka-server-start.sh config/server.properties

此处启动server时报错内存不足,解决方案要么加大系统内存,要么调小kafka需求内存
我这是调小kafka启动所需内存大小
vim kafka-server-start.sh
把其中:export KAFKA_HEAP_OPTS="-Xmx1G -Xms1G"
改为:export KAFKA_HEAP_OPTS="-Xmx512M -Xms512M"

4、启动测试的消费者,并监听topic的test
./bin/kafka-console-consumer.sh --zookeeper 10.168.1.99:2181 --topic test --from-beginning

5、启动测试的生产者,并监听topic的test
./bin/kafka-console-producer.sh --broker-list 10.168.1.99:9092 --topic test

此时,在生产者中输入数据后回车后,在消费者终端可以看到生产者产生的信息


二、使用PHP操作kafka

1、安装kafka的扩展php-rdkafka
1.1、在安装php-rdkafka之前,需要先安装librdkafka
git clone http://github.com/edenhill/librdkafka.git
./configure
make && make install

1.2、安装php-rdkafka
git clone http://github.com/arnaud-lb/php-rdkafka.git
cd php-rdkafka
phpize
./configure
make && make install

2、编写kafka生产者和消费者类


<?php/** * Kafka.php. * User: lvfk * Date: 2018/2/7 0007 * Time: 11:04 * Desc: Kafka服务 */namespace app/models;use yii/base/InvalidConfigException;html' target='_blank'>class Kafka{    public $broker_list = '10.168.1.99:9092';//配置kafka,可以用逗号隔开多个kafka    public $topic = 'topic';    public $partition = 0;    protected $producer = null;    protected $consumer = null;    public function __construct()    {        if (empty($this->broker_list)) {            throw new InvalidConfigException("broker not config");        }        $rk = new /RdKafka/Producer();        if (empty($rk)) {            throw new InvalidConfigException("producer error");        }        $rk->setLogLevel(LOG_DEBUG);        if (!$rk->addBrokers($this->broker_list)) {            throw new InvalidConfigException("producer error");        }        $this->producer = $rk;    }    /**     * 生产者     * @param array $messages     * @return mixed     */    public function send($messages = [])    {        $topic = $this->producer->newTopic($this->topic);        return $topic->produce(RD_KAFKA_PARTITION_UA, $this->partition, json_encode($messages));    }    /**     * 消费者     */    public function consumer($object, $callback){        $conf = new /RdKafka/Conf();        $conf->set('group.id', 0);        $conf->set('metadata.broker.list', $this->broker_list);        $topicConf = new /RdKafka/TopicConf();        $topicConf->set('auto.offset.reset', 'smallest');        $conf->setDefaultTopicConf($topicConf);        $consumer = new /RdKafka/KafkaConsumer($conf);        $consumer->subscribe([$this->topic]);        echo "waiting for messages...../n";        while(true) {            $message = $consumer->consume(120*1000);            switch ($message->err) {                case RD_KAFKA_RESP_ERR_NO_ERROR:                    echo "message payload....";                    $object->$callback($message->payload);                    break;            }            sleep(1);        }    }}


3、配置


//配置kafka生产者'asyncLog' => [    'class' => '//app//models//Kafka',    'broker_list' => '10.168.1.99:9092',    'topic' => 'asynclog']


4、在业务代码中生产消息
/Yii::$app->asyncLog->send(['this is IndexController,'.date('y-md H:i:s',time())]);


5、在yii的command中消费

5.1、编写KafkaController.php


<?php/** * @link http://www.yiiframework.com/ * @copyright Copyright (c) 2008 Yii Software LLC * @license http://www.yiiframework.com/license/ */namespace app/commands;use yii/console/Controller;/** * This command echoes the first argument that you have entered. * * This command is provided as an example for you to learn how to create console commands. * * @author Qiang Xue <qiang.xue@gmail.com> * @since 2.0 */class KafkaController extends Controller{    /**     * This command echoes what you have entered as the message.     * @param string $message the message to be echoed.     */    public function actionConsume()    {        /Yii::$app->asyncLog->consumer($this, 'callback');    }    public function callback($message)    {        /Yii::info($message, 'testkafka');        /Yii::$app->log->setflushInterval(1);    }}


5.2、运行:
./yii kafka/consume


6、当第4步中生产数据后,在第5步的终端可以消费数据


相关推荐:

php发送数据到kafka实现代码

linux下php扩展kafka的实例分享

以上就是php kafka使用 的详细内容,更多请关注 其它相关文章!

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表