我希望有一个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重置连接
调用堆栈:
Run Code Online (Sandbox Code Playgroud)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
在建立连接后进行分叉,这意味着子进程继承连接,这样父进程和所有子进程最终都使用相同的连接,如果有任何子进程退出(自动关闭连接)或关闭连接,则父进程所有兄弟姐妹突然发现他们不再有联系.
所以不要使用:
$connection->connect();
Run Code Online (Sandbox Code Playgroud)
使用记录较少的文件:
$connection->pconnect();
Run Code Online (Sandbox Code Playgroud)
这将提供持久连接,这样当分叉的子进程关闭连接时,父进程会自动重新打开它.