PHP AMQP Consume()fork做实际工作

gig*_*sey 4 php amqp rabbitmq

我希望有一个PHP脚本从RabbitMQ队列中消耗(使用PECL AMQP模块),然后分叉以执行实际工作.

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

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

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

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

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

堆栈跟踪:

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

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

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

致命错误:第10行的tmp/forking.php中未捕获的异常'AMQPConnectionException',消息'由peer重置连接'

AMQPConnectionException:第10行的tmp/forking.php中的peer重置连接

调用堆栈:

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
Run Code Online (Sandbox Code Playgroud)

bub*_*bba 5

在建立连接后进行分叉,这意味着子进程继承连接,这样父进程和所有子进程最终都使用相同的连接,如果有任何子进程退出(自动关闭连接)或关闭连接,则父进程所有兄弟姐妹突然发现他们不再有联系.

所以不要使用:

$connection->connect();
Run Code Online (Sandbox Code Playgroud)

使用记录较少的文件:

$connection->pconnect();
Run Code Online (Sandbox Code Playgroud)

这将提供持久连接,这样当分叉的子进程关闭连接时,父进程会自动重新打开它.