php.de

Zurück   php.de > Webentwicklung > PHP-Fortgeschrittene

PHP-Fortgeschrittene Arbeiten mit PHP ohne Einschränkungen

Antwort
 
LinkBack Themen-Optionen Bewertung: Bewertung: 1 Stimmen, 5,00 durchschnittlich.
Alt 15.08.2008, 17:24  
Neuer Benutzer
 
Registriert seit: 15.08.2008
Beiträge: 9
Chestarbargel befindet sich auf einem aufstrebenden Ast
Standard [Erledigt] Merkwürdiges Verhalten bei Datenbank basierten Sessions

Servus,

ich habe vor einer Weile eine Session-Klasse geschrieben, die nun die Session in einer Datenbank(MySQL) statt im Dateisystem speichert.
In rund 0,003% der Fälle tritt aber ein Problem beim speichern der Session auf, bei dem ich nicht weiterkomme.
Das speichern der Session wird im destructor ausgeführt, welcher ja automatisch am Skriptende aufgerufen wird.

Und zwar wurde die MySQL-Verbindung wegen einem timeout bereits geschlossen, und daher schlägt das schreiben mit dem Fehler:
2006: MySQL server has gone away
fehl.

Eine Fehleranalyse brachte nun folgendes zu Tage:
Zwischen dem erstellen des Sessions-Objekts und dem zerstören des Session-Objekts liegen zB. 30, 60, 90, 120, usw.Sekunden(Zeitmessung im constructor/destructor).
Nun liegt aber die maximum_execution_time bei 30 Sekunden.
Die Seite selber wird aber immer in weniger als 1 Sekunde fertiggestellt(Zeitmessung zwischen dem ersten und letzten php-Befehl)

Ich habe schon geprüft, dass nirgendwo:
-Die maximum_execution_time heraufgesetzt wird
-Nirgendwo set_time_limit für den Fehler verantwortlich ist

Ich nutze php 5.2.6 und bin ein wenig ratlos, und wäre für weiterführende Tipps dankbar.

Grüße,
Chestarbargel
Chestarbargel ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 15.08.2008, 17:34  
Moderator und Wett-König
 
Benutzerbild von dr.e.
 
Registriert seit: 21.05.2008
Beiträge: 3.657
PHP-Kenntnisse:
Fortgeschritten
dr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblick
dr.e. eine Nachricht über Skype™ schicken
Standard

Hallo,

ich vermute, dass dir hier die Implementierung des Destruktor-Verhaltens einen Streich spielt. Soweit ich das im Kopf habe, entscheidet PHP selbst über die Reihenfolge der Destruktion von Objekten oder richtet sich nach der Reihenfolge der Erstellung deiner Objekte. In beiden Fällen hast du das Problem, dass du nicht deterministisch sagen kannst, wann deine Session-Klasse die Sessions persistiert. Sollte also deine Datenbank-Abstraktionsschicht vor deiner Session-Klasse destruktiert werden, ist die MySQL-Verbindung logischerweise weg.

Die großen Zeitunterschiede zwischen Konstruktor und Destruktor kann ich mir auch nicht erklären.
__________________
Viele Grüße,
Dr.E.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Think about software design before you start to write code!
2. Discuss and review it together with experts!
3. Choose good tools (-> Adventure PHP Framework (APF))!
4. Write clean and reusable software only!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. ist offline   Mit Zitat antworten
Alt 15.08.2008, 17:57  
Neuer Benutzer
 
Registriert seit: 15.08.2008
Beiträge: 9
Chestarbargel befindet sich auf einem aufstrebenden Ast
Standard

Seruvs.
Zitat:
Zitat von dr.e. Beitrag anzeigen
Hallo,

