tutorial para ejemplos controlador conector conectar con collection php mongodb mongodb-php

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.



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.




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 )