29

我正在开发一个尝试从 PHP 连接到 MongoDB 数据库的 Web 应用程序。在 90% 的页面加载中一切正常,但在其他 10% 中,当我尝试更新集合时,它会引发以下异常:

Fatal error: Uncaught exception 'MongoCursorException' with message 'No such file or directory' in D:\webDev\webSites\str\dev3\_global_classes\User.php:40
Stack trace:
#0 D:\webDev\webSites\str\dev3\_global_classes\User.php(40):
   MongoCollection->update(Array, Array, Array)
#1 D:\webDev\webSites\str\dev3\_init\_init.php(8):
   User->__construct(NULL)
#2 D:\webDev\webSites\str\dev3\index.php(3):
   include('D:\webDev\webSi...')
#3 {main} thrown in D:\webDev\webSites\str\dev3\_global_classes\User.php on line 40

PHP代码:

public function __construct($SESSIONID = null) {        
    User::$_users_collection = Main::$_mongo->selectCollection("users");

     ...   

    $query = array('session_id' => session_id());

    $expiry = time() + Main::$_lifetime;
    $data = array(
        'session_id' => session_id(),
        'expiry' => (string)$expiry,
        'ip' => $_SERVER['REMOTE_ADDR']
    );

    $options = array(
        'upsert' => true,
        'safe' => true
    );

    try {
        User::$_users_collection->update($query, array('$set' => $data), $options);
    } catch (Exception $e) {
        throw $e;
    }

    ...
}

蒙哥版本:

Wed Oct 17 10:53:48 /usr/bin/mongos db version v2.0.7, pdfile version 4.5 starting (--help for usage)
Wed Oct 17 10:53:48 git version: 875033920e8869d284f32119413543fa475227bf
Wed Oct 17 10:53:48 build info: Linux ip-10-2-29-40 2.6.21.7-2.ec2.v1.2.fc8xen #1 SMP Fri Nov 20 17:48:28 EST 2009 x86_64 BOOST_LIB_VERSION=1_41

我的mongo集群只有一个shard,我的php版本是:5.4.4,我的mongo驱动版本是:1.2.12。

4

5 回答 5

2

检查错误代码$e->getCode(); 使用:

    try {
        User::$_users_collection->update($query, array('$set' => $data), $options);
    } catch (MongoCursorException $e) {
    echo "error message: ".$e->getMessage()."\n";
    echo "error code: ".$e->getCode()."\n";
    }

并使用错误代码检查 Mongo 光标异常错误列表: http ://www.php.net/manual/pt_BR/class.mongocursorexception.php

例如,如果您收到错误代码 3 “这可能表明您的 RAM 不足或其他特殊情况。” .

注意:避免使用安全选项,已弃用。使用 WriteConcern w 选项,也会提供更多选项。

关于错误: “由错误访问游标或接收回复错误引起。任何将信息发送到数据库并等待响应的操作都可能引发 MongoCursorException。唯一的例外是 new MongoClient()(创建新连接) ,只会抛出 MongoConnectionExceptions。”(http://php.net/manual/en/class.mongocursorexception.php

于 2013-06-06T16:37:41.347 回答
0

很难知道它发生在哪里,但是这个页面 详细解释了可能导致这个异常的原因

于 2012-12-06T08:59:22.420 回答
0

Mongo DB 库不能安装在 PHP.ini 中

对于窗口

http://www.php.net/manual/en/mongo.installation.php#mongo.installation.windows https://s3.amazonaws.com/drivers.mongodb.org/php/index.html

对于 Linux

http://www.php.net/manual/en/mongo.installation.php#mongo.installation.nix

这有助于我通过 PHP 运行 mongodb

于 2013-05-07T07:19:23.147 回答
0

我已经看到了很多这个错误,这是有道理的:

当游标迭代期间出现TIMEOUT时,MongoDB 会引发游标异常。也就是说,如果您在 Mongo 上针对大型数据集发出查询,则分配一个游标。然后,您遍历光标,一次检索一个结果,这是正常的光标行为。 但是,如果您在足够长的时间后仍在检索结果,则会收到上述消息。

解决这个问题的方法可能有两件事:

  • (应用层)将您的结果检索到一个临时集合中并对其进行迭代(丑陋);
  • (连接层)在查询之前将超时设置得更高(假设有可能会更好)。

请注意,您的结果可能会有所不同,祝您好运。

于 2013-06-04T14:54:18.663 回答
0

很可能,PHP Mongo 客户端在连接到实际的 MongoDB 时遇到了故障。

正如您在其他地方所说(https://groups.google.com/forum/?fromgroups=#!topic/mongodb-user/wqcCNQgiJAQ),您通过 VMWare 运行 MongoDB,这可能会不时导致连接问题。

于 2013-05-14T09:05:04.633 回答