2012-11-07 10 views
29

Sto lavorando a un'applicazione Web che sta tentando di connettersi a un database MongoDB da PHP. Nel 90% dei pagina viene caricata tutto funziona bene, ma nel restante 10% viene generata la seguente eccezione quando si tenta di aggiornare una collezione: codicePHP + MongoDB: eccezione Uncaught 'MongoCursorException' con messaggio 'Nessun file o directory'

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

    ... 
} 

versione 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 

mio gruppo mongo ha un solo frammento, la mia versione PHP è: 5.4.4, e la mia versione del driver mongo è: 1.2.12.

+0

c'è qualcosa rilevante nel registro del server MongoDB? –

+1

La versione PECL del client Mongo è 1.3.6. Suggerirei di provare una versione successiva poiché è in sviluppo attivo da un po 'di tempo. https://github.com/mongodb/mongo-php-driver/tags – methai

+1

Puoi provare a echo il codice? Questo dovrebbe aiutarci ad analizzare il problema in dettaglio. Si prega di usare '$ e-> getCode()' nel blocco catch. –

risposta

0

difficile sapere da dove capita, ma this page spiega nel dettaglio cosa può causare questa eccezione

biblioteca
0

Ho visto questo errore un po 'e ha senso:

MongoDB solleva eccezioni cursore quando v'è una TIMEOUT durante cursore iterazione. Cioè, se si invia una query su Mongo per un set di dati di grandi dimensioni, allocare un cursore. Quindi, si esegue l'iterazione sul cursore, recuperando i risultati uno alla volta, ovvero il normale comportamento del cursore. MA, se stai ancora recuperando i risultati dopo un tempo sufficientemente lungo, ottieni il messaggio precedente.

La soluzione per questo potrebbe essere due cose:

  • (strato app) recuperare i risultati in una raccolta temporanea e iterare che (brutto);
  • (livello di connessione) Impostare il timeout più alto prima di eseguire una query (è molto più probabile che sia possibile).

Nota i risultati possono variare, buona fortuna.

2

Controllare il codice di errore $ e-> getCode(); utilizzando:

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

E che con il codice di errore controllare la lista degli errori di eccezione Mongo cursore: http://www.php.net/manual/pt_BR/class.mongocursorexception.php

Per esempio, se si ha il codice di errore 3 "Questo potrebbe indicare che si è fuori di RAM o di qualche altra circostanza straordinaria. ".

nota: evitare l'uso di opzione sicura, è deprecato. Usa l'opzione WriteConcern w, provocherebbe anche più opzioni.

Circa l'errore:.. "causato accedendo un cursore in modo non corretto o un errore di ricezione di una risposta Qualsiasi operazione che invia le informazioni al database e attende una risposta in grado di gettare un MongoCursorException L'unica eccezione è nuova MongoClient() (la creazione di una nuova connessione), che getterà solo MongoConnectionExceptions. "(http://php.net/manual/en/class.mongocursorexception.php)