Класс MongoCursorException

(PECL mongo >= 1.0.0)

Введение

Вызывается, при неправильном доступе к курсору или ошибкой, при получении ответа. Обратите внимание, что это может быть вызвано любым запросом к базе данных, который получает ответ, а не только запросами. Запись, команды и любые другие операции, которые отправляют информацию в базу данных и ожидают ответа, могут вызвать исключение MongoCursorException. Единственное исключение - это новый new MongoClient() (создающий новое соединение), который будет генерировать только исключения MongoConnectionException.

Возвращает конкретное сообщение об ошибке, чтобы помочь диагностировать проблему и числовой код ошибки, связанный с причиной исключения.

Например, предположим, что вы пытались вставить два документа с одинаковым _id:

<?php

try {
    
$collection->insert(array("_id" => 1), array("w" => 1));
    
$collection->insert(array("_id" => 1), array("w" => 1));
}
catch (
MongoCursorException $e) {
    echo 
"error message: ".$e->getMessage()."\n";
    echo 
"error code: ".$e->getCode()."\n";
}

?>
Будет выведено следующее:
error message: E11000 duplicate key error index: foo.bar.$_id_  dup key: { : 1 }
error code: 11000
Обратите внимание, что код ошибки MongoDB (11000) используется для кода ошибки PHP. Драйвер PHP использует "родной" код ошибки везде, где это возможно.

Ниже приведен список распространенных ошибок, кодов и причин. Точные ошибки выделены курсивом, ошибки, в которых сообщение может отличаться, описаны в косых чертах.

  • cannot modify cursor after beginning iteration

    Code: 0

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

    Например:

    <?php

    try {
        
    $cursor $collection->find();
        
    var_dump($cursor->getNext());

        
    // getNext() запросил базу данных, слишком поздно для установки лимита
        
    $cursor->limit(1);
    }
    catch (
    MongoCursorException $e) {
        echo 
    "Сообщение об ошибке: ".$e->getMessage()."\n";
        echo 
    "Код ошибки: ".$e->getCode()."\n";
    }

    // это будет работать, хотя:
    $cursor->getNext();
    $cursor->reset();
    $cursor->limit(1);

    ?>

  • Get next batch send errors

    Code: 1

    Ошибка возникает, когда не удалось отправить запрос в базу данных. Убедитесь, что база данных все еще работает и сеть в порядке.

  • cursor not found

    Code: 2

    Ошибка возникает, когда драйвер пытался получить больше результатов из базы данных, но в базе данных не было записи запроса. Обычно это означает, что время ожидания курсора на стороне сервера истекло: после нескольких минут бездействия база данных уничтожит курсор (см. MongoCursor::immortal() для получения информации для предотвращения этого).

    Например:

    <?php

    try {
        
    $cursor $collection->find();
        
    $cursor->getNext();

        
    // Ждем 15 минут
        
    sleep(60*15);

        while (
    $cursor->hasNext()) {
            
    $cursor->getNext();
        }
    }
    catch (
    MongoCursorException $e) {
        echo 
    "Сообщение об ошибке: ".$e->getMessage()."\n";
        echo 
    "Код ошибки: ".$e->getCode()."\n";
    }

    ?>

  • cursor->buf.pos is null

    Code: 3

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

  • couldn't get response header

    Code: 4

    Распространенная ошибка, если база данных или сеть выходит из строя. Это означает, что драйвер не смог получить ответ от соединения.

  • no db response

    Code: 5

    Это может даже не быть ошибкой, например, команда базы данных "shutdown" не возвращает ответа. Однако, если вы ожидали ответа, это означает, что база данных его не дала.

  • bad response length: %d, did the db assert?

    Code: 6

    Ошибка возникает, если ответ базы данных был меньше 0. Это, вероятно, указывает на сетевую ошибку или повреждение базы данных.

  • incomplete header

    Code: 7

    Весьма необычно. Происходит, если ответ базы данных начался правильно, но оборвался посередине. Вероятно, указывает на проблему с сетью.

  • incomplete response

    Code: 8

    Highly unusual. Occurs if the database response started out correctly, but broke off in the middle. Probably indicates a network problem.

  • couldn't find a response

    Code: 9

    Ошибка возникает, если ответ был кэширован и теперь не может быть найден.

  • error getting socket

    Code: 10

    Ошибка возникает, если сокет был закрыт или обнаружена ошибка. Драйвер должен автоматически переподключиться (если это возможно) при следующей операции.

  • couldn't find reply, please try again

    Code: 11

    Драйвер сохраняет любые ответы в базе данных, которые он не может немедленно сопоставить с запросом. Исключение возникает, если драйвер уже передал ответ на ваш запрос и не может найти ваш ответ в своем кэше.

  • error getting database response: errstr

    WSA error getting database response: errstr

    "errstr" - это ошибка io, сообщаемая непосредственно из подсистемы сокета C. В Windows сообщение об ошибке имеет префикс "WSA".

  • Timeout error

    Code: 13

    Ошибка возникает, если при ожидании завершения запроса произошла ошибка.

  • couldn't send query: <various>

    Code: 14

    Ошибка сокета C при отправке.

  • max number of retries exhausted, couldn't send query

    Code: 19

    Драйвер автоматически повторяет "простые" запросы (не команды), если первая попытка не удалась по определенным причинам. Это должно вызывать меньшее количество исключений во время аварийного переключения набора реплик (хотя вам, вероятно, все еще придется иметь дело с некоторыми из них) и устранять временные проблемы в сети.

    Также может быть вызвано тем, что драйвер вообще не может повторно подключиться к базе данных (если, например, база данных недоступна).

    Версия 1.2.2+.

Ошибки, прошедшие через базу данных

Ошибки базы данных всегда должны вызывать исключения MongoCursorExceptions для запросов. Сообщения об ошибках и коды отправляются непосредственно из базы данных, и вы должны увидеть соответствующие ошибки в журнале базы данных.

Некоторые ошибки базы данных перечислены ниже:

  • E11000 duplicate key error index: foo.bar.$X dup key: { /* ... */ }

    Code: 11000

    Ошибка базы данных для дубликатов ключей.

  • not master

    Codes: 10107, 13435, and 10058

    Не основные ошибки, проходящие через базу данных. Каждый из них приведет к отключению драйвера и попытке найти новый основной сервер. Фактическая ошибка, которую вы получаете при отработке отказа, может не быть ошибкой "not master", в зависимости от того, когда происходит изменение на основном сервере.

Обзор классов

MongoCursorException extends MongoException {
}

Содержание