(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
Ниже приведен список распространенных ошибок, кодов и причин. Точные ошибки выделены курсивом, ошибки, в которых сообщение может отличаться, описаны в косых чертах.
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", в зависимости от того, когда происходит изменение на основном сервере.