我在两个不同的环境中遇到mongodb数据库和php脚本的问题。
第一个环境在localhost上有x86 mongodb版本。 第二个环境在远程服务器上有x64 mongodb版本。
php脚本是一样的(它在x86 mongodb机器上)。
$mongo = new Mongo("mongodb://IP:27017");
pr($mongo);
$db_mongo = $mongo->my_database;
$collection = $db_mongo->my_collection;
$where = array('$and'=> array(array("NAME" => new MongoRegex("/.*{$name}.*/i")), array("STATUS" => 0)));
$object_results = $collection->find($where)->timeout(100000);
对于localhost,IP为127.0.0.1,对于远程服务器,为188 ....在两个mongodb数据库上都是具有相同数据的相同集合(导入/导出)。
对于两台服务器来说,mongo对象也是一样的....连接1Mongo Object
(
[connected] => 1
[status] =>
[server:protected] =>
[persistent:protected] =>
)
我不明白为什么在本地连接上会返回一些结果,但在远程服务器上它不会返回记录......
P.S。 iptables down ...我可以访问数据库(connected => 1)
答案 0 :(得分:0)
首先,如果您使用的是1.3或更高版本的驱动程序版本,我建议使用MongoClient类代替Mongo(因为已弃用)。
由于您使用MongoCursor::timeout()指定了100,000毫秒,因此脚本的挂起时间不应超过100秒,因为如果在此时间内没有收到服务器的响应,则驱动程序应抛出MongoCursorTimeoutException。 p>
为了进一步调试,我建议先降低超时值,然后比较每个服务器的MongoCursor::explain()输出。解释输出应该清楚一个服务器是否没有为其查询使用索引,正如Sammaye在上面假设的那样。
此外,添加以下内容将允许您收集驱动程序内部活动的日志:
MongoLog::setModule(MongoLog::ALL);
MongoLog::setLevel(MongoLog::ALL);
MongoLog::setCallback('print_mongo_log');
function print_mongo_log($a, $b, $c) { echo $c, "\n"; }