Bitte lesen Sie diese Antwort weiter unten , in der die Möglichkeiten zur Minderung der hier beschriebenen Probleme aufgeführt sind.
Bei der Verwendung von PDO bestehen dieselben Nachteile wie bei jeder anderen PHP-Datenbankschnittstelle, die dauerhafte Verbindungen herstellt: Wenn Ihr Skript während eines Datenbankvorgangs unerwartet beendet wird, wird die nächste Anforderung, die die verbleibende Verbindung erhält, dort fortgesetzt, wo das tote Skript aufgehört hat. Die Verbindung wird auf Prozessmanagerebene offen gehalten (Apache für mod_php, der aktuelle FastCGI-Prozess, wenn Sie FastCGI verwenden usw.), nicht auf PHP-Ebene, und PHP weist den übergeordneten Prozess nicht an, die Verbindung zu beenden, wenn Das Skript wird abnormal beendet.
Wenn das tote Skript Tabellen gesperrt hat, bleiben diese Tabellen gesperrt, bis die Verbindung unterbrochen wird oder das nächste Skript, das die Verbindung erhält, die Tabellen selbst entsperrt.
Wenn sich das Dead-Skript mitten in einer Transaktion befand, kann dies eine Vielzahl von Tabellen blockieren, bis der Deadlock-Timer aktiviert wird, und selbst dann kann der Deadlock-Timer die neuere Anforderung anstelle der älteren Anforderung, die das Problem verursacht, beenden.
Wenn sich das tote Skript mitten in einer Transaktion befand, erhält das nächste Skript, das diese Verbindung erhält, auch den Transaktionsstatus. Es ist sehr wahrscheinlich (abhängig von Ihrem Anwendungsdesign), dass das nächste Skript möglicherweise nie versucht, die vorhandene Transaktion festzuschreiben, oder festschreibt, wenn dies nicht der Fall sein sollte, oder ein Rollback, wenn dies nicht der Fall sein sollte.
Dies ist nur die Spitze des Eisbergs. Dies kann bis zu einem gewissen Grad gemildert werden, indem bei jeder einzelnen Skriptanforderung immer versucht wird, nach einer fehlerhaften Verbindung aufzuräumen. Dies kann jedoch je nach Datenbank problematisch sein. Es sei denn , Sie identifiziert haben Datenbankverbindungen wie das Erstellen der eine Sache , die ein Engpass in Ihrem Skript (das heißt , Sie done Code haben Profilierungs mit xdebug und / oder xhprof ), sollten Sie nicht persistente Verbindungen als Lösung für alles in Betracht ziehen.
Darüber hinaus haben die meisten modernen Datenbanken (einschließlich PostgreSQL) ihre eigenen bevorzugten Methoden zum Durchführen von Verbindungspools, die nicht die unmittelbaren Nachteile aufweisen, die einfache Vanilla-PHP-basierte persistente Verbindungen haben.
Um einen Punkt zu verdeutlichen, verwenden wir an meinem Arbeitsplatz dauerhafte Verbindungen, jedoch nicht nach Wahl. Wir hatten ein seltsames Verbindungsverhalten, bei dem die anfängliche Verbindung von unserem App-Server zu unserem Datenbankserver genau drei Sekunden dauerte, wenn sie einen Bruchteil einer Sekunde hätte dauern sollen. Wir denken, es ist ein Kernel-Bug. Wir haben es aufgegeben, Fehler zu beheben, da dies zufällig geschah und nicht bei Bedarf reproduziert werden konnte und unsere ausgelagerte IT nicht die konkrete Fähigkeit hatte, es aufzuspüren.
Unabhängig davon, wann die Leute im Lager ein paar hundert eingehende Teile bearbeiten und jedes Teil dreieinhalb Sekunden statt einer halben Sekunde dauert, mussten wir Maßnahmen ergreifen, bevor sie uns alle entführten und uns dazu brachten, ihnen zu helfen. Wir haben also ein paar Kleinigkeiten in unserer selbst entwickelten ERP / CRM / CMS-Monstrosität auf den Kopf gestellt und alle Schrecken dauerhafter Verbindungen aus erster Hand erlebt. Wir haben Wochen gebraucht, um all die subtilen kleinen Probleme und bizarren Verhaltensweisen aufzuspüren, die scheinbar zufällig passiert sind. Es stellte sich heraus, dass diese einmal pro Woche schwerwiegenden Fehler, die unsere Benutzer fleißig aus unserer App herausgedrückt hatten, gesperrte Tabellen, abgebrochene Transaktionen und andere unglückliche Wonky-Zustände hinterließen.
Diese Schluchzergeschichte hat einen Punkt: Sie hat Dinge gebrochen, von denen wir nie erwartet hatten, dass sie brechen, alles im Namen der Aufführung. Der Kompromiss hat sich nicht gelohnt und wir warten gespannt auf den Tag, an dem wir ohne Aufruhr unserer Benutzer zu normalen Verbindungen zurückkehren können.