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

Centos 保持MongoDB连接状态的PHP-FPM进程,centos,nginx,php,mongodb,Centos,Nginx,Php,Mongodb,对于服务器堆栈的相关部分,我们正在运行: NGINX 1.2.3 带有PECL mongo 1.2.12的PHP-FPM 5.3.10 MongoDB 2.0.7 CentOS 6.2 当MongoDB服务器离开(崩溃、死亡等)时,我们会出现一些奇怪但可预测的行为。即使在连接代码周围有try/catch块,即: try { $mdb = new Mongo('mongodb://localhost:27017'); } catch (MongoConnectionException

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

  • NGINX 1.2.3
  • 带有PECL mongo 1.2.12的PHP-FPM 5.3.10
  • 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');
根据哪些PHP-FPM工作人员已经连接到mongo,连接状态会被缓存,从而导致更多异常无法处理,因为无法使用
$mdb
连接处理程序。令人不安的是,
try
在相当长的一段时间内(最多15分钟后)并不会一直失败,我假设php fpm进程会死掉/重生

本质上,这种行为是当您点击一个尚未连接到mongo的工作进程时,您会收到上面的死亡消息,当您连接到一个已连接的工作进程时,您会从
$mdb->selectDB('collection_name')收到一个未经处理的异常因为catch不运行

当PHP是单个进程时,即通过Apache和mod_PHP,不会发生这种行为。只是为了子孙后代,回到Apache/mod_php现在不是我们的选择

有没有办法修复这种行为?我不希望不同php fpm进程之间的连接状态不一致

编辑: 在我等待驱动程序在这方面得到修复的同时,我当前的解决方法是进行快速轮询,以确定驱动程序是否能够处理请求,然后在无法连接/查询时加载或不加载MongoDB库/运行查询:

try
{
    // connect
    $mongo = new Mongo("mongodb://localhost:27017");

    // try to do anything with connection handle
    try
    {
        $mongo->YOUR_DB->YOUR_COLLECTION->findOne();
        $mongo->close();
        define('MONGO_STATE', TRUE);
    }
    catch(MongoCursorException $e)
    {
        $mongo->close();
        error_log('Error connecting to MongoDB: ' . $e->getMessage() );
        define('MONGO_STATE', FALSE);
    }
}
catch(MongoConnectionException $e)
{
    error_log('Error connecting to MongoDB: ' . $e->getMessage() );
    define('MONGO_STATE', FALSE);
}

PHP mongo驱动程序连接性代码在1.3版本中得到了很大的改进,在撰写本文时,该版本目前在beta2中。根据您的描述,您的问题可以通过以下修复程序解决:

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


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

感谢您提供的信息,我现在将考虑关闭持续连接。我不认为这个问题已经解决了,但是如果没有其他问题的话,我会回来标记你的答案。我会把你的答案标记为正确的,因为这似乎不是真正的固定,直到司机被更新。谢谢你的帮忙。我用我的解决方法更新了我的问题。对我来说,同样的事情,谢谢你提供的信息,我花了2个小时才发现Mongo服务器关闭了,php fpm日志中没有任何内容-(现在设置nagios脚本