PHP-FPM进程保持MongoDB连接状态

时间:2012-09-14 20:11:22

标签: centos nginx php mongodb

对于我们服务器堆栈的相关部分,我们正在运行:

  • NGINX 1.2.3
  • PHP-FPM 5.3.10 with PECL mongo 1.2.12
  • MongoDB 2.0.7
  • CentOS 6.2

当MongoDB服务器消失(崩溃,被杀等)时,我们会得到一些奇怪但可预测的行为。即使连接代码周围有try/catch块,即:

try
{
    $mdb = new Mongo('mongodb://localhost:27017');
}
catch (MongoConnectionException $e)
{
    die( $e->getMessage() );
}

$db = $mdb->selectDB('collection_name');

根据已经连接到mongo的PHP-FPM工作程序,连接状态被缓存,导致进一步的异常无法处理,因为无法使用$mdb连接处理程序。令人不安的是try在相当长的15分钟之后不会一直失败,当我假设 - php-fpm进程死亡/重生时。

基本上,当你遇到一个尚未连接到mongo的worker时,你会得到上面的die消息,当你连接到一个拥有的worker时,你会得到{{1}的未处理异常因为catch没有运行。

当PHP是单个进程时,即通过带有mod_php的Apache时,不会发生此行为。对于后代来说,回到Apache / mod_php目前不是我们的选择。

有没有办法解决这个问题?我不希望连接状态在不同的php-fpm进程之间不一致。

修改 虽然我等待驱动程序在这方面得到修复,但我目前的解决方法是进行快速轮询,以确定驱动程序是否可以处理请求,然后加载或不加载MongoDB库/运行查询,如果它无法连接/查询:

$mdb->selectDB('collection_name');

1 个答案:

答案 0 :(得分:2)

PHP mongo驱动程序连接代码在1.3版本中得到了重大改进,目前处于beta2版本。根据您的描述,您的问题可能会通过以下修复解决:

https://jira.mongodb.org/browse/PHP-158

https://jira.mongodb.org/browse/PHP-465

一旦发布,您将能够在此处看到完整的修复列表:

https://jira.mongodb.org/browse/PHP/fixforversion/10499

或者,PECL site。如果您可以测试1.3并确认您的问题仍然存在,那么我确信驱动程序开发人员很乐意在1.3.0发布之前收到您的回复,特别是如果它很容易重现。