web-dev-qa-db-de.com

Lebensdauer der Sitzungscookies in PHP bei RHEL vs Mint unterschiedlich?

Entschuldigung, wenn das langwierig ist:

Ich habe die gleiche Site auf zwei Servern (server_old & server_new). Es ist eine von Hand gerollte PHP & Ajax-Sache, die ich gemacht habe, um mein Inventar zu verwalten und Geräte an Kunden auszuleihen. Es verfügt über ein grundlegendes Anmeldesystem, das dem auf dieser Website beschriebenen ähnelt: So erstellen Sie ein sicheres Anmeldeskript in PHP und MYSQL . Es werden also PHP Sitzungsvariablen verwendet, um zu überprüfen, ob Sie angemeldet sind, und Sie zu der Anmeldeseite zu zwingen, wenn nicht. Ich habe keinen Mechanismus implementiert, der Sie nach so vielen Minuten oder Stunden rausschmeißen könnte, zumindest nicht absichtlich.

Auf Server_old wird Linux Mint 17 mit Apache 2.4.7 & PHP 5.5.9 ausgeführt, und auf Server_new wird RHEL 7 mit Apache 2.4.6 & PHP 5.4.16 ausgeführt.

Ich habe in der httdp.conf & php.ini beider Systeme nachgesehen und kann nicht herausfinden, warum:

Wenn ich auf der Site unter server_old angemeldet bin, scheint mein Login nur für etwa 20 Minuten Inaktivität gültig zu sein. Dies ist sinnvoll, wenn sich gc_maxlifetime darauf auswirkt. Wenn ich versuche, auf eine Seite zuzugreifen, nachdem ich so lange im Leerlauf gesessen habe, werde ich zur Anmeldeseite weitergeleitet. Das ist natürlich gut für die Sicherheit, also keine Beschwerden.

Dann habe ich die Site und die Datenbank nach server_new migriert und bin seit einigen Stunden ohne Aktivität angemeldet und es ist immer noch gut. Ich weiß, dass es mehr als 2 Stunden waren und ich bin mir ziemlich sicher, dass es mehr als 3 Stunden sind. Ich kann mich immer noch manuell abmelden und die Site lässt mich die Anmeldeseite erst wieder passieren, wenn ich mich wieder anmelde, damit dieser Teil funktioniert.

Ich kann nur nicht herausfinden, warum ich mich nach ein paar Minuten bei Mint von der Site abgemeldet habe und meine PHP Sitzungen bei RHEL anscheinend ewig dauern. Beide Server haben:

  • session.cookie_lifetime = 0
  • session.cache_expire = 180 (180 Minuten)
  • session.gc_maxlifetime = 1440 (1440 Sekunden/24 Minuten)

phpinfo () meldet auf beiden Systemen dasselbe. Auf Mint ist gc_probability jedoch auf 0/1000 gesetzt (im Grunde genommen wird der Müll nie eingesammelt?), Während auf RHEL 1/1000 gesetzt ist. Sie würden denken, dass niemals das Sammeln des Mülls und das Setzen von cookie_lifetime = 0 bedeuten würde, dass die Sitzung für Mint für immer andauern würde. Aber es ist anscheinend das Gegenteil.

Beide Apache-Server wurden ebenfalls mit demselben Timeout, KeepAlive usw. eingerichtet.

Irgendwelche Ideen?

2
user2461087

Was hier passiert, ist hauptsächlich auf die Unterschiede in der Garbage Collection zwischen verschiedenen Linux-Versionen zurückzuführen. Wie oben von @Tim Fountain erwähnt, führt die Garbage Collection in Debian-basierten Linux-Versionen die Garbage Collection über einen Cron-Job durch. Eine Überprüfung der PHP-Dokumentation für Sitzungen stellt fest, dass die in gc_maxlifetime festgelegte Zeit die Anzahl der Sekunden ist, nach denen Daten als Müll betrachtet und möglicherweise bereinigt werden. Wenn die Garbage Collection auf Ihrem Server nicht regelmäßig ausgeführt wird, wird dies nicht ausgelöst und die Daten bleiben erhalten.

Die zuverlässigste Methode, um einen Benutzer nach einer bestimmten Leerlaufzeit von einer Sitzung abzumelden, ist das Hinzufügen einer Sitzungsvariablen mit dem Namen lastAction, die mit der Funktion time() ein Unix-Zeitstempel sein sollte. Bei jeder Anforderung wird zunächst überprüft, ob der Zeitstempel lastAction älter als eine bestimmte Anzahl von Sekunden ist (basierend auf der gewünschten maximalen Leerlaufzeit). Wenn die Sitzung dann beendet wird, führen Sie den folgenden Befehl aus Melden Sie sich ab und leiten Sie den Benutzer zur Anmeldeseite weiter. Wenn die maximale Anzahl von Sekunden unterschritten wird, setzen Sie den Wert der Sitzungsvariablen lastAction auf den aktuellen Zeitstempel der Einheit zurück und fahren Sie fort.

1