详解Laravel中Kafka的使用实例是什么样的
Admin 2022-09-22 群英技术资讯 1068 次浏览
这篇主要是介绍“详解Laravel中Kafka的使用实例是什么样的”的内容了,下文有实例供大家参考,对大家了解操作过程或相关知识有一定的帮助,而且实用性强,希望这篇文章能帮助大家解决详解Laravel中Kafka的使用实例是什么样的的问题,下面我们一起来了解看看吧。
本文并没有kafka的安装教程,本文是针对已经安装kafka及其配置好kafka的php拓展并且使用laravel框架进行开发项目,配置一个可供laravel框架使用的生产及消费者类.
以下代码修改自本站的YII框架关于kafka类的代码,经过测试使用在本人的项目中,可正常运行,larvael版本:5.6 代码放置larvael框架位置:app/Tools/Kafka.php
<?php
namespace App\Tools;
use Illuminate\Config\Repository;
use Illuminate\Support\Facades\DB;
use Monolog\Logger;
use Monolog\Handler\StreamHandler;
use Illuminate\Http\Request;
class Kafka
{
public $broker_list = '127.0.0.1';//配置kafka,可以用逗号隔开多个kafka
public $topic = 'test';//管道名称
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)
{
$topic = $this->producer->newTopic($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);
}
}
}
?>
在控制器中如何使用:
首先再头部导入这个类:use App\Tools\Kafka;
下面是使用生产者实例:
public function test(){
$topic = 'tool';//输入使用管道名称
$data['shop_id'] = 58;
$data['bar_code']=586;
$data['goods_num'] = 1;
$data['goods_unit'] = '个';
$Kafka = new Kafka();
$Error_Msg = $Kafka->send($data,$topic);//传入数组会自动转换json
var_dump($Error_Msg);
}
下面是消费者实例,消费者我这里使用了的是php脚本进行的操作:
<?php
$conf = new RdKafka\Conf();
$conf->set('group.id', 'myConsumerGroup');
$rk = new RdKafka\Consumer($conf);
$rk->addBrokers("localhost: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("tool", $topicConf);//读取的管道
// Start consuming partition 0
$topic->consumeStart(0, RD_KAFKA_OFFSET_STORED);
while (true) {
$message = $topic->consume(0, 120*10000);
switch ($message->err) {
case RD_KAFKA_RESP_ERR_NO_ERROR:
//没有错误打印信息
$message = json_decode(json_encode($message),true);
$data = json_decode($message['payload'],true);
var_dump($data);
break;
case RD_KAFKA_RESP_ERR__PARTITION_EOF:
echo "等待接收信息\n";
break;
case RD_KAFKA_RESP_ERR__TIMED_OUT:
echo "超时\n";
break;
default:
throw new \Exception($message->errstr(), $message->err);
break;
}
sleep(1);
}
?>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
如何写出优雅耐看的PHP代码?本篇文章带大家了解一下PHP代码的基本书写规范和框架规范,了解它们让你的PHP代码优雅一个档次!
swoole退出的方法:使用“Server->stop”方法退出,其中$waitEvent参数可以控制退出策略,默认为false表示立即退出,设置为true表示等待事件循环为空时再退出。
在PHP中,您可以在服务器执行PHP文件之前在该文件中插入一个文件的内容。include和require语句用于在执行流中插入写在其他文件中的有用的代码。include和require除了处理错误的方式不同之外,在其他方面都是相同的:
在PHP7之后,PHP中加入了匿名类的特性。匿名类和匿名方法让PHP成为了更现代化的语言,也让我们的代码开发工作越来越方便。下面本篇文章就来简单带大家了解一下PHP7 匿名类的用法,希望对大家有所帮助!
今天小编就为大家分享一篇关于PDO::query讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
成为群英会员,开启智能安全云计算之旅
立即注册关注或联系群英网络
7x24小时售前:400-678-4567
7x24小时售后:0668-2555666
24小时QQ客服
群英微信公众号
CNNIC域名投诉举报处理平台
服务电话:010-58813000
服务邮箱:service@cnnic.cn
投诉与建议:0668-2555555
Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 ICP核准(ICP备案)粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008