Persistente Verbindungen: MySQL, PHP

JensP

New Member
Hallo Zusammen,

ich muss in einem Webprojekt (PHP, MySQL) temporäre Tabellen verwenden. Dafür habe ich PDO gesagt es soll persistent connecten. Das verbundene PDO Objekt speichere ich in einer statischen Variable.

Ich dachte, dass PDO::ATTR_PERSISTENT dafür sorgt, dass bei erneutem Laden der Seite die gleiche Verbindung genutzt wird und so angelegte temporäre Tabellen noch da sind. Die Verbindung wird aber closed, wenn das Skript durchgelaufen ist.

Was anscheinend ein Denkfehler meinerseits ist, führte mich dazu, zu versuchen, das verbundene PDO Objekt in der Session zu speichern, weil genau so lange will ich die Verbindung auch offen halten. Allerdings ohne Erfolg.

Gibt es eine Möglichkeit das PDO Objekt dauerhaft zu speichern und so auch die Verbindung zur DB dauerhaft offen zu halten? Oder mache ich generell was falsch?

Gruß

Jens
 
Persistente Verbindungen sind NICHT an einen Besucher oder eine Session gebunden und haengen auch von der Einbindungsmethode ab.

Wenn PHP als CGI rennt sind persistente Verbindungen generell nicht moeglich da der PHP-Prozess nach Abarbeitung stirbt.

Fastcgi waere es zumindest prinzipiell moeglich, allerdings habe ich bei einer kurzen Google-Suche nur "crashs on fastcgi" gefunden; sieht also nicht rosig aus.

mod_php funktionieren persistente Verbindungen, allerdings NUR im gleichen Fork.
Sobald der Fork sein Lebensende erreicht hat wird auch die Verbindung geschlossen.
Zu beachten ist auch dass die Wahrscheinlichkeit dass der gleiche Worker 2x hintereinander den gleichen Benutzer beliefert (und nur diesen) gleich null ist.

Wenn persistente Verbindungen die einzige Loesung sind so musst du leider auf eine andere Methode ausweichen; deine PHP-Skripte liefern einem Daemon die Query welcher dieser auf der korrekten persistenten Verbindung ausfuehrt und die Daten zurueckliefert.
 
mod_php funktionieren persistente Verbindungen, allerdings NUR im gleichen Fork.Sobald der Fork sein Lebensende erreicht hat wird auch die Verbindung geschlossen.Zu beachten ist auch dass die Wahrscheinlichkeit dass der gleiche Worker 2x hintereinander den gleichen Benutzer beliefert (und nur diesen) gleich null ist.

Danke für Infos. Allerdings dachte ich das ein Pool an Verbindungen offen gehalten wird und so einem User / Session die Möglichkeit gibt, die Verbindung zu halten. Schade da ich aus meheren externen Dienste Daten aggregiere, wären temporäre Tabellen auf Grund der unterschiedlichen Latenzen und Geschwindigkeiten sehr schick gewesen.

Ich kann evtl. auch Memcache, APC, oder ähnliches nutzen, auch wenn ich dann Arrays sortieren muss, wäre mit SQL halt schicker gewesen. Hat da jemand ne gute Idee?

Gruß

Jens
 
Ich kann evtl. auch Memcache, APC, oder ähnliches nutzen, auch wenn ich dann Arrays sortieren muss, wäre mit SQL halt schicker gewesen. Hat da jemand ne gute Idee?

Wie bereits gesagt; ein (bsp PHP-basierender) Daemon welcher mittels Sockets die Anfrage empfaengt, verarbeitet und beantwortet. Dann kannst du alles ueber eine einzelne MySQL-Verbindung laufen lassen.
 
Ja ich denke dass ich mich für eine andere cachingbasierten Methode entscheiden werde. Ist nur noch die Frage welche. Im Moment tendiere ich zu Memcache da ich schonmal was gemacht hatte. APC noch nie.... muss ich halt sehen wie performant das mit Array klappt ;) ... ein wenig trauer ich schon den temp. Tables hinterher ;)
 
Lösung

Ich habe mich dann doch für eine DB basierte Lösung entschieden. Ich nutze eine extra Datenbank, welche Memory als Engine nutzt und so komplett im Arbeitspeicher bleibt.

Das ist sehr performant und nichts was dauerhaft sein soll, daher vielleicht sogar die schickere Alternative zu temporären Tabellen.
 
Back
Top