ich vermute, dass dir hier die Implementierung des Destruktor-Verhaltens einen Streich spielt. Soweit ich das im Kopf habe, entscheidet PHP selbst über die Reihenfolge der Destruktion von Objekten oder richtet sich nach der Reihenfolge der Erstellung deiner Objekte.
Dieses Verhalten ist mir bekannt.
Ich ging davon aus, dass ich es mit:
PHP-Code:
class session extends mysql 
umgehen kann.
Das Session-Objekt erzeugt dadurch eine eigene Verbindung zur Datenbank. (Nach dem Studium weiterer fortgeschrittener Konzepte, erscheint mir das momentan auch nicht mehr unbedingt als sinnvoll)

Wenn also durch den Destructor der mysql-Klasse auch der parent von session destruktiert wird, ist mir das Verhalten klar.

Bei den langen Laufzeiten wundert mich, das es in allen Fällen vielfache der maximum_execution_time sind. Als ich testweise den Wert auf 20 Sekunden gesetzt habe, waren es 40,80,100 usw. Sekunden.

Grüße,
Chestarbargel
Chestarbargel ist offline   Mit Zitat antworten
Alt 15.08.2008, 18:03  
Erfahrener Benutzer
 
Benutzerbild von David
 
Registriert seit: 05.09.2007
Beiträge: 5.044
David wird schon bald berühmt werden
Standard

Benutzt Du session_set_save_handler() oder ist das ganze "Freihand"-implementiert?
David ist offline   Mit Zitat antworten
Alt 15.08.2008, 19:32  
Neuer Benutzer
 
Registriert seit: 15.08.2008
Beiträge: 9
Chestarbargel befindet sich auf einem aufstrebenden Ast
Standard

Servus.

Zitat:
Zitat von David Beitrag anzeigen
Benutzt Du session_set_save_handler() oder ist das ganze "Freihand"-implementiert?
Ich benutze
session_set_save_handler
im constructor sowie
session_write_close
im destructor.

Grüße,
Chestarbargel
Chestarbargel ist offline   Mit Zitat antworten
Alt 15.08.2008, 19:48  
Erfahrener Benutzer
 
Benutzerbild von David
 
Registriert seit: 05.09.2007
Beiträge: 5.044
David wird schon bald berühmt werden
Standard

