Warenkorb Lifetime / Session Timeout

Ich würde meinen Warenkorb gerne so enstellen, dass dieser erst nach 2 Tagen gelöscht wird. Bisher ist das bei mir nach ca. 1 Stunde der Fall. Ich habe das schon versucht über die PHP Session Timeout Variablen zu setzen. Das Session Cookie hat jetzt zwar eine längere Lifetime, der Warenkorb verschwindet aber immer noch nach einer Stunde. Hat mir dazu bitte jemand einen Tipp?

Hallo,

gibt es hierfür schon eine Lösung?

Würde das auch sehr gerne erhöhen.

Danke

Würde mich auch interessieren…

würde mich auch interessieren…

Aus der Symfony Doku, hier und hier:

# config/packages/framework.yaml
framework:
    session:
        # enables the support of sessions in the app
        enabled: true
        # ID of the service used for session storage.
        # NULL means that Symfony uses PHP default session mechanism
        handler_id: null
        # ...
        # lifetime in seconds
        cookie_lifetime: 172800

 

@AlexGalax‍ aber spielt diese Konfig auch mit Shopware zusammen?

wo genau find ich denn diese Datei?

Musst du mal ausprobieren, theoretisch sollte das funktionieren. config/packages/framework.yaml musst du selber anlegen

Ist das Problem mittlerweile gelöst? Das ist schon ein echter Conversion-Killer. Und es kann ja nicht sein, dass eine absolute Basis-Funktionalität nicht vorhanden ist und man 75€ für ein Plugin bezahlen muss, welches diese Funktionalität erstmal herstellt.
Oder man eben Kenntnisse über die Symfony Config braucht und dann noch nicht mal genau weiß, ob es dann wirklich klappt.

Hey,

stehe nun vor dem selben Problem.
Wie immer bei Shopware… Themen werden angefangen und gefühlt nie zu Ende gebracht.
Was ist mit dem Support? Oder hat jemand aus der Community eine Lösung?
Hat die Variante mit der Config geklappt?

@Shopware: Langsam müsst ihr mal aufhören solche Standard-Funktionen immer raus zu lassen nur damit die Leute Geld für Plugins ausgeben. Dieses Vorgehen ist echt unschön. Dokumentiert es wenig anstatt die Leute ständig im Dunkeln stehen zu lassen…

Gibt es nicht ein (kostenpflichtiges) Plugin, dass den Warenkorb in der Datenbank speichert?

Es geht ja (mir) ja nicht nur um den Warenkorb, sondern vor allem auch um die Session-Länge. Gerade bei B2B wollen die Kunden nicht ständig (auch nicht aus Sicherheitsgründen) ausgeloggt werden.

Der Warenkorb ist inzwischen bei SW6 ja (ENDLICH!) auch an den User gebunden und wird nicht bei Logout zerstört.

Auch der von @AlexGalax genannte Vorschlag ist keine Lösung. Denn die Lifetime für einen Warenkorb soll eine andere sein, als die Login-Session, insbesondere im Admin.
Der Warenkorb kann gerne 7 oder 14 Tage gültig sein, während ein Admin-User bitte spätestens nach 6 Stunden ausgeloggt werden soll.

1 „Gefällt mir“

Für Menschen, die dies lösen möchten.

In /config/packages:

Um sicherzustellen, dass Sitzungen aktiv bleiben, wie im folgenden Beispiel für 31 Tage. Erstellen Sie zum Beispiel, falls nicht vorhanden, session.yaml

# config/packages/session.yaml
framework:
    session:
        handler_id: "redis://localhost:6379/6"
        cookie_lifetime: 2678400

Um sicherzustellen, dass Warenkörbe aktiv bleiben. Erstellen Sie beispielsweise z-shopware.yaml

shopware:
    cart:
        expire_days: 31
1 „Gefällt mir“

weisßt du auch wie man das machen muss, wenn man kein redis verwendet?

Ich denke, dass du die Regel dann einfach weglassen kannst:

# config/packages/session.yaml
framework:
    session:
        cookie_lifetime: 2678400
3 „Gefällt mir“

Hallo zusammen,

bei mir besteht das Problem leider noch, auch nach entsprechender Symfony-Konfiguration.
Die Customer-Session wird immer nach mindestens einem Tag „zerstört“ und der Kunde muss sich neu einloggen, obwohl cookie_lifetime und gc_maxlifetime jeweils auf 90 Tage eingestellt sind. Mit gc_probability: 0 habe ich die Session Garbage Collection komplett deaktiviert, was dazu führt, dass sich die Session-Files entsprechend anhäufen, aber die Sessions trotzdem nach maximal einem Tag nicht mehr valide sind.

Folgendermaßen sieht meine Konfiguration aktuell aus:

framework:
  session:
    # Use default file session handler
    handler_id: session.handler.native_file
    save_path: '%kernel.project_dir%/var/sessions'
    # Set session cookie lifetime to 90 days
    cookie_lifetime: 7776000
    # Make sure sessions are garbage collected after 90 days
    gc_maxlifetime: 7776000
    # Disable session garbage collection
    gc_probability: 0
    # Use secure cookie settings
    cookie_secure: 'auto'
    cookie_samesite: lax

Die Konfigurationsdatei liegt im entsprechenden Verzeichnis unter: config/packages/custom.yaml.
Auch die Symfony CLI gibt mir aus, dass die Einstellungen entsprechend gezogen wurden:

1015c2cf5c55:/var/www/html# bin/console debug:config framework session

Current configuration for "framework.session"
=============================================

name: session-
handler_id: session.handler.native_file
cookie_secure: auto
cookie_samesite: lax
storage_factory_id: session.storage.factory.native
enabled: true
save_path: /var/www/html/var/sessions
cookie_lifetime: 7776000
gc_maxlifetime: 7776000
gc_probability: 0
storage_id: session.storage.native
cookie_httponly: true
metadata_update_threshold: 0

Zur Info: Shopware läuft in einer Docker-Umgebung und das Verzeichnis, in dem die Sessions gespeichert werden habe ich entsprechend als persistentes Volume gemountet.

Ich habe bereits versucht von handler_id: session.handler.native_file auf Redis umzustellen, aber das Ergebnis ist leider das gleiche => Session ist nach einem Tag nicht mehr gültig und Kunde muss sich neu einloggen.

Das Session-Cookie ist auch laut Chrome-Entwicklertools entsprechend lange gültig, siehe Screenshot:

Leider ist das Testen verschiedener Konfigurationen auch extrem aufwendig, da ich immer mindestens einen Tag warten muss, um ein Ergebnis zu bekommen.
Bin mit meinem Latein komplett am Ende. Kenne die Symfony-Dokumentation zur Session-Konfiguration mittlerweile in- und auswendig und kann auch sonst im Internet keine weiteren Hinweise oder Konfigurationsmöglichkeiten finden.

Hoffe Ihr könnt mir hier weiterhelfen. Vielen Dank :slight_smile:

1 „Gefällt mir“

Leider musste ich auch feststellen, dass bei uns Kunden ausgeloggt werden, obwohl die Sitzungen scheinbar richtig eingestellt sind. Das Cookie ‚session-‘ hat bei uns eine Gültigkeit von einem Monat, aber trotzdem wird der Kunde ausgeloggt.

Wir verwenden Redis, um die Sitzungen zu speichern, und die Sitzung existiert in Redis auch noch, nachdem der Kunde ausgeloggt wurde. Dennoch gibt es etwas, das dazu führt, dass Shopware / Symfony denkt, die Sitzung sei für den Kunden nicht mehr gültig.

Darüber hinaus scheinen die Sitzungen bei uns auch nicht bereinigt zu werden. In Redis habe ich mittlerweile 453.000 Sitzungsschlüssel.

Ich glaube, ich habe das Problem gefunden. Obwohl wir die Session-Cookies richtig eingerichtet haben, werden wir trotzdem nach einem Tag ausgeloggt. Ich habe herausgefunden, woran das wahrscheinlich liegt.

In der Datenbank oder in Redis kannst du den Inhalt eines Session-Cookies sehen. Die Session ist auch serverseitig noch gültig, aber es gibt auch ein Token im ‚sw-context-token‘, und dieses Token findest du in der Tabelle ‚sales_channel_api_context‘ in der Spalte ‚token‘.

Sobald ein Kunde ausgeloggt ist, während sein Session-Cookie noch vorhanden ist UND die Session in der Datenbank noch nicht abgelaufen ist, ist sein Token jedoch aus ‚sales_channel_api_context‘ entfernt worden.

Dann habe ich Tests durchgeführt, indem ich mich selbst eingeloggt, mein Token in der Tabelle gesucht und dieses gelöscht habe. Sobald es gelöscht wurde, war ich danach direkt auf der Website ausgeloggt. Kurz gesagt, dieses Token ist notwendig, um eingeloggt zu bleiben.

In der ‚payload‘-Spalte findest du auch den JSON-Schlüssel ‚expired‘. Und ich habe nachgeschaut, wann dieser auf ‚true‘ gesetzt wird.

Das passiert hier:

Dort findest du die Funktion ‚lifetimeInterval‘, und diese ist auf ‚P1D‘ eingestellt, was für ‚Period 1 Day‘ steht, falls dies nicht in einer .yaml-Datei konfiguriert ist. Kurz gesagt, der Kontext-Token verfällt genau 1 Tag nach dem ‚updated_at‘-Datum. Also, egal was wir einstellen und was wir auch versuchen, der Kunde wird ausgelogt, sobald er länger als 1 Tag die Seite nicht besucht hat.

Wenn es stimmt, musst du eine .yaml-Konfiguration mit folgendem Inhalt erstellen:

shopware:
  api:
    store:
      context_lifetime: P30D

Dabei sollte diese Periode der ‚cookie_lifetime‘ entsprechen. Ich werde dies testen.

1 „Gefällt mir“

Hi @tim2,

vielen Dank für die Analyse! Ich werde das die Tage mal testen und eine Rückmeldung geben :slight_smile:

1 „Gefällt mir“

Ich kann bestätigen, dass die Customer Sessions mit oben genannter Konfiguration (in Kombination mit der Konfiguration der Session Cookie Lifetime) länger als einen Tag aktiv bleiben.
Aktuell läuft die Customer Session ca. 3 Tage ohne erneutem Login.

Dies sollte m.E. in die Shopware-Dokumentation mit aufgenommen werden.

1 „Gefällt mir“