Подтвердить что ты не робот

PHP + MongoDB: Не удалось исключить "MongoCursorException" с сообщением "Нет такого файла или каталога"

Я работаю над веб-приложением, которое пытается подключиться к базе данных MongoDB с PHP. В 90% загрузки страниц все работает нормально, но в остальных 10% это вызывает следующее исключение, когда я пытаюсь обновить коллекцию:

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

    ...
}

Монго версия:

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

В моем кластере mongo есть только один осколок, моя версия php: 5.4.4, а моя версия драйвера mongo: 1.2.12.

4b9b3361

Ответ 1

Проверьте код ошибки $e- > getCode();, используя:

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

И чем с кодом ошибки проверьте список ошибок исключения Mongo Cursor: http://www.php.net/manual/pt_BR/class.mongocursorexception.php

Например, если вы получили код ошибки 3 "Это может указывать на то, что вы не в ОЗУ или какое-то другое чрезвычайное обстоятельство".

Примечание: избегайте использования безопасного варианта, устарела. Используйте параметр WriteConcern w, предоставит больше опции.

Об ошибке: Msgstr "Причина вызвана неправильным доступом к курсору или ошибкой, получающей ответ. Любая операция, которая отправляет информацию в базу данных и ждет ответа, может вызывать исключение MongoCursorException. Единственным исключением является новый MongoClient() (создание нового соединения), который будет только бросать MongoConnectionExceptions. "( http://php.net/manual/en/class.mongocursorexception.php)

Ответ 2

трудно узнать, где это происходит, но эта страница подробно объясняет, что может вызвать это исключение.

Ответ 4

Вероятно, клиент PHP Mongo обнаруживает сбой при подключении к фактическому MongoDB.

Как вы сказали где-то в другом месте (https://groups.google.com/forum/?fromgroups=#!topic/mongodb-user/wqcCNQgiJAQ), вы запускаете MongoDB через VMWare, что может вызвать проблемы со связью время от времени.

Ответ 5

Я видел эту ошибку совсем немного, и это имеет смысл:

MongoDB вызывает исключения курсора, если во время итерации курсора есть TIMEOUT. То есть, если вы выдаете запрос на Mongo для большого набора данных, выделите курсор. Затем вы перебираете курсор, получая результаты по одному, что является нормальным поведением курсора. НО, если вы все еще извлекаете результаты через достаточно долгое время, вы получите сообщение выше.

Решением для этого может быть две вещи:

  • (слой приложения) Извлеките свои результаты во временную коллекцию и повторите это (уродливое);
  • (уровень подключения) Установите время ожидания до запроса (гораздо лучше, если это возможно).

Обратите внимание, что ваши результаты могут отличаться, удачи.