MQ 学习 3 php 代码 操作

<?php
/**
 * Created by PhpStorm.
 * User: ASUS
 * Date: 2018/10/22
 * Time: 19:51
 */

namespace App\Services;
use App\Models\RfImageAttr;
use App\Tools\ApiTools;
use Kafka\Consumer;
use Kafka\ConsumerConfig;
use Kafka\Producer;
use Kafka\ProducerConfig;
use RdKafka\Conf;
use RdKafka\TopicConf;

class KafkaService
{
    private $brokerList = 'xxx:9092,xxx:9092,xxx:9092';

    public function __construct()
    {
        date_default_timezone_set('PRC');
    }

    /*
     * 生产者 发送消息
     *  $config-
     */
    public function producer($topic, $value)
    {
        $config = \Kafka\ProducerConfig::getInstance();
        $config->setMetadataRefreshIntervalMs(10000);
        $config->setMetadataBrokerList($this->brokerList);
        $config->setBrokerVersion('0.11.0.0');

        $config->setRequiredAck(1);
        $config->setIsAsyn(false);
        $config->setProduceInterval(500);
        //异步
        $producer = new \Kafka\Producer(function() use ($value,$topic) {
            return array(
                array(
                    'topic' => $topic,     //注意对应topic
                    'key' => '',
                    'value' => $value,
                ),
            );
        });
        $producer->success(function($result) {
            var_dump($result);
        });
        $producer->error(function($errorCode) {
            \Log::INFO('kafka producer err:'.$errorCode);
        });
        $producer->send(true);

        //同步
//        $producer = new \Kafka\Producer();
//
//        $result = $producer->send(array(
//            array(
//                'topic' => $topic,
//                'value' => $value,
//                'key' => '',
//            ),
//        ));
//        var_dump($result);


//        for($i = 0; $i < 100; $i++) {
//            $result = $producer->send(array(
//                array(
//                    'topic' => $topic,
//                    'value' => $value,
//                    'key' => '',
//                ),
//            ));
//            var_dump($result);
//        }
    }

    /*
     * Consumer
     * 消费 低级
     */
    public function consumer($group,$topicName){

        //方式1
//        $rk = new \RdKafka\Consumer();
//        $rk->setLogLevel(LOG_DEBUG);
//        $rk->addBrokers($this->brokerList);
//
//        $topic = $rk->newTopic($topic);
//        // 参数1消费分区0
//        // RD_KAFKA_OFFSET_BEGINNING 重头开始消费
//        // RD_KAFKA_OFFSET_STORED 最后一条消费的offset记录开始消费
//        // RD_KAFKA_OFFSET_END 最后一条消费
//        $topic->consumeStart(0, RD_KAFKA_OFFSET_BEGINNING);
//
//        while (true) {
//            // 第一个参数是分区号
//            // 第二个参数是超时时间
//            $msg = $topic->consume(0, 1000);
//            if (!empty($msg->err)) {
//                echo $msg->errstr(), "\n";
//                break;
//            } else {
//                echo $msg->payload, "\n";
//            }
//        }
        //方式2

        try {
            $rcf = new \RdKafka\Conf();
            $rcf->set('group.id', $group);
            $cf = new \RdKafka\TopicConf();
            /*
                $cf->set('offset.store.method', 'file');
            */
            $cf->set('auto.offset.reset', 'smallest');
            $cf->set('auto.commit.enable', true);
            $rk = new \RdKafka\Consumer($rcf);
            $rk->setLogLevel(LOG_DEBUG);
            $rk->addBrokers($this->brokerList);
            $topic = $rk->newTopic($topicName, $cf);
            //$topic->consumeStart(0, RD_KAFKA_OFFSET_BEGINNING);
            while (true) {
                $topic->consumeStart(0, RD_KAFKA_OFFSET_STORED);
//                    $topic->consumeStart(0, RD_KAFKA_OFFSET_BEGINNING);
                $msg = $topic->consume(0, 1000);
                if (!empty($msg->err)) {
                    \Log::INFO("kafka customer err : ".$msg->errstr());
                    break;
                } else if(!empty($msg->payload)){
                    $info = $msg->payload;

                    $info = explode('&',$info);

                    if(!empty($info))
                    {
                        $imgInfo = [];
                        foreach ($info as $item)
                        {
                            $itemInfo = explode('=',$item);
                            $imgInfo[$itemInfo[0]] = $itemInfo[1];
                        }
                        //业务处理
                        if(is_array($imgInfo))
                        {
                            $this->parseInfo($topicName,$imgInfo);
                        }else{
                            echo 'is no array';
                        }
                    }


                }
                $topic->consumeStop(0);
                sleep(1);
            }
        } catch (Exception $e) {
            \Log::INFO("kafka customer err : ".$e->getMessage());
        }

        //代码 3

//        $config = \Kafka\ConsumerConfig::getInstance();
//        $config->setMetadataRefreshIntervalMs(10000);
//        $config->setMetadataBrokerList($this->brokerList);
//        $config->setGroupId('test5-group');
//        $config->setBrokerVersion('0.11.0.0');
//        $config->setTopics(array('test5'));
$config->setOffsetReset('earliest');
//        $consumer = new \Kafka\Consumer();
$consumer->setLogger($logger);
//        $consumer->start(function($topic, $part, $message) {
//            var_dump($message);
//        });

//        try {
//            $rcf = new \RdKafka\Conf();
//            $rcf->set('group.id', 'test5-group');
//            $cf = new \RdKafka\TopicConf();
//            /*
//                $cf->set('offset.store.method', 'file');
//            */
//            $cf->set('auto.offset.reset', 'smallest');
//            $cf->set('auto.commit.enable', true);
//            $rk = new \RdKafka\Consumer($rcf);
//            $rk->setLogLevel(LOG_DEBUG);
//            $rk->addBrokers($this->brokerList);
//            $topic = $rk->newTopic($topic, $cf);
//
//            //$topic->consumeStart(0, RD_KAFKA_OFFSET_BEGINNING);
//            while (true) {
//                //RD_KAFKA_OFFSET_STORED
//                $topic->consumeStart(0, RD_KAFKA_OFFSET_STORED);
//                $msg = $topic->consume(0, 1000);
//
//
//                if (!empty($msg->err)) {
//                    echo $msg->errstr(), "\n";
//                    break;
//                } else if(!empty($msg->payload)){
//                    echo "====消费信息===\n";
//                    echo $msg->payload, "\n";
//                }
//                $topic->consumeStop(0);
//                sleep(1);
//            }
//        } catch (Exception $e) {
//            echo $e->getMessage();
//        }
    }

    private function parseInfo($topic,$info)
    {
        switch ($topic)
        {
            case 'image':

                $imgModel = RfImageAttr::getInstance();
                $imgModel->updateParseInfo($info);

                break;
        }
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值