para - php mongodb tutorial
PHP+MongoDB: excepción no detectada ''MongoCursorException'' con mensaje ''No existe tal archivo o directorio'' (5)
Estoy trabajando en una aplicación web que intenta conectarse a una base de datos MongoDB desde PHP. En el 90% de la carga de la página, todo funciona bien, pero en el otro 10% se produce la siguiente excepción cuando intento actualizar una colección:
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
Código 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;
}
...
}
Versión de 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
Mi clúster mongo solo tiene un fragmento, mi versión de php es: 5.4.4 y la versión de mi controlador mongo es: 1.2.12.
Es difícil saber dónde sucede, pero http://php.net/manual/en/class.mongocursorexception.php explica en detalle qué puede causar esta excepción.
He visto este error bastante y tiene sentido:
MongoDB genera excepciones de cursor cuando hay un TIMEOUT durante la iteración del cursor. Es decir, si emite una consulta en Mongo para un conjunto de datos grande, asigne un cursor. Luego, recorre el cursor, recuperando los resultados uno por uno, lo que es el comportamiento normal del cursor. PERO , si aún está recuperando resultados después de un tiempo suficientemente largo, recibirá el mensaje anterior.
La solución para esto podría ser dos cosas:
- (capa de aplicación) Recupere sus resultados en una colección temporal y repítalo (feo);
- (capa de conexión) Establezca su tiempo de espera más alto antes de realizar consultas (es mucho mejor suponer que es posible).
Tenga en cuenta que sus resultados pueden variar, la mejor de las suertes.
La biblioteca de Mongo DB no debe instalarse en PHP.ini
Para ventana
http://www.php.net/manual/en/mongo.installation.php#mongo.installation.windows https://s3.amazonaws.com/drivers.mongodb.org/php/index.html
Para linux
http://www.php.net/manual/en/mongo.installation.php#mongo.installation.nix
Esto me ayuda a ejecutar mongodb a través de PHP
Probablemente, el cliente PHP Mongo encuentra una falla al conectarse al MongoDB real.
Como dijo en otro lugar ( https://groups.google.com/forum/?fromgroups=#!topic/mongodb-user/wqcCNQgiJAQ ), ejecuta MongoDB a través de VMWare, lo que puede causar problemas de conexión de vez en cuando.
Verifique el código de error $ e-> getCode (); utilizando:
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";
}
Y que con el código de error verifique la lista de errores de excepción de Cursor de Mongo: http://www.php.net/manual/pt_BR/class.mongocursorexception.php
Por ejemplo, si obtuvo el código de error 3 "Esto puede indicar que no tiene RAM o alguna otra circunstancia extraordinaria". .
Nota: evitar el uso de la opción segura, está en desuso. Utilice la opción WriteConcern w, también proporcionará más opciones.
Acerca del error: "Causado por acceder a un cursor incorrectamente o un error al recibir una respuesta. Cualquier operación que envíe información a la base de datos y espere una respuesta puede generar una MongoCursorException. La única excepción es el nuevo MongoClient () (creando una nueva conexión) , que solo lanzará MongoConnectionExceptions. "( http://php.net/manual/en/class.mongocursorexception.php )