2012-11-07 18 views
29

Pracuję nad aplikacją internetową, która próbuje połączyć się z bazą danych MongoDB z PHP. W 90% strona ładuje wszystko działa poprawnie, ale w pozostałych 10% to rzuca następujący wyjątek, gdy próbuję zaktualizować kolekcję: kodPHP + MongoDB: Nieprzechwycony wyjątek "MongoCursorException" z komunikatem "Brak takiego pliku lub katalogu"

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

    ... 
} 

wersję 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 

Mój klaster Mongo ma tylko jeden odłamek, moja wersja php jest: 5.4.4, a moja wersja sterownika Mongo jest: 1.2.12.

+0

Czy w dzienniku serwera MongoD znajduje się coś istotnego? –

+1

Wersja klienta PECL dla klienta Mongo jest w wersji 1.3.6. Sugerowałbym wypróbowanie późniejszej wersji, ponieważ jest to od pewnego czasu aktywnie rozwijane. https://github.com/mongodb/mongo-php-driver/tags – methai

+1

Czy możesz spróbować powtórzyć kod? To powinno nam pomóc szczegółowo przeanalizować problem. Proszę użyć '$ e-> getCode()' w bloku catch. –

Odpowiedz

0

trudno wiedzieć gdzie to się dzieje, ale this page wyjaśnia szczegółowo, co może być przyczyną tego wyjątku

0

Widziałem ten błąd sporo i to ma sens:

MongoDB podnosi wyjątki kursora, gdy istnieje TIMEOUT kursora podczas iteracji. Oznacza to, że jeśli wyślesz zapytanie do Mongo dla dużego zestawu danych, przydzielając kursor. Następnie następuje iteracja nad kursorem, pobieranie wyników po jednym na raz, co jest normalnym zachowaniem kursora. ALE, jeśli nadal pobierasz wyniki po wystarczająco długim czasie, otrzymasz powyższy komunikat.

Rozwiązaniem tego może być dwie rzeczy:

  • (warstwa aplikacji) odzyskać wyników do tymczasowego gromadzenia i iteracyjnego że (brzydki);
  • (warstwa połączenia) Ustaw wyższy limit czasu przed wysłaniem zapytania (o wiele lepiej, jeśli jest to możliwe).

Uwaga wyniki mogą się różnić, powodzenia.

2

Sprawdź kod błędu $ e-> getCode(); używając:

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

A niż z kodem błędu sprawdzić listę Mongo kursorów błędów wyjątek: http://www.php.net/manual/pt_BR/class.mongocursorexception.php

Na przykład, jeśli masz kod błędu 3 „To może oznaczać jesteś z pamięci RAM lub niektóre inna nadzwyczajna okoliczność. ".

uwaga: unikaj stosowania opcji bezpiecznej, jest przestarzała. Użyj opcji WriteConcern w, spowoduje również dodatkową opcję.

O błędu:.. „spowodowane przez dostępu kursor nieprawidłowo lub błąd otrzymania odpowiedzi Każda operacja, która wysyła informacje do bazy danych i czeka na odpowiedź może rzucać MongoCursorException Jedynym wyjątkiem jest nowy MongoClient() (tworzenie nowego połączenia), który rzuci tylko MongoConnectionExceptions: "(http://php.net/manual/en/class.mongocursorexception.php)