Wenn Du set_save_handler benutzt, wird die angegebene Funktionen
callback $close und callback $write von PHP aufgerufen, wenn es an der Zeit ist, die Session-Daten zu sichern. Das mit dem Destruktor zu verknüpfen, "fühlt" sich nicht richtig an.
Damit habe ich mich noch nicht beschäftgt, aber wie gessagt, es ein "Gefühl", dass das nicht passt.
Ich weiss ja nicht, wie der Code genau aussieht, aber einfache Überlegung: session_set_save_handler(array($this, 'onOpen'), array($this, 'onClose'), ...
Damit besteht eine Referenz auf das Objekt in der Session-Verwaltung.
Das Objekt kann nur dann "gracefully" abgebaut werden, wenn es keine Referenz mehr gibt. Du beendet die Session aber erst explizit im Destruktor des Objekts.
Wann wird also was abgebaut? Meine Vermutung ist: PHP löst diesen "Konflikt" nicht (oder anscheined nicht immer) so auf, wie Du es erwartest.
David ist offline   Mit Zitat antworten
Alt 15.08.2008, 21:59  
Moderator und Wett-König
 
Benutzerbild von dr.e.
 
Registriert seit: 21.05.2008
Beiträge: 3.657
PHP-Kenntnisse:
Fortgeschritten
dr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblick
dr.e. eine Nachricht über Skype™ schicken
Standard

Zitat:
session_set_save_handler(array($this, 'onOpen'), array($this, 'onClose'), ...
Damit besteht eine Referenz auf das Objekt in der Session-Verwaltung.
Das würde ich auch so erwarten, ich habe aber gerade in den letzten Tagen gesehen, dass während des Shutdowns bzw. der Destruktion offensichtlich andere Regeln (Referenzen) gelten.
__________________
Viele Grüße,
Dr.E.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Think about software design before you start to write code!
2. Discuss and review it together with experts!
3. Choose good tools (-> Adventure PHP Framework (APF))!
4. Write clean and reusable software only!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. ist offline   Mit Zitat antworten
Alt 15.08.2008, 22:08  
Erfahrener Benutzer
 
Benutzerbild von David
 
Registriert seit: 05.09.2007
Beiträge: 5.044
David wird schon bald berühmt werden
Standard

Zitat:
Zitat von dr.e. Beitrag anzeigen
dass während des Shutdowns bzw. der Destruktion offensichtlich andere Regeln (Referenzen) gelten.
Genau das meine ich ja.
Ich kann mir mehrere Szenarien vorstellen in Bezug auf die Referenz- und Resourcenverwaltung und dem Beenden der PHP-Instanz, bei der es hier knallen kann.
David ist offline   Mit Zitat antworten
Alt 16.08.2008, 14:54  
Neuer Benutzer
 
Registriert seit: 15.08.2008
Beiträge: 9
Chestarbargel befindet sich auf einem aufstrebenden Ast
Standard

Servus.

Zitat:
Zitat von David Beitrag anzeigen
Wenn Du set_save_handler benutzt, wird die angegebene Funktionen
callback $close und callback $write von PHP aufgerufen, wenn es an der Zeit ist, die Session-Daten zu sichern. Das mit dem Destruktor zu verknüpfen, "fühlt" sich nicht richtig an.
Am Ende eines Skriptes werden ja zuerst die Objekte zerstört, und dann die Session geschrieben.
Daher ging ich davon aus, dass ich spätestens beim zerstören des Sessionobjektes die Session schreiben muss.
Dem ist dann nicht so, daher habe ich den Aufruf entfernt.

Zitat:
Zitat von David Beitrag anzeigen
Du beendet die Session aber erst explizit im Destruktor des Objekts.
Wann wird also was abgebaut? Meine Vermutung ist: PHP löst diesen "Konflikt" nicht (oder anscheined nicht immer) so auf, wie Du es erwartest.
Dadurch wurde die Session sogar früher geschrieben als ohne den expliziten Aufruf von session_write_close im destructor.

Mir ist zusätzlich noch aufgefallen, dass ich es sogar direkt nach dem erstellen wieder zerstören kann(ohne session_write_close im destructor), und die Sessions werden trotzdem sauber am Ende des Skriptes gespeichert.

Habe nun über nacht nochmal Logs erstellen lassen, um genauer sehen zu können, was passiert. Dabei lief die session schon ohne den expliziten Aufruf von session_write_close im destructor.

Fazit:
Problem bleibt das gleiche, in seltenen Fällen habe ich gemessene Zeiten zwischen dem öffnen und schreiben einer Session, die größer als max_execution_time sind.
Die Skripte werden auch nicht mit einem Fatal-Error beendet.
Und nur in den Fällen mit diesen riesigen Zeiten, tritt eben der Fehler auf.

Zählt die Scriptabschaltung nicht mehr zur max_execution_time dazu?
Dann wäre schonmal die Sache an sich nicht mehr so unklar, ich müsste nur noch herausfinden, wieso er manchmal so ewig braucht, bis das schreiben der Session ausgeführt wird.

Grüße,
Chestarbargel
Chestarbargel ist offline   Mit Zitat antworten
Alt 17.08.2008, 19:03  
Erfahrener Benutzer
 
Benutzerbild von David
 
Registriert seit: 05.09.2007
Beiträge: 5.044
David wird schon bald berühmt werden
Standard

Ich fürchte, das können wir ohne den kompletten Code nicht aufklären.
David ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Merkwürdiges Verhalten von Objekten in einem Array PHP-Fortgeschrittene 6 20.10.2005 00:18
Merkwürdiges Verhalten der phpsessions um Mitternacht herum PHP-Fortgeschrittene 17 15.02.2005 14:20

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
datenbank basierte sessionverwaltung, php.de session zeitmessung, session verhalten php 5.2, sessionverwaltung datenbank, php destructor 60 seconds, session db klasse destruktor

Alle Zeitangaben in WEZ +2. Es ist jetzt 00:33 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum