2012-10-09 3 views
1

Trouver des solutions problème similaire - avec timeout (-1); et immortel (vrai); - rien aidé :(MongoDB - PHP - MongoCursorException 'Curseur non trouvé

Je reçois cette erreur lorsque ce code:

$this->start_time = microtime(true); 
    $documents = 0; 
    $offset = 0; 
    $files = array(); 

    $mongo = new Mongo(); 

    $db = Yii::app()->params['mongo']['db']; 
    $db->immortal(true); 
    $collection = Yii::app()->params['mongo']['collection']; 
    $collection_serial = 'new_serial_number'; 

    $serial_numbers = $mongo->$db->$collection_serial->find(); 
    $serial_numbers->timeout(-1); 

    $update = false; 

    foreach ($serial_numbers as $serial_number) { 

    //some code here   
    } 

ce qui pourrait être le problème

+0

Quelle est la version du pilote et la version MongoDB est-ce? Aussi pouvez-vous voir la connexion dans le terminal? Fondamentalement, cela signifie que le serveur doit avoir nettoyé le curseur, mais cela semble un peu étrange, surtout avec le code supplémentaire. – Sammaye

+0

Aussi, puisque je ne peux pas éditer mon vieux commentaire maintenant, immortal n'est pas une bonne chose à utiliser ici, vraiment vous devriez rester à un délai excessif, aussi je pense que -1 ne fonctionne que lorsque vous accédez au timeout global var (comme 'MongoCursor :: $ timeout = -1') du pilote mongodb lui-même sinon, par les docs, http://php.net/manual/en/mongocursor.timeout.php il est en fait 0 pour donner un timeout infini – Sammaye

+0

comment puis-je vérifier la version? je suis essayé MongoCursor :: $ timeout = -1, mais le résultat est le même –

Répondre

2

Remarque :: Il y a une distinction importante entre délai d'attente et immortel? ! La temporisation indique l'heure à attendre sur le côté côté client alors que immortal positionne le curseur sur le côté serveur

Il est particulièrement utile pour les grands ensembles de résultats dans des environnements fragmentés.

-

Dans quelle ligne obtenez-vous l'exception?

Assurez-vous que vous utilisez délai d'attente ou sur le curseur immortel:

$cursor = $collection->find(); 
$cursor->immortal(true); // this 
$cursor->timeout(-1); // or this 
+0

Maintenant, je suis essayé d'utiliser seulement "$ serial_numbers-> timeout (-1); " Je reçois l'exeption sur cette ligne: "foreach ($ serial_numbers as $ serial_number) {" –

+0

quand j'utilise "$ cursor-> timeout (-1);" - mon script attendra pour toujours? –

+0

oui, -1 est sans délai –