La classe MongoCursorException
(PECL mongo >= 1.0.0)
Introduction
Émise lors d'un accès incorrect à un curseur ou lors de la réception d'une erreur au moment de la réponse. Notez que cette exception peut être émise par n'importe quelle requête de base de données qui reçoit une réponse, et pas uniquement les requêtes. Les commandes d'écriture, et toutes les autres opérations qui envoient des informations à la base de données et attendent une réponse peuvent émettre une exception de type MongoCursorException. La seule exception à ce principe est new MongoClient() (création d'une nouvelle connexion), qui n'émet que des exceptions de type MongoConnectionException.
Cette exception retourne un message d'erreur spécifique pour aider dans le diagnostique du problème ainsi qu'un code erreur numérique associé avec la cause de l'exception.
Par exemple, supposez que vous tentiez d'insérer 2 documents avec le même _id :
<?php
try {
$collection->insert(array("_id" => 1), array("w" => 1));
$collection->insert(array("_id" => 1), array("w" => 1));
}
catch (MongoCursorException $e) {
echo "message d'erreur : ".$e->getMessage()."\n";
echo "code de l'erreur : ".$e->getCode()."\n";
}
?>
message d'erreur : E11000 duplicate key error index: foo.bar.$_id_ dup key: { : 1 } code de l'erreur : 11000
Voici une liste des erreurs, codes et causes survenant le plus fréquemment. Les erreurs exactes sont en italiquue, les erreurs dont le message varie sont décrites en oblique.
-
cannot modify cursor after beginning iteration
Code : 0
Vous appelez une méthode qui affecte la requête après l'exécuter. Remettez à zéro le curseur et rééssayez.
Un exemple :
<?php
try {
$cursor = $collection->find();
var_dump($cursor->getNext());
// getNext() requête la base de données, il est trop tard pour définir une limite
$cursor->limit(1);
}
catch (MongoCursorException $e) {
echo "message d'erreur : ".$e->getMessage()."\n";
echo "code de l'erreur : ".$e->getCode()."\n";
}
// Ceci fonctionnera :
$cursor->getNext();
$cursor->reset();
$cursor->limit(1);
?> -
Get next batch send errors
Code : 1
Ne peut envoyer la requête à la base. Vérifiez l'état su serveur et du réseau.
-
cursor not found
Code : 2
Le pilote a tenté de récupérer plus de données depuis la base, mais celle-ci n'avait pas assez d'enregistrements. Ceci signifie en général que le curseur a expiré coté serveur après quelques minutes d'inactivité, la base va détruire un curseur. (Voyez MongoCursor::immortal() pour plus d'informations).
Un exemple :
<?php
try {
$cursor = $collection->find();
$cursor->getNext();
// attendre pendant 15 minutes
sleep(60*15);
while ($cursor->hasNext()) {
$cursor->getNext();
}
}
catch (MongoCursorException $e) {
echo "message d'erreur : ".$e->getMessage()."\n";
echo "code de l'erreur : ".$e->getCode()."\n";
}
?> -
cursor->buf.pos is null
Code : 3
Ceci peut indiquer que vous n'avez plus de RAM de disponible ou bien d'autres circonstances extraordinaires.
-
couldn't get response header
Code : 4
Une erreur commune si la base de données ou le réseau n'est plus disponible. Cela signifie que le driver ne peut récupérer une réponse depuis la connexion.
-
no db response
Code : 5
Ceci n'est pas toujours une erreur, par exemple, la commande "shutdown" émise à la base de données ne retourne aucune réponse. Cependant, si vous attendez une réponse, cela signifie que la base de données n'a pas réussi à la fournir.
-
bad response length: %d, did the db assert?
Code : 6
Ceci signifie que la base de données dit que sa réponse est inférieure à 0. Cela signifie généralement qu'une erreur réseau ou une corruption de la base de données est survenue.
-
incomplete header
Code : 7
Très peu commun. Apparait si la réponse de la base commence de manière correcte, mais échoue en plein milieu. Probablement un problème réseau.
-
incomplete response
Code : 8
Très rare. Survient si la réponse de la base de données a commencé avec succès, mais s'est interrompue avant la fin. Probablement un problème réseau.
-
couldn't find a response
Code : 9
Si la réponse est en cache mais ne peut être trouvée.
-
error getting socket
Code : 10
Le socket a été fermé ou a rencontré un problème. Le pilote devrait se reconnecter automatiquement (si possible) lors de l'opération suivante.
-
couldn't find reply, please try again
Code : 11
Le pilote sauvegarde toutes les réponses de la base qu'il ne peut associer immédiatement à une requête. Cette exception arrive lorsque le pilote a déja passé la réponse à votre requête mais ne peut la trouver dans son cache.
-
error getting database response: errstr
WSA error getting database response: errstr
"errstr" est une erreur IO, repporté directement depuis le socket C du sous-système. Sous Windows, le message d'erreur est préfixé par "WSA".
-
Timeout error
Code : 13
Erreur lors de l'attente qu'une requête s'exécute.
-
couldn't send query: <various>
Code : 14
Erreur de socket C à l'envoi.
-
max number of retries exhausted, couldn't send query
Code : 19
Le driver retentera automatiquement les requêtes (et non les commandes) un nombre de fois défini si la première tentative échoue pour certaines raisons. Ceci peut produire quelques exceptions lors du jeu de réplication (alors que d'autres passeront normalement), ainsi que quelques erreurs réseaux.
Ceci peut aussi survenir en raison du driver qui n'arrive pas à se reconnecter à la base de données (si, par exemple, la base de données n'est plus joignable).
Version 1.2.2+.
Erreur de la base de données
Les erreurs de la base devraient toujours déclencher une MongoCursorExceptions. Les messages d'erreur et les codes sont envoyés directement depuis la base et devraient se retrouver dans le journal de la base de données.
Voici quelques erreurs classiques de base de données:
-
E11000 duplicate key error index: foo.bar.$X dup key: { /* ... */ }
Code: 11000
Erreur de clé dupliquée.
-
not master
Codes: 10107, 13435, and 10058
Erreurs not master, pipée vers la base. Chacune causera une déconnection du pilote et sa recherche d'un nouveau primaire. L'erreur en failover peut ne pas être de type "not master", en fonction du déclenchement du changement de primaire.
Sommaire
- MongoCursorException::getHost — Récupère le nom de l'hôte sur lequel une erreur est survenue
Version en cache
23/12/2024 05:04:07 Cette version de la page est en cache (à la date du 23/12/2024 05:04:07) afin d'accélérer le traitement. Vous pouvez activer le mode utilisateur dans le menu en haut pour afficher la dernère version de la page.Document créé le 30/01/2003, dernière modification le 26/10/2018
Source du document imprimé : https://www.gaudry.be/php-rf-class.mongocursorexception.html
L'infobrol est un site personnel dont le contenu n'engage que moi. Le texte est mis à disposition sous licence CreativeCommons(BY-NC-SA). Plus d'info sur les conditions d'utilisation et sur l'auteur.
Références
Ces références et liens indiquent des documents consultés lors de la rédaction de cette page, ou qui peuvent apporter un complément d'information, mais les auteurs de ces sources ne peuvent être tenus responsables du contenu de cette page.
L'auteur de ce site est seul responsable de la manière dont sont présentés ici les différents concepts, et des libertés qui sont prises avec les ouvrages de référence. N'oubliez pas que vous devez croiser les informations de sources multiples afin de diminuer les risques d'erreurs.