开发环境是docker搭建,地址:https://github.com/rexmolo/docker-dev-env
环境声明
原来的php56是直接拉的公司的做好的容器,其中容器中安装的的 amqp
是 1.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
发起的时候给到 rabbitmq
的channel_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
传递给 amqp
的 AMQPConnection
, 但是我还是会得到上述的报错,通过进一步查询,我发现貌似 amqp
的 1.4
版本没有 channel_max
这个入参接收。你可以通过你的 phpinfo
查看到 amqp
的相关配置参数。其中是没有 channel_max
参数的。
解决
升级 amqp
到 1.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。
如果添加了,直接重启
重启之后,你会在 phpinfo
的 amqp
看到如下 参数,就搞定了。之后再启动生产者进程就可以启动。
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 |