对于我们服务器堆栈的相关部分,我们正在运行:
当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');
答案 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发布之前收到您的回复,特别是如果它很容易重现。