我正在研究一个尝试从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;
}
...
}
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。
答案 0 :(得分: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 Cursor异常错误列表:http://www.php.net/manual/pt_BR/class.mongocursorexception.php
例如,如果您收到错误代码3 “这可能表示您没有RAM或其他特殊情况。”。
注意:避免使用安全选项,不推荐使用。使用WriteConcern w选项,也会提供更多选项。
关于错误: “错误地访问游标或接收回复时出错。 任何向数据库发送信息并等待响应的操作都可能抛出MongoCursorException。唯一的例外是新的MongoClient()(创建一个新连接),它只会抛出MongoConnectionExceptions。 “(http://php.net/manual/en/class.mongocursorexception.php)
答案 1 :(得分:0)
很难知道它发生在哪里,但是this page 详细解释了导致此异常的原因
答案 2 :(得分:0)
Mongo DB库可以安装在PHP.ini
中For Window
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
答案 3 :(得分:0)
可能是PHP Mongo客户端在连接到实际的MongoDB时遇到了故障。
正如您在其他地方所说的那样(https://groups.google.com/forum/?fromgroups=#!topic/mongodb-user/wqcCNQgiJAQ),您通过VMWare运行MongoDB,这可能会偶尔导致连接问题。
答案 4 :(得分:0)
我已经看到了这个错误,这很有意义:
当游标迭代期间存在 TIMEOUT 时,MongoDB会引发游标异常。也就是说,如果您在Mongo上为大型数据集发出查询,请分配游标。然后,迭代光标,一次检索一个结果,这是正常的游标行为。 但是,如果您在足够长的时间后仍在检索结果,则会收到上述消息。
解决方案可能是两件事:
请注意,您的结果可能会有所不同,祝您好运。