0

我在两个不同的环境中遇到了 mongodb 数据库和 php 脚本的问题。

第一个环境在本地主机上有 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 用于 localhost 和 188.... 用于远程服务器。在两个 mongodb 数据库上都是具有相同数据(导入/导出)的相同集合。

两个服务器的 mongo object ist 也是相同的....connected 1

Mongo Object
(
    [connected] => 1
    [status] => 
    [server:protected] => 
    [persistent:protected] => 
)

我不明白为什么在本地连接上它返回一些结果,但在远程服务器上它不返回记录......

PS iptables down ...我可以访问数据库(已连接=> 1)

4

1 回答 1

0

首先,如果您使用的是 1.3 或更新版本的驱动程序,我建议使用 MongoClient 类代替 Mongo(因为已弃用)。

由于您使用MongoCursor::timeout()指定了 100,000 毫秒,因此脚本不应挂起超过 100 秒,因为如果驱动程序在该时间内未收到来自服务器的响应,则应抛出 MongoCursorTimeoutException。

为了进一步调试,我建议首先降低超时值,然后比较每个服务器的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"; }
于 2013-08-20T19:21:54.440 回答