记录Centos下RabbitMQ安装PHP扩展的详细过程以及遇到的各种坑

提前说明:windows环境下安装RabbitMQ PHP扩展最简单了,直接去下载就可以. https://pecl.php.net/package/amqp 里面直接包含二个php_amqp.dll,rabbitmq.4.dll(其中4是当前最新版本的数字);

下面开始Centos环境下的安装过程,安装此扩展花费了我1天的时间,希望在此也能帮助到其他朋友.

测试机:Centos 6.5(64bit)

一、安装rabbitmq-c

1
# git clone https://github.com/alanxz/rabbitmq-c.git
1
# cd rabbitmq-c/
1
2
# mkdir build && cd build
# 这一步是在rabbitmq-c的根目录下创建一个build子目录
1
2
# cmake -DCMAKE_INSTALL_PREFIX=/usr/local/rabbitmq-c ..
# 这一步是让cmake根据../CMakeList.txt,即rabbitmq-c的根目录下的CMakeList.txt创建Makefile文件,Makefile文件会被创建到build目录中
1
2
# cmake --build .  --target install
# 这一步是真正的build rabbitmq-c库的,注意,不要漏掉点 '.'

此时,rabbitmq-c已安装完毕,我们查询一下安装目录/usr/local/rabbitmq-c

1
# whereis rabbitmq-c

二、安装amqp PHP扩展

1
# wget https://pecl.php.net/get/amqp-1.9.3.tgz
1
# tar -xvf amqp-1.9.3.tgz
1
# cd amqp-1.9.3
1
# phpize
1
# ./configure --with-php-config=/usr/local/php/bin/php-config --with-amqp --with-librabbitmq-dir=/usr/local/rabbitmq-c
1
# make && make install

此时,扩展生成完毕啦,大功告成。

三、配置amqp扩展

查找php.ini位置

1
# find / -name 'php.ini'
1
2
# vi /usr/local/php/etc/php.ini
#添加 extension=amqp.so

重走服务即可完成扩展安装,但实际上会遇到另一个问题;请参考下面的坑.

=================================坑在此=====================================
1.rabbitmq-c的安装过程中,一定要记的手工指定安装目录/usr/local/rabbitmq-c
2.rabbitmq-c的安装过程中,命令行中的点”.”千万别漏
3.安装amqp PHP扩展过程中,有些机器会出现以下情况,原因就是rabbitmq-c生成时lib的目录为/usr/local/rabbitmq-c/lib64,此时最好的做法时,直接把/usr/local/rabbitmq-c/lib64改为/usr/local/rabbitmq-c/lib即可.

1
2
3
lrabbitmq  -Wl,-rpath -Wl,/usr/local/rabbitmq-c/lib -Wl,-soname -Wl,amqp.so -o .libs/amqp.so
/usr/bin/ld: cannot find -lrabbitmq
collect2: ld returned 1 exit status

4.在配置amqp扩展时,重起php-fpm服务后,出现了如下错误,提示找不到librabbitmq.so.4,实际上librabbitmq.so.4就在/usr/local/rabbitmq-c/lib64目录下,于是还是参考方法3即可(因为我是在2台机器上分别安装的,所以坑3坑4是出现在不同的机器上,解决方法都是一样的);

1
Starting php-fpm [26-Oct-2017 10:54:53] NOTICE: PHP message: PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/local/php/lib/php/extensions/no-debug-non-zts-20151012/amqp.so' - librabbitmq.so.4: cannot open shared object file: No such file or directory in Unknown on line 0