PHP 的 AMQP 无法往队列里写消息

Titaniums 发布于 2013/07/21 21:18
阅读 1K+
收藏 1
<?php
$queue = 'AMQP_Test_Queue';
$exchange = 'AMQP_Test_Exchange';

$connectionO = new AMQPConnection(['host' => 'localhost', 'port' => '5672', 'vhost' => '/', 'login' => 'guest', 'password' => 'guest']);
$connectionO->connect();

$channelO = new AMQPChannel($connectionO);

$exchangeO = new AMQPExchange($channelO);
$exchangeO->setName($exchange);
$exchangeO->setType(AMQP_EX_TYPE_DIRECT);
$exchangeO->setFlags(AMQP_DURABLE); // 交换器进行持久化,即 RabbitMQ 重启后会自动重建。
$exchangeO->declareExchange(); // AMQP 1.2.0 由 declare() 改为 declareExchange();

$queueO = new AMQPQueue($channelO);
$queueO->setName($queue);
$queueO->setFlags(AMQP_DURABLE); // 队列进行持久化,即 RabbitMQ 重启后会自动重建。
$queueO->declareQueue(); // AMQP 1.2.0 由 declare() 改为 declareQueue();

$queueO->bind($exchange, 'key');

$result = $exchangeO->publish('Test', 'key', AMQP_NOPARAM, array('delivery_mode' => 2));

echo $result;

function test($a, $a2) {
    print_r($a);
    print_r($a2);
}

$queueO->consume('test');

$connectionO->disconnect();
?>


以上脚本中 publish() 死活写不进队列,但又返回 true,即 $result 值是 true。

CentOS 6.3 & PHP 5.5.1 & RabbitMQ 3.1.3 & PCEL AMQP 1.2.0

很诡异,大家有没有遇到过?

以下是问题补充:

@Titaniums:相同的代码,刚在公司的低版本环境中试了试,是完全正常的。看来是环境哪里有问题,好像是 rabbitmq-c 这个 RabbitMQ C 客户端的问题。 (2013/07/22 10:49)
加载中
0
T
Titaniums
而且是要执行 publish() 后,PHP 进程就无法退出,就像哪里阻塞了似的。莫非这是哪个包的 bug?
0
T
Titaniums

好吧,找到问题了。

感谢 google.com
,鄙视 baidu 和 google.hk,去TMD GFW。周末两天时间就浪费在了 baidu 和 google.hk 上了,一直没有想着越过长城去找找解决办法,两天以来一直在墙内寻找着,可一直没找到解决办法。今天实在无奈,抱着试一试的态度就跃过了墙,还真找到原因和解决办法了。感谢美利坚,万恶的GFW。

问题环境:
CentOS 6.3(虚拟机)
PHP 5.5.1
PECL AMQP 1.2.0
rabbitmq-c v0.3
RabbitMQ 3.1.3

问题现象:
1、publish() 发消息返回 true,但并没有投递到队列中去;
2、publish() 发消息时,与 RabbitMQ 的连接变为阻塞模式,PHP 进程无法正常退出;

导致原因:
磁盘空闲空间不够,默认的 RabbitMQ 针对磁盘的空闲空间下限为 1000000000 字节。

我已知的解决办法:
1、增加磁盘空闲空间;
2、在“rabbitmq.config”文件中,通过“disk_free_limit”配置项做出调整。

0
酒逍遥
酒逍遥

一般会有错误日志吧...GFW 确实讨厌...

即使因为某些原因你不得不做这个GFW, 那么你也可以选择性的放一些“后门”在里面.至少让正常技术交流不成问题吧..一股脑全封了,是省事了,可是也留下了千古骂名.何苦来哉

0
赵大尉
赵大尉
磁盘空间不足,确实很意外。
0
T
Titaniums
还是对 RabbitMQ 不够熟悉。不过这个功能设计的感觉不太妥,日志中也没有相关报警提示 ,并且在高并发 http 中往队列里发消息,这个有点危险,因为链接释放不了,PHP进程数会煞升。PHP 超时后,PHP 进程倒是被回收了,但RabbitMQ还在维护着这个异常的链接不会释放。而且极有可能影响到 Web 的正常响应。不过非极端情况下一般是不会出现磁盘空间不足的,也罢。
返回顶部
顶部