2009-07-19 3 views
2

Im Allgemeinen habe ich folgendes Szenario:Gibt es eine Möglichkeit, einige Sitzungsdaten aus ALLEN Sitzungen zu löschen?

  • von Datenbankprodukt und die dazugehörigen Daten Fetch
  • Convert abgerufenen Daten zu php 'Produkt' Objekt
  • Objekt-Cache Produkt in der Sitzung

Der Cache ist schreibgeschützt, dh Kunden, die Produkte auf der Website anzeigen.

Aber es gibt Anrufe wie getProductIdsByCategory($categoryId) und die productIds aus diesen Ergebnissen werden auch zwischengespeichert, pro Benutzer, nicht mit dem globalen Cache, den ich gelesen habe.

Ein Problem ist, dass, wenn jemand auf der Admin-Seite ein neues Produkt hinzufügt und es einer Kategorie zuordnet, Kunden die neue productId nicht in ihrem zwischengespeicherten getProductIdsByCategory haben, bis eine neue Sitzung gestartet wird.

Gibt es eine Möglichkeit, z. B. $_SESSION['x'] von ALLEN Sitzungen auf dem Server zu löschen, wenn ein neues Produkt hinzugefügt wird? Ich möchte nicht alle Sitzungen zerstören, da Kunden dann ihre Logins usw. verlieren.

Oder sollte ich diese zwischengespeicherten productId Suchen in den globalen Cache verschieben?

p.s verwende einen benutzerdefinierten Cache, nicht Memcached oder ähnliches.

Dank

Antwort

5

Standardmäßig sind die Sitzungsdaten nur serialisierte Dateien irgendwo in Ihrem Dateisystem, und es ist möglich, alle zu modifizieren, um die fraglichen Informationen zu entfernen (so dass Sie keine gerade geöffneten Sitzungen betreten)).

Ich empfehle es nicht wirklich, obwohl.Was ich empfehlen würde, ist eine Methode der Signalisierung, dass diese zwischengespeicherten Daten aktualisiert werden sollten, wie ein in der Datenbank gespeicherter Zeitstempel, der untersucht wird, wenn session_start() passiert, und wenn die zwischengespeicherten Daten älter als der Zeitstempel sind, wird der Cache geleert.

+0

Das klingt nach einer wirklich guten Idee. Obwohl ich denke, dass ich diese Flagge nach z. B. einer halben Stunde oder so löschen müsste? –

+0

Ich verstehe nicht warum. Es kann einfach weiter in die Vergangenheit gehen, und Sitzungen, die ihre zwischengespeicherten Daten in jüngerer Zeit erhalten haben, werden davon nicht gestört. – chaos

+0

Sie haben Recht, ich werde es versuchen. Danke –

3

Sounds sein, wie Sie mit echten gemeinsamen Zustand durch ein Caching-System wie memcache tun könnte. Die einzige andere Möglichkeit, die in den Sinn kommt, ist, dass die Anwendung nach Flags für unsaubere Cachedaten sucht und sie selbst löscht, oder wenn Ihr Cache in einer Datenbank in einem serialisierten Parsable-Format liegt, schreiben Sie ein teures Skript, um sie zu lesen Alles, aber das wird unangenehme Verzögerungen mit Anfragen verursachen, die die Daten bereits gelesen haben.

Ich würde mit echten gemeinsamen Zustand gehen, als für Objektkopien zu überprüfen.

+0

Ist Memcached eine gute "moderne" Art, Dinge zu tun? Ich weiß nicht viel darüber. –

+1

@ David, ja. Jeder gleichzeitig zugängliche freigegebene Zustand funktioniert. Einige ORM-Systeme ermöglichen dies. Denken Sie daran, dass es eine Lücke im Clearing mit jedem System geben wird, da PHP den gemeinsamen Status in die Anwendung kopiert. Sie müssen das erneute Speichern stoppen, wenn der Cache schmutzig ist ... oder ähnliche Einschränkungen für Ihre Bedürfnisse. Es ist der Import, den Sie einschränken müssen. –

-2

einen Sitzungswert Verwendung löschen:

unset($_SESSION['x']); 

Sie für diese kann

+0

Dadurch wird nur die Sitzung für den aktuellen Benutzer gelöscht. Ich muss alle $ _SESSION ['x'] von allen Benutzern löschen, wenn ein Admin-Benutzer ein neues Produkt hinzufügt –

1
auf Sitzungen Schleife

Wenn Sie Sitzungen in einer Datenbank speichern, wird schwierig sein, jede spezifische Bit Daten zu löschen.

Ich würde vorschlagen, in Dateien anstelle von Benutzersitzungen zwischenzuspeichern. Auf diese Weise erhalten Sie die gleichen Vorteile, aber Sie haben die totale Kontrolle darüber, was gecached wird und wann es gelöscht wird.

0

Ja, Sie sollten es in einen globalen Cache verschieben. Sitzungen sollen nicht global zugänglich sein, ich denke kaum, dass es möglich ist.

1

Um alle vorhandenen Sitzungen für eine bestimmte Anwendung zu deaktivieren, ändern Sie einfach Ihre Anwendung, um den Namen der Sitzung mit PHP session_name('new_session_name') zu ändern. Diese Funktion muss vor jedem Aufruf von session_start() aufgerufen werden.

Dies wird nicht tatsächlich löschen die aktuellen Sitzungen, aber es macht sie nicht mehr nützlich für diese Anwendung.