PHP+;MongoDB:未捕获异常';MongoCursorException';带有消息';没有这样的文件或目录';

PHP+;MongoDB:未捕获异常';MongoCursorException';带有消息';没有这样的文件或目录';,php,mongodb,mongodb-php,Php,Mongodb,Mongodb Php,我正在开发一个web应用程序,它试图从PHP连接到MongoDB数据库。 在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: #

我正在开发一个web应用程序,它试图从PHP连接到MongoDB数据库。 在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;
    }

    ...
}
Mongo版本:

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集群只有一个碎片,我的php版本是:5.4.4,我的mongo驱动程序版本是:1.2.12。

很难知道它发生在哪里,但是
详细解释了导致在PHP.ini中安装此异常的原因

窗户

对于Linux


这有助于我通过PHP运行mongodb可能是因为PHP Mongo客户端在连接到实际的mongodb时遇到了故障


正如您在其他地方()所述,您通过VMWare运行MongoDB,这可能会时不时地导致连接问题。

我经常看到这个错误,这很有意义:

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

解决这一问题的办法可以是两件事:

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

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

检查错误代码$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游标异常错误列表:

例如,如果您得到错误代码3,“这可能表明您的内存不足或其他一些特殊情况。”

注意:避免使用安全选项,不推荐使用。使用WriteConcern w选项,也将提供更多选项

关于错误: “由于错误访问光标或接收回复时出错而导致。 任何向数据库发送信息并等待响应的操作都可能引发MongoCorSoreException。唯一的异常是new MongoClient()(创建新连接),它只会引发MongoConnectionException。
“()

MongoDB服务器日志中是否有相关内容?Mongo客户端PECL版本为1.3.6。我建议尝试更晚的版本,因为这已经在积极开发了一段时间。你能试着回显代码吗?这将有助于我们详细分析问题。请在catch块中使用
$e->getCode()