AMQP - 连接超时

5

当我尝试从RabbitMQ接收答案时,出现了错误。

2015-07-03 09:31:12 [10.1.101.55][-][-][error][PhpAmqpLib\Exception\AMQPTimeoutException] exception 'PhpAmqpLib\Exception\AMQPTimeoutException' with message 'The connection timed out after 30 sec while awaiting incoming data' in /opt/www/site.ll/vendor/php-amqplib/PhpAmqpLib/Wire/AMQPReader.php:130
Stack trace:
#0 /opt/www/site.ll/vendor/php-amqplib/PhpAmqpLib/Wire/AMQPReader.php(147): PhpAmqpLib\Wire\AMQPReader->wait()
#1 /opt/www/site.ll/vendor/php-amqplib/PhpAmqpLib/Wire/AMQPReader.php(105): PhpAmqpLib\Wire\AMQPReader->rawread(7)
#2 /opt/www/site.ll/vendor/php-amqplib/PhpAmqpLib/Connection/AbstractConnection.php(528): PhpAmqpLib\Wire\AMQPReader->read(7)
#3 /opt/www/site.ll/vendor/php-amqplib/PhpAmqpLib/Connection/AbstractConnection.php(568): PhpAmqpLib\Connection\AbstractConnection->wait_frame(30)
#4 /opt/www/site.ll/vendor/php-amqplib/PhpAmqpLib/Channel/AbstractChannel.php(198): PhpAmqpLib\Connection\AbstractConnection->wait_channel(1, 30)
#5 /opt/www/site.ll/vendor/php-amqplib/PhpAmqpLib/Channel/AbstractChannel.php(332): PhpAmqpLib\Channel\AbstractChannel->next_frame(30)

当我尝试从我的本地电脑接收答案时,它可以工作,但在生产服务器上却不行。

为什么会这样,我该如何修复它呢?

谢谢!


请检查MQ通道的端口是否被阻止,或者MQ服务本身是否正在运行? - khakiout
它正在运行。AMQP接收到我的消息并启动了处理,但我没有收到答案。AMQP调用回调函数42次,但没有我的请求。然后我收到了异常。 - user2264941
在本地电脑上,我可以在4秒内收到答案。 - user2264941
如果您可以在本地连接但无法连接到远程服务器,可能是因为您正在使用“guest”用户帐户。请参阅https://www.rabbitmq.com/access-control.html。 - old_sound
不,这是远程服务器。 - user2264941
显示剩余3条评论
2个回答

9

确保设置了正确的端口。默认端口是5672(不是Web界面的15672端口)。


1
这在我的情况下是答案。 - tolga
有什么区别? - biplab rout
1
Web界面是您可以从浏览器登录RabbitMQ管理面板的地方,例如:your-site.com:15672。这与应用程序需要连接到消息服务器本身以发布、消费等的端口不同。为此,应配置5672端口。 - Gerard de Visser

2

ConnectionReadWrite的默认超时时间为3秒。在开发过程中,您的请求处理速度比生产环境要快,因此您无法在开发过程中看到此错误消息。

如果您需要更长的超时时间(就像我一样),则可以在创建AMQPStreamConnection实例时进行设置:

$connection = new AMQPStreamConnection(
        'localhost',
        5672,
        'guest',
        'guest',
        '/',
        false,
        'AMQPLAIN',
        null,
        'en_US',
        30, //Connection Timeout
        30 // Read/Write Timeout
);

上面的代码将ConnectionReadWrite超时设置为30秒,在我的情况下这是合理的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接