29 votes

PHP + MongoDB: exception non interceptée 'MongoCursorException' avec le message 'Aucun fichier ou répertoire de ce type'

Je travaille sur une application web qui essaie de se connecter à une base de données MongoDB depuis PHP. Dans les 90% de chargement de page, tout fonctionne bien, mais dans les 10% restants, il déclenche l'exception suivante lorsque j'essaie de mettre à jour une collection:

 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
 

Code 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;
    }

    ...
}
 

Version 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
 

Mon cluster mongo n'a qu'un seul fragment, ma version php est: 5.4.4, et ma version du pilote mongo est: 1.2.12.

2voto

Diogo Baracho Points 56

Vérifier le code d'erreur $e->getCode(); à l'aide de:

    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";
    }

Et qu'avec le code d'erreur, vérifiez la liste de Mongo Curseur erreurs d'exception: http://www.php.net/manual/pt_BR/class.mongocursorexception.php

Par exemple, si vous avez obtenu le code d'erreur 3 ", Cela peut indiquer que vous êtes hors de la RAM ou de quelque autre circonstance extraordinaire.".

remarque: éviter l'utilisation de l'option sécuritaire, est obsolète. Utilisez l'option w de WriteConcern w, va provite option plus trop.

Sur l'erreur: "Causé par l'accès à un curseur de manière incorrecte ou d'une erreur de recevoir une réponse. Toute opération qui envoie des informations à la base de données et attend une réponse peut jeter un MongoCursorException. La seule exception est la nouvelle MongoClient() (créer une nouvelle connexion), qui ne fera que jeter de l'MongoConnectionExceptions. "(http://php.net/manual/en/class.mongocursorexception.php)

0voto

billyJoe Points 405

difficile de savoir où cela se produit, mais cette page explique en détail ce qui peut provoquer cette exception

0voto

Harsh Chunara Points 216

0voto

Willem Mulder Points 5014

Probablement, le client PHP Mongo rencontre un échec lors de la connexion à la MongoDB réelle.

Comme vous l'avez dit ailleurs ( https://groups.google.com/forum/?fromgroups=#!topic/mongodb-user/wqcCNQgiJAQ ), vous exécutez MongoDB via VMWare, ce qui peut entraîner des problèmes de connexion de temps en temps.

0voto

Kevin J. Rice Points 515

J'ai vu cette erreur tout à fait un peu et il prend tout son sens:

MongoDB soulève curseur exceptions quand il y a un DÉLAI d'attente pendant le curseur itération. C'est, si vous émettez une requête sur Mongo pour un grand jeu de données, l'allocation d'un curseur. Ensuite, vous parcourez le curseur, la récupération de vos résultats, un à un, ce qui est normal, le comportement du curseur. MAIS, si vous êtes toujours à la récupération des résultats après une assez longue durée, vous obtenez le message ci-dessus.

La solution, c'est peut-être deux choses:

  • (application layer) de Récupérer vos résultats dans un temporaire de collecte et d'itérer sur que (laid);
  • (connexion de la couche) Définir le délai de votre supérieur avant d'interroger (beaucoup mieux en supposant que c'est possible).

Notez vos résultats peuvent varier, bonne chance.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X