开发环境是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.tgztar -zxvf amqp-1.9.3.tgzcd amqp-1.9.3phpize
注意
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 installmake 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 |