一、说明
RocketMq是一个由阿里巴巴开源的消息中间件,脱胎去阿里内部使用的MetaQ,在设计上借鉴了Kafka。2012年开源,2017年成为apache顶级项目。 rocketmq默认只提供了长连接的服务,并且阿里只给了java版本的sdk, 对于其他语言的sdk一直都由开源社区进行维护,盼了这么久,终于找到了php的rocketmq扩展,肥了九牛二虎之力,终于编译成功。在此做个回顾和记录。
php的Rocketmq扩展并不是直连rocketmq服务,而是php连接php-rocketmq扩展,php-rocketmq扩展再连接cpp-rocketmq扩展,最终通过cpp连接到rocketmq服务,不过鉴于cpp和c语言的运行效率很高,其实PHP扩展本身的性能还OK。
二、安装基础依赖
要确保系统安装的gcc版本支持全功能VC++11,一般gcc版本大于8.0均支持VC++11, 此外还需要安装cmake服务
apt-get install gcc cmake automake libtool
三、安装CPP-Rocketmq扩展(C++的rocketmq扩展)
RocketMQ-Client-CPP安装
cd /data/rocketmq
git clone https://github.com/apache/rocketmq-client-cpp.git
cd rocketmq-client-cpp/
sh build.sh 这里脚本会自动编译和安装服务
在国内,该扩展相关文件下载很慢, 直接编译容易超时,建议科学上网,下载代码库压缩包
boost_1_58_0.ziphttps://download.youkuaiyun.com/download/ma_jian_ping/88359995
rocketmq-client-cpp-master.ziphttps://download.youkuaiyun.com/download/ma_jian_ping/88360049
四、安装PHP-CPP依赖(支持编译cpp编写的php扩展)
git clone https://github.com/CopernicaMarketingSoftware/PHP-CPP.git
cd PHP-CPP
mv ../php-7.2.17/zend ./zend //需要用对应版本的php源码目录里面的zend覆盖PHP-CPP目录下的zend, 这样才能编译当前版本可用的扩展
ln -s ../php7.2.17/php-config /usr/bin/php-config //编译PHP-CPP默认需要暴露php-config命令,Makefile里面用到了该命令的返回值
make
make install
php的扩展一般是c语言写的,该依赖可以支持编译c++写的php扩展,为下一步做准备
jsoncpp-0.10.7.ziphttps://download.youkuaiyun.com/download/ma_jian_ping/88359991
PHP-CPP-2.2.0.tar.gzhttps://download.youkuaiyun.com/download/ma_jian_ping/88359915
五、安装PHP-RocketMQ扩展(PHP的Rocketmq扩展)
git clone https://github.com/lpflpf/rocketmq-client-php
cd rocketmq-client-php
mkdir -p /usr/include/phpcpp //创建php-cpp的C++编译依赖目录
mv PHP-CPP/include/* /usr/include/phpcpp/ //移动第3步中php-cpp源码下的include目录的全部内容到C++编译依赖目录
mv PHP-CPP/phpcpp.h /usr/include/ //移动phpcpp.h头文件到C++编译依赖默认目录
make
make install
libevent-release-2.0.22-stablehttps://download.youkuaiyun.com/download/ma_jian_ping/88359921
六、添加PHP扩展,测试扩展
第三步编译结束会生成以下文件:librocketmq.so
第四步编译结束会生成以下文件:libphpcpp.so.2.2.0
第五步编译结束会生成以下文件:rocketmq.so
然后执行以下操作:
mv libphpcpp.so.2.2.0 /usr/lib/libphpcpp.so.2.2
mv librocketmq.so /usr/lib/librocketmq.so
mv rocketmq.so /php/extensions/rocketmq.so //自己的php扩展目录自己更改路径
echo "extension=rocketmq.so" >> /php/config/php.ini //php配置文件开启扩展
php -m //测试php扩展是否可见
七、可能遇到的问题
问题1:第三步执行编译脚本的时候发现报错,报错如下图
解决:编辑文件/data/rocketmq/rocketmq-client-cpp/tmp_down_dir/jsoncpp-0.10.6/src/lib_json/json_reader.cpp,如下图:
问题2:在解决第一个问题的时候遇到了,无论怎么改都会重复bug的问题,改完还报错,难道修改的文件不对吗?
解决: 因为在执行build.sh的时候,该脚本每次都是重新拉取jsoncpp-0.10.6模块,然后再重新解压,这样就会覆盖掉我们在第一个问题的解决方案中修改的文件,导致修改不生效,所以我们要阻止build.sh每次都重新拉取jsoncpp-0.10.6 ,修改build.sh文件如下图:
问题3:在编译完成后,添加完php扩展配置,进行“PHP -m“测试的时候,rocketmq扩展报错
解决:报这个错误的原因是和php的安装路径有关,因为在编译扩展过程中需要用到php-config程序返回的php配置信息,如果你的php-config返回的配置异常,就会导致扩展编译后的状态不正常,如下图,这需要你重新编译php,重新配置该参数,然后再重新编译rocketmq扩展(或者直接用apt安装php,这样各种参数都是配置好的,不用关心这么多配置)
这个地方废了我好多时间,深层次的原因还没有找到,重新编译php后这个问题没有再出现,以后有机会再深究吧!