Dies kann mit einem Fehler zusammenhängen, der in 1.6.0 bezüglich der Iteration mit hasNext()
eingeführt wurde und getNext()
:PHP-1382
. Ein Fix wurde inzwischen mit v1.6
und sollte später in dieser Woche als 1.6.1 veröffentlicht werden.
Das heißt, der Fehler bezüglich hasNext()
war eigentlich, dass das letzte Dokument in der Ergebnismenge beim Iterieren übersehen würde. Wenn ich Ihr ursprüngliches Skript gegen 1.6.0 ausführe, enthält das Array einen null
Wert als letztes Element. Wenn der Fix vorhanden ist, enthält das Array wie erwartet alle Dokumente. Ich kann die Ausnahme, die Sie mit beiden Versionen sehen, nicht reproduzieren.
Diese Ausnahme wird tatsächlich von einer internen Überprüfung der C-Datenstrukturen ausgelöst, um sicherzustellen, dass das Cursorobjekt ordnungsgemäß einem MongoClient und einer Socket-Verbindung zugeordnet ist. Siehe MONGO_CHECK_INITIALIZED()
Makro ruft diese Datei
auf . Die meisten Cursormethoden prüfen, ob ein MongoClient zugeordnet ist, aber hasNext()
ist insofern einzigartig, als es auch nach dem Socket-Objekt sucht (ich glaube, andere Methoden gehen davon aus, dass ein Cursor mit einem MongoClient auch einen Socket hat). Wenn diese Ausnahme für Sie wirklich reproduzierbar ist und Sie bereit sind, die Erweiterung zu debuggen, würde mich sehr interessieren, welche der beiden Prüfungen den Fehler auslöst.
Als Nebenbemerkung sollten Sie auch "replicaSet"
angeben Option beim Erstellen von MongoClient. Dieser sollte den Replikatsatznamen haben, der sicherstellt, dass der Treiber Verbindungen zu Hosts ignorieren kann, die kein Mitglied des beabsichtigten Replikatsatzes sind.