以下操作在 Ubuntu 16.04 下进行,其他系统可能略有不同:

安装kafka

  1. 配置防火墙,开启9092端口,编辑 \etc\iptables.up.rules 文件,添加一行:
1
-A INPUT -p tcp -m state --state NEW -m tcp --dport 9092 -j ACCEPT

保存后执行:

1
iptables-apply /etc/iptables .up.rules
  1. Ubuntu 16.04 自带 JDK,其他系统如果未安装则需要安装。

  2. 安装 kafka

kafka 最新的发行版本下载地址可以在 http://archive.apache.org/dist/kafka/ 里找。

1
2
3
4
cd /tmp
wget http: //archive .apache.org /dist/kafka/0 .10.0.0 /kafka_2 .11-0.10.0.0.tgz
tar -xzvf kafka_2.11-0.10.0.0.tgz
mv kafka_2.11-0.10.0.0 /usr/local/kafka
  1. 启动 zookeeper 和 kafka

这两者的配置这里就先不研究了,直接启动试试看:

1
2
nohup /usr/local/kafka/bin/zookeeper-server-start .sh /usr/local/kafka/config/zookeeper .properties &
nohup /usr/local/kafka/bin/kafka-server-start .sh /usr/local/kafka/config/server .properties &

安装PHP相关扩展

zookeeper 扩展
  1. 安装 libzookeeper_mt
1
2
3
4
5
6
cd /tmp
wget -N http: //archive .apache.org /dist/zookeeper/zookeeper-3 .4.6 /zookeeper-3 .4.6. tar .gz; tar zxvf zookeeper-3.4.6. tar .gz; rm -f zookeeper-3.4.6. tar .gz
cd zookeeper-3.4.6 /src/c
. /configure --prefix= /usr/local/zookeeper
make
sudo make install
  1. 安装 PHP 的 zookeeper 扩展:
1
2
3
4
5
6
7
8
cd /tmp
gid clone https: //github .com /jbboehr/php-zookeeper .git
# 如果是 PHP7:
# git checkout php7
phpize
. /configure --with-php-config= /usr/local/php/bin/php-config  --with-libzookeeper- dir = /usr/local/zookeeper
make
sudo make install

然后就可以使用这个包了:https://github.com/nmred/kafka-php

rdkafka 扩展
  1. 安装 librdkafka:
1
2
3
4
5
6
cd /tmp
wget -N https: //github .com /edenhill/librdkafka/archive/master .zip -O librdkafka.zip; unzip librdkafka.zip; rm -f librdkafka.zip
cd librdkafka-master
. /configure
make
sudo make install
  1. 安装 php-rdkafka 扩展:
1
2
3
4
5
6
7
8
git clone https: //github .com /arnaud-lb/php-rdkafka .git
cd php-rdkafka
# 如果是 PHP7
# git checkout php7
phpize
. /configure
make all -j 5
sudo make install


          
          
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

配置php.ini并重启php-fpm

PHP.ini中添加

extension=rdkafka.so
          
          
  • 1
  • 1

PHP消费

参考https://github.com/arnaud-lb/php-rdkafka

$rk = new RdKafka\Consumer();(在yii2中,使用绝对路径$rk = new \RdKafka\Producer();)
$rk->setLogLevel(LOG_DEBUG);
$rk->addBrokers("127.0.0.1");

$topic = $rk->newTopic("test");
$topic->consumeStart(0, RD_KAFKA_OFFSET_BEGINNING);

while (true) {
    // The first argument is the partition (again).
    // The second argument is the timeout.
    $msg = $topic->consume(0, 1000);
    if($msg==NULL){
        sleep(1);
    }
    else{
        echo '#'.$msg->payload."#\n";
    }
}
          
          
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

参考


参考文档: