Ich betreue einen Magento-Shop mit 400-500 Besuchern und 40-50 Bestellungen pro Tag. Kürzlich wurde das System von Magento EE 1.14.2.4 auf Magento EE 1.14.3.2 aktualisiert und ich habe einige merkwürdige Ausnahmen in den Protokollen festgestellt:
exception 'Mage_Core_Model_Session_Exception' in
/var/www/.../app/code/core/Mage/Core/Model/Session/Abstract/Varien.php:418
Ich habe diese Ausnahme verfolgt und weiß, dass sie ausgelöst wird, weil der folgende Sitzungsvalidierungscode die Sitzung nicht validieren kann:
class Mage_Core_Model_Session_Abstract_Varien extends Varien_Object
{
// ...
protected function _validate()
{
// ...
if ($this->useValidateSessionExpire()
&& isset($sessionData[self::VALIDATOR_SESSION_EXPIRE_TIMESTAMP])
&& $sessionData[self::VALIDATOR_SESSION_EXPIRE_TIMESTAMP] < time() ) {
Dieser if-Block wurde der Datei mit der neuesten Version von Magento hinzugefügt. Und dies ist anscheinend eine Bremsänderung, siehe weitere Details unten.
Die Ausnahme passiert ziemlich oft, wie etwa ein Dutzend Mal pro Tag. Aber ich bin nicht in der Lage, Bedingungen, die zur Ausnahme führen, neu zu erstellen, es sei denn, ich habe die obige Bedingung wörtlich erfüllt. Die Ausnahmen treten am häufigsten auf Produktdetailseiten und im letzten Schritt einer Seitenprüfung auf. Der Shop ist ein b2b-Shop. Der Benutzer muss eingeloggt sein, um die Produktseite zu sehen oder zur Kasse zu gehen. Dies bedeutet, dass der Benutzer zur Anmeldeseite umgeleitet wird, wenn die Sitzung ungültig ist / abgelaufen ist. Momentan ist es mir wichtiger, dieses Problem beim Checkout zu beheben.
Was passiert aus Benutzersicht: Der Benutzer füllt den Einkaufswagen, geht zur Kasse und erreicht den letzten Schritt. Dann drückt er den "Bestellung abschicken" -Button und es passiert nichts. Hinter den Kulissen führt Magentos JS eine AJAX-Anfrage aus und JS erwartet, JSON zurück zu erhalten. Wenn dieser Fehler auftritt, wird der HTML-Code der Anmeldeseite zurückgegeben, der nicht von JavaScript analysiert werden kann, und es geschieht einfach nichts. Das ist super verwirrend für User.
Nun, das ist kein vollständiges Benutzerszenario, wir haben uns mit den Benutzern in Verbindung gesetzt und sie haben uns gesagt, dass sie einige Tage zwischen dem Füllen des Einkaufswagens und dem Absenden der Bestellung gewartet haben. Was das genau bedeutet, ist schwer herauszufinden, weil sich die Leute einfach nicht daran erinnern.
Lebensdauer der PHP-Sitzung - 350000 (~ 4 Tage in Sekunden) Lebensdauer der Cookies - 345600 (4 Tage)
Hier ist die eigentliche Frage: Wie kann ich herausfinden, welche Art von Benutzerverhalten zur Ausnahme geführt hat?
UPDATE Soweit ich weiß, dass in folgenden Klassen Ausnahmen gemäß der gestellten Anfrage auftreten, bedeutet das für mich leider nichts.
/catalogsearch/result/?q=… Mage_Core_Model_Session
/checkout/cart/ Mage_Core_Model_Session
/checkout/onepage/saveOrder/… Mage_Rss_Model_Session
/customer/account/loginPost/ Mage_Core_Model_Session
/customer/account/loginPost/ Mage_Reports_Model_Session
/customer/account/logout/ Mage_Reports_Model_Session
/catalog/product/view/… Mage_Reports_Model_Session
/catalog/product/view/… Mage_Tag_Model_Session
UPDATE 2 : Sitzungen werden in Dateien gespeichert und vom Garbage Collector für PHP-Sitzungen bereinigt. Ob dies eine gute Wahl ist oder nicht, ist nicht Gegenstand dieser Frage.
quelle
Antworten:
Nach einigem fortgeschrittenen Debuggen, Nachverfolgen von Sitzungen und Nachdenken über all diese Magie war ich in der Lage, das Problem zu reproduzieren und den Grund dafür zu verstehen. Ich habe eine kleine Timing-Illustration vorbereitet, die Sie unten sehen können.
/sales/order/save/...
Anfrage)So reproduzieren Sie:
Grund:
Es gibt bestimmte Sitzungen, die nur bei bestimmten Anforderungen instanziiert werden, z. B.
Mage_Rss_Model_Session
nur beim eigentlichen Checkout und nicht beim Durchsuchen des Katalogs. Gleichzeitig wird der Ablaufzeitstempel der Sitzung nur festgelegt, wenn die Sitzung instanziiert wurde. Das bedeutet, dass der neue Magento-Code eine Ausnahme auslöst, wenn zwischen zwei Auscheckvorgängen genügend Zeit liegt und die Sitzung zwischenzeitlich nicht beendet wurde (da der Benutzer abgemeldet ist oder das Cookie abgelaufen ist) mich.Wie repariert man:
Nun, ich habe einige Möglichkeiten:
Wie habe ich das herausgefunden:
Ich habe mit dem Hinzufügen des Folgenden zum Originalcode von begonnen
Mage_Core_Model_Session_Abstract_Varien
Es gab mir einen guten Einblick in die betroffenen Klassen und ihre Korrelation und wie viel Sitzung abgelaufen waren. Das erklärte aber nicht, warum es passiert und welche Benutzeraktionen zum Problem führen.
Dann begann ich zu überlegen, wie ich alle Änderungen an den Sitzungsdaten nachverfolgen kann. Dabei stellte sich die Frage /superuser/368231/automatic-versioning-upon-file-change-modify-create-delete, die ich angegeben hatte Ein Versuch
git
und eineincron
Kombination, aber nachdem ich sie implementiert und in einer Sandbox getestet hatte, wurde mir klar, dass mir in der Produktion sehr schnell der Speicherplatz ausgehen wird.Ich habe beschlossen, ein kleines PHP-Skript zu erstellen, das Sitzungsdaten dekodiert und Protokolle für jede Sitzung schreibt. Dieses Skript wurde von aufgerufen
incron
und hier ist der entsprechende
incrontab
EintragBeispielausgabe
PS:
Aktuelle Versionen von beiden
sind nicht in der Lage, die oben genannte Ausnahme während der AJAX-Anforderung zu behandeln. Sie zeigen dem Benutzer buchstäblich nichts an, während der Benutzer effektiv abgemeldet wird!
PPS:
anscheinend sind auch Magento CE 1.9.3.x-Versionen betroffen, siehe https://github.com/OpenMage/magento-mirror/blame/magento-1.9/app/code/core/Mage/Core/Model/Session/Abstract/ Varien.php
PPPS:
Als ich sagte "Entferne diesen Code in der Zwischenzeit." Ich wollte den folgenden Block ausschließen
Sie können das auf so viele Arten tun, einschließlich:
$this->useValidateSessionExpire()
return truequelle
<Mage_Rss>
und das Problem behoben (temporäre Korrektur) und das Ticket beim Magento-Support hinterlegt.Eine andere Möglichkeit, dies zu beheben (und die Sitzungsvalidierung zu verbessern)
ColinM @ https://github.com/OpenMage/magento-lts
Quelle: https://github.com/OpenMage/magento-lts/commit/de06e671c09b375605a956e100911396822e276a
Aktualisieren:
Korrektur für
web/session/use_http_x_forwarded_for option
deaktivierte Option ... https://github.com/OpenMage/magento-lts/pull/457/commits/ec8128b4605e82406679c3cd81244ddf3878c379quelle
Wie speichern Sie Sitzungen? (dh in var / session / oder in der DB oder mit anderen Caching-Engines wie Redis oder Memcached)
Stellen Sie sicher, dass Ihre Schreibberechtigungen für die von Ihnen verwendete Version korrekt sind
var/session/
(normalerweise 755 für Verzeichnisse und 644 für Dateien), oder stellen Sie bei Verwendung von Redis oder Memcache sicher, dass die Einstellungen für Verbindung und Zeitüberschreitung für diese Einstellungen geeignet sind .Inchoo hat ein gutes Tutorial für Redis: http://inchoo.net/magento/using-redis-cache-backend-and-session-storage-in-magento/
Wenn Sie Memcache verwenden, lesen Sie diesen Artikel (er bezieht sich auf Version 1.10, sollte sich aber nicht wesentlich unterscheiden): http://www.magestore.com/magento/magento-sessions-disappearing-with-memcache-turned-on.html
Wenn Sie zufällig etwas wie Lack verwenden, gab es in der Vergangenheit Probleme mit Sitzungen, bei denen bestimmte Seiten gelocht werden mussten.
Wenn Sie das Dateisystem für Ihre Sitzungen verwenden, können Sie Abhilfe schaffen, indem Sie einfach den
<session_save>
Knoten in Ihrem wechselnlocal.xml
auf "db" anstelle von "files" setzen.Davon
<session_save><![CDATA[files]]></session_save>
Dazu
<session_save><![CDATA[db]]></session_save>
quelle
Das Detail von Anton Boritskiy ist fantastisch. Aber anstatt diesen Block auszuschließen, können Sie eine lokale Kopie erstellen, damit Sie den Kern nicht bearbeiten und den Block wie folgt umschreiben:
Dies stellt sicher, dass der Vergleich zwischen time () und session_expire_timestamp nur ausgeführt wird, wenn der Schlüssel vorhanden ist, und dass der Schlüssel hinzugefügt wird, wenn eine Sitzung gefunden wird, die keinen Schlüssel hat (dh eine Sitzung vor 1.9.3).
quelle