2012-04-15 8 views
3

Ich bevorzuge es, dass meine Programme früh ausfallen und hart ausfallen, wenn ich die Fehlerprüfung für etwas vernachlässige. Leider erfordert die Mongo-Erweiterung, dass ich ständig MongoDb->lastError() überprüfe. Gibt es eine einfache Möglichkeit, array(PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXEPTION) mit Mongo zu emulieren?Ist es möglich, die Mongo-PHP-Erweiterung Ausnahmen zu werfen, wie PDO PDO :: ERRMODE_EXEPTION?

Vorzugsweise etwas, was nicht das Schreiben von Wrapper-Klassen für alles beinhaltet, was ich nur tun würde, wenn ich es unbedingt tun müsste.

Antwort

3

Nein, dies ist derzeit nicht möglich. Bitte reichen Sie dazu eine Feature-Anfrage unter http://jira.mongodb.org ein.

+0

Ich habe ein Problem hinzugefügt. Danke, Derick – Shabbyrobe

+0

Ich habe es nicht Pop-up gesehen. Hast du einen Link? – Derick

+0

https://jira.mongodb.org/browse/PHP-367 – Shabbyrobe

4

die Mongo Erweiterung erfordert mich ständig MongoDb->lastError()

So zu überprüfen, was hier eigentlich los ist etwas subtiler ist.

Standardmäßig arbeitet MongoDB im "Feuer und Vergessen" -Modus. So sendet es einen Schreibvorgang an den Server (Feuer) und dann einfach darauf vertrauen, dass der Server damit umgehen wird (vergessen). Dies ist die Standardkonfiguration für alle Schreibvorgänge für alle Treiber.

Sie möchten Ausnahmen, so dass Sie Ihre Updates im "sicheren" Modus ausgeben müssen. Im abgesicherten Modus gibt der Treiber automatisch den Befehl lastError() aus, bevor er die Kontrolle an den Aufrufer zurückgibt.

können Sie einstellen, abgesicherten Modus auf einzelne Operationen:

$collection->insert(array("x" => 1), array("safe" => true)); 

Der Fahrer sollte Einstellung dies auf der Verbindungsebene unterstützen, aber aus irgendeinem Grund ist nicht der Fall. Also müssen Sie das array('safe' => true) überall hinzufügen.

Vorzugsweise etwas, das nicht zu schreiben Wrapper-Klassen für alles beinhaltet nicht ...

Leider denke ich, das ist unvermeidlich. Der "sichere" Modus ist nur der Anfang. Im "sicheren" Modus wird nur ein Commit für den Arbeitsspeicher auf dem primären Server garantiert. Wenn Sie sicherstellen möchten, dass Daten auf dem Datenträger gespeichert sind, müssen Sie "fsync" oder "journal" verwenden. Wenn Sie Replikatsätze ausführen und sicherstellen möchten, dass Daten an zwei Stellen vorhanden sind, müssen Sie die Option "w" verwenden.

Wenn Sie Replikatsätze verwenden (, die 10gen für alle Produktionsbereitstellungen empfiehlt), müssen Sie eine Ausnahme behandeln, wenn das primäre Gerät ausfällt. Im Allgemeinen möchten Sie die Verbindung erneut versuchen, da das Öffnen der neuen Verbindung eine neue Verbindung mit der neuen Primärverbindung erzwingen sollte.

Dies, zusammen mit einer Vielzahl anderer Optimierungen bedeutet normalerweise, dass Ihr Code aufgrund der verschiedenen Ausnahmefälle, die Sie behandeln müssen, in eine Art Wrapper-Klasse benötigen.