rabbitmq中消费进程无法启动,PHP的amqp升级 for docker

开发环境是docker搭建,地址:https://github.com/rexmolo/docker-dev-env

环境声明

原来的php56是直接拉的公司的做好的容器,其中容器中安装的的 amqp1.4 版本的,而我的rabbitmq容器用的是3.7.5,

问题

今天开发测试rabbitmq的时候,当我在命令行执行nohup试图启动生产者进程的时候发现进程自动退出了。

查看rabbitmq容器日志,通过docker logs rabbitmq 查看日志发现如下信息:

1
amqp_error,not_allowed,"negotiated channel_max = 0 is higher than the maximum allowed value (2047)

得知是因为 amqp 发起的时候给到 rabbitmqchannel_max=0 而导致的,之后马上查看了PHP代码

1
$this->connect = new AMQPConnection(array('host' =>'rabbitmq', 'port' =>5672, 'vhost' =>'/', 'login' =>'guest', 'password' => 'guest'));

查看源码得知,还有个参数叫 channel_max, 当为0的时候,rabbitmq是不允许的,为0的时候意味着无限大,可能会引起一些问题。我猜 rabbitmq 大概是在某个版本之后修复的这个问题。遂修改代码如下

1
$this->connect = new AMQPConnection(array('host' =>'rabbitmq', 'port' =>5672, 'vhost' =>'/', 'login' =>'guest', 'password' => 'guest', 'channel_max' => 20));

可以看到我新增了 channel_max=20 传递给 amqpAMQPConnection , 但是我还是会得到上述的报错,通过进一步查询,我发现貌似 amqp1.4 版本没有 channel_max 这个入参接收。你可以通过你的 phpinfo 查看到 amqp的相关配置参数。其中是没有 channel_max 参数的。

解决

升级 amqp1.9

测试是否安装 gcc

gcc --version

未安装的话,执行如下命令安装

yum install gcc librabbitmq-devel

获取amqp安装包

如下地址去找到你需要的版本 http://pecl.php.net/package/amqp

依次执行如下命令:

  • wget http://pecl.php.net/get/amqp-1.9.3.tgz

  • tar -zxvf amqp-1.9.3.tgz

  • cd amqp-1.9.3

  • phpize

注意phpize 这个命令,如果多版本的话,安装在不同目录, 你应该执行你需要的用的php版本,

例如我的是/usr/local/php56/bin/phpize
执行该命令可能会遇到 autoconf 未安装,centos执行 yum install autoconf ,其它系统类似,自行查询安装即可

  • ./configure --with-amqp --with-php-config=/usr/local/php56/bin/php-config

上面的命令 --with-php-config=/usr/local/php56/bin/php-config 也是指定你的php版本目录

  • make && make install

  • make test

如果你的 php.ini 中没有加载 extension=amqp.so 你需要添加上去。之后重启 php。

如果添加了,直接重启

重启之后,你会在 phpinfoamqp 看到如下 参数,就搞定了。之后再启动生产者进程就可以启动。

Version 1.9.3
Revision release
Compiled Apr 4 2019 @ 03:12:30
AMQP protocol version 0-9-1
librabbitmq version 0.5.2
Default max channels per connection 256
Default max frame size 131072
Default heartbeats interval 0
Directive Local Value Master Value
amqp.auto_ack 0 0
amqp.cacert no value no value
amqp.cert no value no value
amqp.channel_max 256 256
amqp.connect_timeout 0 0
amqp.frame_max 131072 131072
amqp.heartbeat 0 0
amqp.host localhost localhost
amqp.key no value no value
amqp.login guest guest
amqp.password guest guest
amqp.port 5672 5672
amqp.prefetch_count 3 3
amqp.read_timeout 0 0
amqp.timeout no value no value
amqp.verify 1 1
amqp.vhost / /
amqp.write_timeout 0 0
Author: rexmolo
Link: http://rexmolo.github.io/2019/04/06/install-or-upgrade-amqp-for-docker/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.