Memcache + PHP-Sitzungsoptimierung: Wie verfallen Memcache-Schlüssel?


7

Ich habe einige Nachforschungen angestellt und keine endgültige Antwort gefunden.

Wir haben eine Web-App, die den PHP + Memcache-Sitzungshandler verwendet.

Ich habe mehrere Fragen, die alle miteinander zusammenhängen, aber letztendlich lautet mein Problem: "Warum laufen PHP-Sitzungen anscheinend nicht ab, wenn wir glauben, dass sie es sein sollten?" dh Der Endbenutzer sollte nach einer festgelegten Zeit von der App abgemeldet sein, ist dies jedoch nicht.

Hier sind die Punkte, bitte helfen Sie mir, sie zu verbinden, und sagen Sie mir, wo ich mich irre:

  • Ich verstehe, dass Memcache Schlüssel basierend auf der eingestellten Zeit in Sekunden (oder Unix-Zeitstempel für größere Werte) abläuft.
  • Der Ablauf ist faul - dh nichts wird im Voraus gelöscht
  • Der PHP-Memecache-Sitzungshandler verwendet die session.gc_max_lifetime, um den Ablauf des Memcache-Schlüssels festzulegen. Idk, vielleicht nicht?
  • Memcache sollte einen angeforderten Schlüssel nicht bereitstellen (und dann möglicherweise auch löschen?), Wenn er einen angeforderten Schlüssel bereitstellt und feststellt, dass er abgelaufen ist. Aber zumindest nicht dienen.
  • Dieser Vorgang, es nicht bereitzustellen, sollte für PHP einer gelöschten Sitzung und dem abgemeldeten Benutzer entsprechen.

Benutzer werden nicht abgemeldet.

Wie kann ich das überhaupt debuggen? Memcache ist nicht gerade transparent.

Der Beispielfall, der nicht funktioniert hat, ist eine Site mit einem Sitzungszeitlimit von zwei Stunden. Ein Beispielbenutzer würde die Site zuletzt nachts verwenden und dann 8 bis 10 Stunden später zur Site zurückkehren und trotzdem angemeldet sein.


Vielleicht der folgende Fehler: bugs.debian.org/cgi-bin/bugreport.cgi?bug=620258
c33s

Das Problem bei der Behandlung von Memcache-basierten Sitzungen besteht darin, dass Ihre Sitzungen verschwinden, wenn Ihnen der zwischengespeicherte Speicherplatz ausgeht ... und Ihre Benutzer wütend werden.
Jauzsika

Antworten:


10

Wir sind auch darauf gestoßen, haben es aber geschafft, uns damit zu beschäftigen und genau herauszufinden, was los ist. Die Symptome, auf die wir stießen, waren, dass Memcache (mit einer relativ großen Speicherzuordnung, die auf mehreren Servern ausgeführt wird) begann, Inhalte zu entfernen. Dies ist unerwünscht, da dies die aktuellen Besucher der Website beeinträchtigen kann.

Bei der Überwachung des Netzwerkverkehrs wurden folgende Nachrichten von PHP an Memcache angezeigt:

set memc.sess.key.abcdabcdabcdabcdabcdabcd 0 0 1823 data ...

Es ist die zweite Null, die die Probleme verursacht - dies bestimmt, wie lange der Memcache das Element zwischenspeichert. Wenn Sie den Wert auf Null setzen, läuft memcache dieses Element nie ab. In Ihrem Fall bedeutete dies, dass Benutzer Stunden später zurückkehren und weiterhin auf Ihre Website zugreifen konnten. In unserem Fall füllte sich der Memcache und die gewünschten Daten wurden entfernt.

Ich habe weiter gegraben und es läuft auf die PHP-Memcached-Erweiterung hinaus. Ab 1.0.2 (das wir ausführen) lautet dieser Code:

sess_lifetime = zend_ini_long(ZEND_STRL("session.gc_maxlifetime"), 0);
if (sess_lifetime > 0) {
    expiration = time(NULL) + sess_lifetime;
} else {
    expiration = 0;
}

In diesem Auszug ZEND_STRL("session.gc_maxlifetime")wird nicht der erwartete Wert zurückgegeben. Dies wurde als Fehler in PHP gemeldet, und ein Fix für die zwischengespeicherte Bibliothek wird unter https://bugs.php.net/bug.php?id=59641 beschrieben .

Ich habe diesen Patch bereitgestellt, den Netzwerkverkehr überprüft und festgestellt, dass die Ablaufzeit wie erwartet festgelegt wird.


Wie wird Ihr PHP bereitgestellt? Benutzerdefiniert aus der Quelle kompiliert? Linux Distribution Binaries + Distribution Updates? Usw. Übrigens, danke für den Tipp, das klingt sehr vielversprechend!
JDS
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.