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
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脚本