kafka队列php简单,PHP Kafka 消息队列使用

1. 安装 Kafka 服务

直接到 kafka官网 , 下载最新的

wget https://mirror.bit.edu.cn/apache/kafka/2.5.0/kafka_2.13-2.5.0.tgz

解压,进入目录

tar -zxvf kafka_2.13-2.5.0.tgz

cd kafka_2.13-2.5.0

开始使用

a. 启动 Kafka 服务

使用安装包中的脚本启动单节点 Zookeeper 实例

bin/zookeeper-server-start.sh -daemon config/zookeeper.properties

使用 kafka-server-start.sh 启动 kafka 服务

bin/kafka-server-start.sh config/server.properties

创建 topic

bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test

查看 topic 列表,检查是否创建成功

bin/kafka-topics.sh --list --zookeeper localhost:2181

$ test

生产者,发送消息

bin/kafka-console-producer.sh --broker-list 127.0.0.1:9092 --topic test

服务方面到这里就差不多了,接下来就是php的事了。

2. 安装 PHP 扩展

rdkafka 安装需要依赖 librdkafka , 所以先安装 librdkafka

git clone https://github.com/edenhill/librdkafka.git

cd librdkafka

./configure

make && make install

安装php-rdkafka扩展

git clone https://github.com/arnaud-lb/php-rdkafka.git

cd php-rdkafka

phpize

./configure --with-php-config=/usr/local/Cellar/php@7.2/7.2.24/bin/php-config ## 这里根据自己的情况填写路径

make && make install

在 php-ini 加上

extension=rdkafka.so

重启,php-fpm,就应该可以看到该扩展。

3. 使用

创建一个生产者类

class KafkaProducer

{

public static $brokerList = '127.0.0.1:9092';

public static function send($message, $topic)

{

self::producer($message, $topic);

}

public static function producer($message, $topic = 'test')

{

$conf = new \RdKafka\Conf();

$conf->set('metadata.broker.list', self::$brokerList);

$producer = new \RdKafka\Producer($conf);

$topic = $producer->newTopic($topic);

$topic->produce(RD_KAFKA_PARTITION_UA, 0, json_encode($message));

$producer->poll(0);

$result = $producer->flush(10000);

if (RD_KAFKA_RESP_ERR_NO_ERROR !== $result) {

throw new \RuntimeException('Was unable to flush, messages might be lost!');

}

}

}

创建一个消费类

class KafkaConsumer

{

public static $brokerList = '127.0.0.1:9092';

public static function consumer()

{

$conf = new \RdKafka\Conf();

$conf->set('group.id', 'test');

$rk = new \RdKafka\Consumer($conf);

$rk->addBrokers("127.0.0.1");

$topicConf = new \RdKafka\TopicConf();

$topicConf->set('auto.commit.interval.ms', 100);

$topicConf->set('offset.store.method', 'broker');

$topicConf->set('auto.offset.reset', 'smallest');

$topic = $rk->newTopic('test', $topicConf);

$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:

var_dump($message);

break;

case RD_KAFKA_RESP_ERR__PARTITION_EOF:

echo "No more messages; will wait for more\n";

break;

case RD_KAFKA_RESP_ERR__TIMED_OUT:

echo "Timed out\n";

break;

default:

throw new \Exception($message->errstr(), $message->err);

break;

}

}

}

}

问题汇总

a. No Java runtime present, requesting install

因为 kafka 需要 java 环境支持,所以安装 java 环境。可以到 javase-jdk14-downloads 选择自己的版本进行下载安装

b. 创建 topic 出现:Replication factor: 1 larger than available brokers: 0

意思是至少有一个brokers.也就是说并没有有效的brokers可以用。你要确保你的kafka已经启动了

参考

本作品采用《CC 协议》,转载必须注明作者和本文链接

好好管教自己,不要管别人

1,SDK简介 本SDK是基于ThinkPHP开发类库扩展,因此只能在ThinkPHP平台下使用ThinkPHP版本要求2.0以上)。DEMO中用到了控制器分层,因此运行DEMO需使用ThinkPHP3.1.2版本。 2,目前支持的平台 目前可用登录平台为:腾讯QQ,腾讯微博,新浪微博,网易微博,人人网,360,豆瓣,Github,Google,MSN,点点,百度,开心网,搜狐。 3,包含的文件 ThinkSDK/ThinkOauth.class.php SDK基类,主要用于Oauth的认证,所有平台的SDK均需要继承此类 ThinkSDK/sdk/DiandianSDK.class.php (点点SDK) ThinkSDK/sdk/DoubanSDK.class.php (豆瓣SDK) ThinkSDK/sdk/GithubSDK.class.php (Github SDK) ThinkSDK/sdk/GoogleSDK.class.php (Google SDK) ThinkSDK/sdk/MsnSDK.class.php (MSN SDK) ThinkSDK/sdk/QqSDK.class.php (腾讯QQ SDK) ThinkSDK/sdk/RenrenSDK.class.php (人人网SDK) ThinkSDK/sdk/SinaSDK.class.php (新浪微博SDK) ThinkSDK/sdk/T163SDK.class.php (网易微博SDK) ThinkSDK/sdk/TencentSDK.class.php (腾讯微博SDK) ThinkSDK/sdk/X360SDK.class.php (360 SDK) ThinkSDK/sdk/BaiduSDK.class.php (百度SDK) ThinkSDK/sdk/KaixinSDK.class.php (开心网SDK) ThinkSDK/sdk/SohuSDK.class.php (搜狐SDK) 4,配置格式 SDK的配置格式如下(可参考DEMO中的配置) //将一下(TYPE)换成你对应的SDK类型 'THINK_SDK_(TYPE)' => array( 'APP_KEY' => '', //应用注册成功后分配的 APP ID 'APP_SECRET' => '', //应用注册成功后分配的KEY 'CALLBACK' => '', //注册应用填写的callback ) 5,接入登录方法 添加ThinkPHP扩展,将整个ThinkSDK目录放入到ThinkPHP的扩展目录下~Extend/Library/ORG/~。 添加SDK配置,按以上配置格式在项目配置中添加对应的SDK配置。(可参考DEMO中的配置文件) 跳转到授权页面,导入SDK基类import("ORG.ThinkSDK.ThinkOauth"),获取SDK实例$sdk=ThinkOauth::getInstance($type),跳转到授权页面redirect($sdk->getRequestCodeURL())。(可参考DEMO中的Index/login方法) 获取access_token,在授权成功的回调页面中,调用$sdk->getAccessToken($code, $extend)方法来获取access_token。(可参考DEMO中的Index/callback方法) 6,调用API方法 成功获取到access_token之后就可以调用相应平台的API了,调用方法比较简单,只需要调用$sdk->call($api, $param, $method)方法就可以了,其中:$api为接口名称,$param为接口参数(格式:name1=value1&name2=value2), $method为请求方法(GET或POST)。 例如: import("ORG.ThinkSDK.ThinkOauth"); //导入SDK基类 $qq = ThinkOauth::getInstance('qq', $token); //实例化腾讯QQ开放平台对象 $token 参数为授权成功后获取到的 $token $data = $qq->call('user/get_user_info'); //调用接口
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值