我在两个不同的环境中遇到了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);
IP本地主机为127.0.0.1,远程服务器为188。在两个mongodb数据库上都是具有相同数据的相同集合(导入/导出)。
mongo对象列表对于这两个服务器也是相同的。。。。连接1个
Mongo Object
(
[connected] => 1
[status] =>
[server:protected] =>
[persistent:protected] =>
)
我不明白为什么在本地连接上它会返回一些结果,但在远程服务器上它不会返回记录。。。
p.S.iptables向下。。。我可以访问数据库(已连接=>1)
首先,如果您使用1.3或更高版本的驱动程序,我建议使用MongoClient类来代替Mongo(已弃用)。
由于您已经使用MongoCursor::timeout()指定了100000毫秒,因此脚本的挂起时间不应超过100秒,因为如果在该时间内没有收到服务器的响应,驱动程序应该抛出MongoCursor TimeoutException。
为了进一步调试,我建议首先降低超时值,然后比较每个服务器的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"; }