Wie starte ich Apache neu, ohne die Benutzersitzungen zurückzusetzen?

8

Benutzer ist auf einer PHP-Website angemeldet> Ich starte Apache neu> Benutzer muss sich erneut anmelden.

Wie kann man das verhindern? (Ich möchte nicht, dass sich der Benutzer erneut anmelden muss.)

dowik
quelle
Zur Überprüfung: Sie haben die Möglichkeit, das PHP zu bearbeiten, oder?
Peter Taylor
Wenn es sich um Ihre eigene Anwendung handelt, würde ich vorschlagen, was @Jacob Hume unten vorgeschlagen hat, und Ihre Anwendung so ändern, dass Sitzungen in einer Datenbanktabelle gespeichert werden. Dies gibt Ihnen meiner Meinung nach mehr Kontrolle über Ihre Website, da Sie Benutzer zwingen können, sich bei Bedarf selektiv abzumelden.
Anagio
Ich kann PHP bearbeiten. Ich benutze ein CMS (Drupal). Ich benutze auch APC und habe nach einer Lösung auf diese Weise gesucht.
Dowik

Antworten:

6

Das Speichern eines Sitzungstokens an einem anderen Speicherort als Sicherung würde dieses Problem verhindern. Sie können Ihre Hauptinformationen weiterhin behalten $_SESSION, aber ein Backup-Token behalten:

  • Kekse
  • Datenbankeinträge
  • Lokaler HTML5-Speicher

In dieser StackOverflow-Frage finden Sie möglicherweise Hilfe: Best Practice für Sitzungszeitlimits und dauerhafte Anmeldung in PHP .

Jacob Hume
quelle
Danke für die Antwort und danke für den Link. Ich suchte nach einer Lösung für die serverseitige Konfigurationsdatei (eine Art "Sitzungen über Neustart hinweg beibehalten"). Aber es scheint, dass die Lösung auf der App-Seite liegt.
Dowik
Oh mein ... Tatsächlich suchte ich einfach nach "apache2ctl -k anmutig"!
Dowik
3

Ihre Sitzungsdaten sollten nicht verloren gehen, nur weil Apache heruntergefahren oder neu gestartet wird, es sei denn, die Sitzungsdaten werden im Speicher gespeichert und nicht auf der Festplatte gesichert (entweder vom Dateisystem oder von der Datenbank). Andernfalls könnten Sie den gesamten Server neu starten und die Sitzung würde weiterhin bestehen bleiben. Sitzungsdaten sind so konzipiert, dass sie langfristig gespeichert werden. Die Sitzung geht nur verloren, wenn:

  1. Die SID geht verloren. Die Sitzungsdaten sind weiterhin serverseitig vorhanden, aber der Client kann die SID nicht wiederherstellen und kann daher nicht dieselbe Sitzung erneut starten. Dies kann passieren, wenn das SID-Cookie abläuft (wenn es sich um ein Cookie handelt) oder die Sitzungslinks verloren gehen (wenn die SID ein URL-Parameter ist) oder die SID serverseitig nicht festgelegt oder geändert wird, ohne den Client zu benachrichtigen.

  2. Die Sitzungsdaten werden serverseitig gelöscht. Dies geschieht normalerweise, wenn der PHP Session Garbage Collector ausgeführt wird und die Sitzungsdatei älter als session.gc_maxlifetime ist (standardmäßig 24 Minuten). Andernfalls kann es vorkommen, dass die Anwendung die Sitzung explizit löscht . Auf einigen Servern hat der Administrator möglicherweise auch einen Cronjob konfiguriert, um alte Sitzungsdaten regelmäßig zu bereinigen.

Lèse Majestät
quelle
Vielen Dank für die Details. Ich werde diesen Weg untersuchen. Aber im Moment werde ich einfach den anmutigen Neustart verwenden, der meinen Anforderungen zu entsprechen scheint.
Dowik
@dowik: Wie passt ein ordnungsgemäßer Neustart zu Ihren Anforderungen? Verliert Ihr Problem Sitzungen oder unterbrochene Downloads? Wenn es das letztere ist, wird ein ordnungsgemäßer Neustart / Herunterfahren das tatsächlich lösen. Aber dann sollten Sie Ihre Frage bearbeiten, um dies widerzuspiegeln. Weil ordnungsgemäße Neustarts nichts mit PHP-Sitzungen zu tun haben und anderen Benutzern nicht helfen, den Verlust von Sitzungen zu verhindern.
Lèse Majesté
Ich habe versucht, den Titel meiner Frage zu aktualisieren, indem ich "PHP-Sitzungen" durch "Benutzersitzungen" ersetzt habe, wie im Text meiner Frage beschrieben. Besser für dich? Genauer gesagt: Ich benutze APC. Wenn ich Code in PHP-Dateien ändere, muss ich den APC-Cache leeren (Neustart von Apache ist der einfachste Weg, den ich kenne). Mit dem Argument "Neustart" müssen sich Benutzer meiner Website erneut anmelden. Während mit "anmutig", tun sie nicht. Deshalb "scheint das meinen Bedürfnissen zu entsprechen".
Dowik
@ Dowik: Ich glaube nicht, dass das etwas mit einem ordnungsgemäßen Neustart zu tun hat. Sie hatten höchstwahrscheinlich gerade einen Neustart, der mit dem Garbage Collector für PHP-Sitzungen zusammenfiel. Melden Sie sich erneut an und versuchen Sie sofort danach einen regelmäßigen Neustart. Sofern Sie keine Sitzungen im Speicher (MM) speichern, wird die Sitzung gespeichert.
Lèse Majesté
1

Ermöglicht durch die Verwendung des richtigen Arguments mit Apache:

apache2ctl -k graceful

Apache wird neu gestartet, ohne die aktuellen Sitzungen zu verlieren.

dowik
quelle
2
Ein ordnungsgemäßer Neustart verschiebt das Herunterfahren nur, bis die aktuellen Verbindungen beendet sind. Das Neustartverhalten wird dadurch nicht geändert.
Lèse Majesté