【问题标题】:PHP AMQP Consume() fork to do actual workPHP AMQP Consume() fork 做实际工作
【发布时间】:2013-03-19 14:20:23
【问题描述】:

我希望有一个 PHP 脚本使用(使用 PECL AMQP 模块)来自 RabbitMQ 队列,然后分叉执行实际工作。

我有代码@https://gist.github.com/giggsey/6666e67bb0e090eeb5f0

但是当我运行它时,我得到:

11296 密钥:USER.12392 ObjectLength:74 在 2013-03-19 分叉 11296

14:16:22 11277 ack() PHP 致命错误:未捕获的异常

'AMQPConnectionException' 在 tmp/forking.php:10 中带有消息'Connection reset by peer'

堆栈跟踪:

0 tmp/forking.php(10): AMQPQueue->consume(Array)

1 tmp/forking.php(102): test->run()

2 {main} 在第 10 行的 tmp/forking.php 中抛出

致命错误:带有消息的未捕获异常“AMQPConnectionException” 第 10 行 tmp/forking.php 中的“对等连接重置”

AMQPConnectionException: Connection reset by peer in tmp/forking.php on line 10

调用栈:

0.0006     665008   1. {main}() tmp/forking.php:0

0.0007     665456   2. test->run() tmp/forking.php:102

0.0359     670504   3. AMQPQueue->consume() tmp/forking.php:10

【问题讨论】:

  • 你试过这个没有叉子的东西吗?
  • @mzedeler 是的,没有分叉它可以正常工作。
  • 您是从 CLI 运行的?
  • @Bubba 是的。 PHP 5.3 与 Peck AMQP 1.0.9

标签: php rabbitmq amqp


【解决方案1】:

你在建立连接后分叉,这意味着孩子正在继承连接,这样父母和所有孩子最终都使用同一个连接,如果有任何孩子退出(这会自动关闭连接)或关闭连接,父母和所有兄弟姐妹突然发现他们不再有联系。

所以不要使用:

$connection->connect();

使用记录较少的:

$connection->pconnect();

这将提供一个持久连接,这样当分叉的子节点关闭连接时,父节点会自动重新打开它。

【讨论】:

  • 呃。阅读是必不可少的。不过,孩子们似乎正在扼杀你的联系。有时间我会玩它 - 这是一个有趣的谜题。
  • 好吧,我写了一个功能示例并更新了提交的答案,希望对你有用!
  • 我想我的问题误导了你。我试图做的是在父母中消费,然后它会分出一个孩子并做一些潜在的繁重工作。
  • 你杀了我! ;-) 所以你想运行一个脚本,在那个脚本中你想实例化一个消耗的队列......然后你希望回调到 fork (阻止父级)直到完成一些工作,在那个 pont 孩子死了,并且父脚本会继续监视队列中的其他内容吗?
  • 这很有趣!谢谢你让我玩。
猜你喜欢
  • 2013-03-07
  • 2019-08-25
  • 1970-01-01
  • 2014-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-24
  • 2015-04-24
相关资源
最近更新 更多