PHP Australia Conference 2015

La clase MongoCursorException

(PECL mongo >= 1.0.0)

Introducción

Esta exceptción es causada por el acceso a un cursor de forma incorrecta o en un error al recibir una réplica. Obsérvese que esta excepción puede ser lanzada por cualquier petición a la base de datos que reciba una réplica, no solamente consultas. Las escrituras, comandos y cualquier otra operación que envie información a la base de datos y espere una respuesta, puede lanzar una MongoCursorException. La única excepción es new MongoClient() (crear una nueva conexión), la cual solamente lanzará MongoConnectionExceptions.

Devuelve un mensaje de error específico para ayudar a diagnosticar el problema, y un código de error numérico asociado con la causa de la excepción.

Por ejemplo, suponga que se intentan insertar dos documentos con el mimo _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";
}

?>
This would produce output like:
mensaje de error: E11000 duplicate key error index: foo.bar.$_id_  dup key: { : 1 }
código del error: 11000
Obsérvese que el código de error de MongoDB (11000) se usa para el código de error de PHP. El controlador de PHP utiliza el código de error "nativo" siempre que sea posible.

La lista siguietne contiene errores comunes y sus causas. Los mensajes de error exactos están en cursiva; los errores donde el mensaje puede variar están descritos entre barras oblicuas.

  • cannot modify cursor after beginning iteration (no se puede modificar el cursor después de iniciar una iteración)

    Código: 0

    Se está invocando a un método que configura la consulta después de ejecutarla. Reinice el cursor y vuelva a intentarlo.

    Un ejemplo:

    <?php

    try {
        
    $cursor $colección->find();
        
    var_dump($cursor->getNext());

        
    // getNext() consulta a la base de datos, es demasiado tarde para establecer un límite
        
    $cursor->limit(1);
    }
    catch (
    MongoCursorException $e) {
        echo 
    "mensaje de error: ".$e->getMessage()."\n";
        echo 
    "código del error: ".$e->getCode()."\n";
    }

    // si bien, esto funcionará:
    $cursor->getNext();
    $cursor->reset();
    $cursor->limit(1);

    ?>

  • La obtención del siguiente lote envía errores

    Código: 1

    Podría no enviarse la consulta a la base de datos. Asegúrese de que la base de datos aún está activa y la red funciona bien.

  • cursor not found (cursor no encontrado)

    Código: 2

    El controlador estuvo intentando obtener más resultados de la base de datos, pero ésta no tiene un registro de la consulta. Esto usualmente significa que el cursor a expirado en el lado del servidor: después de unos pocos minutos de inactividad, la base de datos destruirá un cursor (véase MongoCursor::immortal() para información sobre cómo prevenir esto).

    Un ejemplo:

    <?php

    try {
        
    $cursor $colección->find();
        
    $cursor->getNext();

        
    // dormir durante 15 minutos
        
    sleep(60*15);

        while (
    $cursor->hasNext()) {
            
    $cursor->getNext();
        }
    }
    catch (
    MongoCursorException $e) {
        echo 
    "mensaje de error: ".$e->getMessage()."\n";
        echo 
    "código del error: ".$e->getCode()."\n";
    }

    ?>

  • cursor->buf.pos is null (cursor->buf.pos es null)

    Código: 3

    Esto podría indicar que se ha quedado sin RAM o alguna otra circunstancia extraordinaria.

  • couldn't get response header (no se pudo obtener la cabecera de respuesta)

    Código: 4

    Un error común si la base de datos o la red se caen. Esto significa que el controlador podría no obtener una respuesta de la conexión.

  • no db response (sin resupesta de la base de datos)

    Código: 5

    Esto podría incluso no ser un error, por ejemplo, el comando de base de datos "shutdown" no devuelve respuesta alguna. Sin embargo, si se espera una respuesta, esto significa que la base de datos no proporcionó ninguna.

  • bad response length: %d, did the db assert? (longitud de respuesta errónea: %d, ¿se declaró la bd?

    Código: 6

    Esto significa que la base de datos indica que su respuesta fue menor que 0. Este error probablemente indica un error de red o corrupción de la base de datos.

  • incomplete header (cabecera incompleta)

    Código: 7

    Muy poco usual. Ocurre si la respuesta de la base de datos se inicia correctamente, pero se interrumpe a la mitad. Probablemente indica un problema de red.

  • incomplete response (respuesta incompleta)

    Código: 8

    Muy poco usual. Ocurre si la respuesta de la base de datos se inicia correctamente, pero se interrumpe a la mitad. Probablemente indica un problema de red.

  • couldn't find a response (no se pudo encontrar una respuesta)

    Código: 9

    Si la respuesta fue almacenada en caché y ahora no se puede localizar.

  • error getting socket (error al obtener el socket)

    Código: 10

    El socket fue cerrado o se encontró con un error. El controlador debería reconectar automáticamente (si es posible) en la siguiente operación.

  • couldn't find reply, please try again (no se pudo encontrar la réplica, inténtelo de nuevo)

    Código: 11

    El controlador guarda cualquier respuesta de la base de datos que no pudo hacer coincidir inmediatamente con una petición. Esta excepción ocurre si el controlador ya ha pasado la respuestta de la petición y no puede encontrarla en su caché.

  • error getting database response: errstr (error al obtener una respuesta de la base de datos: errstr)

    WSA error getting database response: errstr (error WSA al obtener una respuesta de la base de datos: errstr)

    "errstr" es un error de E7S reportado directamente desde el subsistema de sockets de C. En Windows, el mensaje de error está prefijado con "WSA".

  • Timeout error (Error de tiempo de espera)

    Código: 13

    Si hubo un error mientras se esperaba a que se completase una consulta.

  • couldn't send query: <various> (no se pudo enviar la consulta: <variado>)

    Código: 14

    Error del socket de C en el envío.

  • max number of retries exhausted, couldn't send query (número máximo de reintentos agotados, no se pudo enviar la consulta)

    Código: 19

    El controlador automáticamente reintentará realizar consultas "planas" (no comandos) un par de veces si el primer intento falló por ciertas razones. Esto es para causar menos excepciones durante la tolerancia a fallos del conjunto de réplicas (aunque probablemente aún tendrá que tratar con alguna) y pasar por alto asuntos de red transitorios.

    Esto también puede ser causado porque el controlador no es capaz de reconectar de ningún modo a la base de datos (si, por ejemplo, la base de datos está ilocalizable).

    Versión 1.2.2+.

Errores pasados a través de la base de datos

Los errores de la base de datos deberían siempre desencadenar MongoCursorExceptions en consultas. Los mensajes y los códigos de error son enviados directamente desde la base de datos, por lo que se deberían poder ver los errores coincidentes en el registro (log) de la base de datos.

A continuación se enumeran algunos errores de base de datos comunes:

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

    Código: 11000

    Error de base de datos para claves duplicadas.

  • not master

    Códigos: 10107, 13435, y 10058

    Errores de no haber maestro, conducidos a través de la base de datos. Cada uno de estos errores causará que el controlador se desconecte e intente encontrar un nuevo primario. El error real que se obtiene en la tolerancia a fallos podría no ser un error "not master", dependiendo de cuando ocurra el cambio en el primario.

Sinopsis de la Clase

MongoCursorException extends MongoException {
}

Tabla de contenidos

add a note add a note

User Contributed Notes 1 note

up
1
Loc d&#39;Anterroches
3 years ago
As all the exceptions are extending the base Exception class, you can get the code with the getCode() method:

<?php
try {
   
$collection->insert($duplicate_document, array('safe' => true));
} catch (
MongoCursorException $e) {
   
printf("Error code is %d.\n", $e->getCode();
    exit(
1);
}
To Top