2012-11-07 2 views
29

Je travaille sur une application web qui essaie de se connecter à une base de données MongoDB à partir de PHP. Dans les 90% de la page des charges tout fonctionne bien, mais dans l'autre 10%, il jette l'exception suivante lorsque je tente de mettre à jour une collection:PHP + MongoDB: Exception non interceptée 'MongoCursorException' avec le message 'Aucun fichier ou répertoire'

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 groupe de mongo n'a qu'un seul tesson, ma version de php est: 5.4.4, et ma mongo version du pilote est: 1.2.12.

+0

Y a-t-il quelque chose de pertinent dans le journal du serveur MongoDB? –

+1

La version PECL du client Mongo est à 1.3.6. Je suggère d'essayer une version plus récente car cela a été en développement actif pendant un certain temps. https://github.com/mongodb/mongo-php-driver/tags – methai

+1

Pouvez-vous essayer de faire écho au code? Cela devrait nous aider à analyser le problème en détail. Veuillez utiliser '$ e-> getCode()' dans le bloc catch. –

Répondre

0

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

0

Je l'ai vu cette erreur un peu et il est logique:

MongoDB soulève des exceptions curseur quand il y a un TIMEOUT lors de l'itération du curseur. C'est-à-dire, si vous émettez une requête sur Mongo pour un grand ensemble de données, allouer un curseur. Ensuite, vous itérez sur le curseur, récupérant vos résultats un à la fois, ce qui est le comportement normal du curseur. MAIS, si vous récupérez toujours les résultats après un temps suffisamment long, vous obtenez le message ci-dessus.

La solution pour cela pourrait être deux choses:

  • (couche d'application) récupérer vos résultats dans une collection temporaire et itérer sur ce (laid); (Couche de connexion) Réglez votre délai d'attente plus haut avant de lancer une requête (mieux vaut présumer que c'est possible).

Notez que vos résultats peuvent varier, bonne chance.

2

Vérifiez le code d'erreur $ e-> getCode(); utilisant:

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 Consultez la liste des mongo curseur erreurs d'exception: http://www.php.net/manual/pt_BR/class.mongocursorexception.php

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

note: éviter l'utilisation de l'option de sécurité, est obsolète. Utilisez l'option WriteConcern w, cela vous donnera plus d'options.

A propos de l'erreur:.. « Causé en accédant à un curseur de manière incorrecte ou une erreur de réception d'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 nouveau MongoClient() (créant une nouvelle connexion), qui ne lancera que des exceptions MongoConnection "(http://php.net/manual/en/class.mongocursorexception.php)

Questions connexes