PDO mit PDOStatement reconnect bei "mysql server gone" -Fehler

9

Wenn mysql's wait_timeout überschritten wurde, verliere ich die Verbindung in meinem PHP CLI Skript. Ich kann wait_timeout nicht ändern, also wie würde man eine try / catch-Anweisung erstellen, die erneut verbunden wird, wenn ich PDOStatement zum Ausführen meiner Abfragen verwende?

    
x74x61 08.02.2012, 08:51
quelle

3 Antworten

1

Der beste Ansatz besteht darin, die PDO-Instanzerstellung in ein Singleton (dh MyPDOFactory) zu verpacken, das sowohl die Instanz als auch den Zeitpunkt der Erstellung speichert, so dass Sie sie wiederverwenden oder neu erstellen können, nachdem ein TTL erreicht wurde 3 Sekunden sind mehr als genug für die meisten Anwendungen). Sie müssen nur MyPDOFactory :: get () aufrufen, um ein gültiges PDO zu erhalten, mit dem Sie das PDOStatement vorbereiten können. Stellen Sie jedoch sicher, dass Sie es so schnell wie möglich ausführen.

    
Rubén Moraleda 07.04.2013 10:50
quelle
0

Das erneute Verbinden mit einer Datenbank nach einem Fehler ist eigentlich ein viel komplizierteres Problem als es auf den ersten Blick scheint.

Meine erste Idee war es, eine einfache Wrapper-Klasse für PDO zu schreiben, die Methoden auf ein internes PDO-Objekt überträgt und Verbindungsfehler selbst behandeln kann:

%Vor%

Da diese Klasse PDO erweitert, kann sie überall dort verwendet werden, wo die generische PDO-Klasse verwendet werden kann.

Wie Sie sehen können, wird Ihnen dieser Ansatz einige Wiederholungen geben, bevor die exec () -Methode aufhört und die Verbindung nach transienten Fehlern wieder herstellt (dies dient nur der Demonstration und enthält einige Funktionen, die eine echte Implementierung benötigen würde, wie ein Backoff zwischen Wiederholungen, angemessene Fehlerprotokollierung, usw.). Dieser Ansatz erfordert auch, dass Sie die Besonderheiten der ausgelösten PDO-Ausnahme überprüfen, weil Sie nicht möchten, dass Dinge wie MySQL-Syntaxfehler dazu führen, dass die Verbindung zurückgesetzt und ein erneuter Versuch versucht wird. Sie möchten nur, dass es bei Dingen wie "Server ist weg" passiert.

Wie Sie ebenfalls sehen können, würde die Implementierung all der Proxy-PDO-Methoden eine lästige Pflicht sein, obwohl Sie es nur einmal tun müssen, wenn es sich lohnt, den Aufwand dafür zu investieren.

Es gibt jedoch ein viel größeres Problem, das ein allgemeines Problem für jeden Code darstellt, der mit einer Datenbank kommuniziert, nicht nur mit PDO. Was passiert, wenn eine Verbindung mitten in einer Transaktion verloren geht? Sie möchten nicht, dass Ihr Skript die Verbindung wieder herstellt und dort aufhebt, wo es aufgehört hat, weil die gesamte Arbeit, die Sie bis zum letzten Commit geleistet haben, verloren gegangen ist und die Wahrscheinlichkeit besteht, dass es keinen logischen Sinn ergibt, fortzufahren Nach dem Wiederherstellen müssen Sie neu beginnen. Daher möchten Sie wahrscheinlich nur, dass das gesamte Skript neu beginnt, und der Versuch, eine erneute Verbindung herzustellen, würde keinen Sinn ergeben. Dies ist wahrscheinlich der Grund, warum mySQLI das Wiederverbinden unterstützt, PDO jedoch nicht.

Wenn Ihr Skript nur Lesevorgänge oder nicht transaktionale Schreibvorgänge ausführt, hat der obige Ansatz immer noch einen Wert, aber sobald Sie Transaktionen in den Mix werfen, ist es viel besser, wenn Sie nicht versuchen, die Verbindung wiederherzustellen.

    
GordonM 05.04.2016 10:24
quelle
-1

Ich denke, das kann Ihnen helfen.

%Vor%     
Firoz 13.12.2013 05:22
quelle

Tags und Links