phpbar.de logo

Mailinglisten-Archive

[php] php-Sessions? (ap)

[php] php-Sessions? (ap)

Friedhelm Betz holliwell at gmx.net
Son Sep 26 14:28:57 CEST 2004


Hi Alexander,

>
> Nochmal - habe leider noch keine Antwort bekommen - kann mir eine
> helfen?
>
> Hmmmm - kommen meine Mails nur nicht in der Liste an oder kann/will
> mir keiner Helfen? :-(

Niels hatte Dir darauf ja schon geantwortet, moeglicherweise hast Du dich 
etwas missverstaendlich ausgedrueckt. Was willst Du erreichen und was 
funktioniert nicht, was Du probiert hast? 
Meine Interpretation von Deiner Mail: 
Wie kann ich erreichen, dass veraltete Sessiondaten auf dem Server nach 
irgendeiner Regel geloescht werden? Das soll unabhaengig davon funktionieren, 
ob sich Leute ausloggen oder nicht?

Du hast versucht, das ueber session.gc_maxlifetime und session.gc_probability, 
wie beschrieben, zu erreichen und das hat nicht geklappt.

Anhand der Antwort von Niels kann man sehen, dass die Interpretation auch 
anders ausfallen kann ;-)

> ----------
>
> Ich verstehe das nicht... ich habe eine Seite mit Userlogin.
> Geht auch alles super... das Problem:
>
> ich habe den Parameter:
>
> session.gc_maxlifetime
>
> eigentlich so verstanden das nach der maxlifetime eine Session
> (sollte sie nicht mehr erneuert werden) gelöscht wird.... der
> Standart ist 1440 also 24 Min.?!

Konkreter: Falls ein GC-Lauf stattfindet, werden Sessiondaten die  
session.gc_maxlifetime uebserschritten haben, geloescht. 
Wenn nur alle 14 Tage ein GC-Lauf stattfindet, liegen haufenweise Sessiondaten 
auf dem Server, die uralt sind.

Die Wahrscheinlichkeit, dass _beim Starten_ einer Session ein GC-Lauf 
stattfindet, berechnet sich nach:
session.gc_probability/session.gc_divisor gibt irgendeine Prozentzahl z.B. 
1/100.
Aber das weisst Du ja ;-)

>
> Wenn sich aber nun jemand nicht abmeldet bleiben die Session-Dateien
>
> >24h und noch länger da - 

Siehe oben...

> >obwohl ich sogar bei einem LOGOUT den Wert 
>
> für session.gc_probability auf 100/100 setzte so das bei JEDEM LOGOFF
> von irgendejemanden ein GC-lauf sein sollte...
>
> Wo ist der Fehler?

Genau hier:
_Am Skriptende_ beim logoff setzt Du mit ini_set die session.gc_probability 
auf 100/100, das hat aber nur Auswirkungen in Deinem aktuellen Skript. Ist 
dein Skript zu Ende, gelten wieder die globalen Einstellungen aus php.ini, 
httpd.conf oder .htaccess, die wahrscheinlich auf 1/100 stehen.
Startet die naechste Session, gelten diese globlen Einstellungen, dein ini_set 
aus einem abgelaufenem Skript interessieren nicht.

Langer Rede kurzer Sinn: 
Wenn Du die Wahrscheinlichkeit erhoehen willst, dass ein GC-Lauf startet, 
musst Du in Deinem Skript session.gc_probability vor session_start setzen.

Wenn Du alle Sessiondaten verarbeitet hast, die Session und die Sessiondaten 
nicht mehr brauchst, kannst Du mit $_SESSION = array(); das Sessionarray von 
allen Variablen und Werten befreien und anschliessend mit session_destroy die 
zugehoerigen Sessiondaten auf dem Server loeschen. Bietet sich bei einem 
kontrollierten Logout-Vorgang an und wuerde ich auch so empfehlen, dann 
liegen keine uralt Sessiondaten auf dem Server rum.

Ein Problem hast Du nur, wenn sich jemand nicht aussloggt und der oben 
beschriebene Mechanismus nicht greift. 

Aus Performancegruenden ist es empfehlenswert, ganz auf die GC-Routinen von 
PHP zu verzichten und verbliebene veraltetete Sessiondaten andersweitig 
loszuwerden (z.B. cronjob). Das verhindert den Overhead, dass bei jedem 
Skript, das eine Session startet der ganze GC-Mechanismus angeworfen wird.

Ein letzter Tipp: Falls Du auf einem shared Hosting Server bist, wuerde ich 
Dir empfehlen, den session.save_path in ein eigenes temp Verzeichnis zu legen 
(im Gegensatz zu einem serverweiten /tmp Verzeichnis). Dann hast Du bessere  
Kontrolle ueber _deine_ Sessiondaten (und sicherer ist es auch) ;-)

Genug gelabbert, Gruesse
Friedhelm

-- 
http://www.jungle-world.com/

php::bar PHP Wiki   -   Listenarchive