Was ist der beste und sicherste Weg, um mit PHP-Sitzungen umzugehen? Ist der beste Weg, um Sitzungen zu speichern in:
Datenbank (zuverlässiger, aber hoher Engpass, langsame Geschwindigkeit, nicht gut für Websites mit hoher Datenbanknutzung)?
Memcache (superschnelle, aber verteilte mehr Sicherheitsprobleme, Chancen auf Datenverlust beim Neustart des Servers und Chancen auf Datenverlust bei vollem Cache)?
Dateien (Standardoption, ich denke langsam, da sie aus Datei-E / A liest und schreibt, weniger Sicherheit usw.).
Welche Methode ist die beste? Was sind die Probleme und guten Dinge jedes dieser Ansätze?
Antworten:
Am besten speichern Sie bei Memcached, da wir die anderen Probleme (Cache-Größe, Sicherheit usw.) problemlos beheben können.
Wie können die anderen Probleme behoben werden?
quelle
Für die überwiegende Mehrheit der täglichen Anwendungen ist es in Ordnung, Sitzungen in Datenbanken zu speichern. Das Volumen und die Parallelität, die ein SQL Server verarbeiten kann, sind mehr als ausreichend. Der Schlüssel besteht darin, jeden Eintrag klein zu halten und die nicht benötigten Zeilen regelmäßig zu löschen. Und natürlich die richtige Indizierung.
Das Dateisystem - das habe ich noch nie gesehen. Ich bevorzuge die einfache Verwaltung von Zeilen in Tabellen anstelle von Tausenden kleiner Dateien. Außerdem können Sie keine Dateien abfragen, wenn Sie sich mit Sitzungsstatistiken befassen möchten.
Denken Sie daran, dass es mit PHP einfach ist, Sitzungshandler auszutauschen. Sie können also mit einem Speicherformat beginnen und ohne großen Aufwand auf ein anderes migrieren.
quelle
Was ist mit der MEMORY-Speicher-Engine in MySQL?
Es ist nicht so schnell wie Memcache, hat jedoch den Vorteil, dass Sie einfaches SQL verwenden können. Sie können auch die normale Speicher-Engine verwenden, wenn sie nicht benötigt wird, und zu MEMORY wechseln, wenn die Anzahl der Benutzer / Anforderungen zunimmt.
Ich verwende es zum Speichern großer Mengen statistischer Daten in einer Web-App, die sich häufig ändert, sodass es nicht für die Bearbeitung von Sitzungen verwendet wird, aber ich denke, es sollte für diesen Zweck gut geeignet sein.
quelle
Dieser Blog-Beitrag zeigt die Ergebnisse eines Leistungsvergleichs verschiedener Sitzungsspeicher-Engines mit Magento und sie scheinen zu dem Schluss gekommen zu sein, dass bis zu 75 gleichzeitige Benutzer keinen wirklichen Leistungsunterschied zwischen ihnen aufweisen.
Ich denke, dass auf diesen Ebenen (sie hatten ungefähr 5 Transaktionen pro Sekunde, was ungefähr 430.000 Treffer über einen Zeitraum von 12 Stunden entspricht) der Overhead in allem anderen die Leistungszahlen dominiert, die Sie sehen, da Datei / DB / Memcache / Redis alle glücklich handhaben werden der Verkehr ohne ins Schwitzen zu geraten, wenn er richtig benutzt wird.
Damit bleiben andere Faktoren wie Skalierbarkeit, Zuverlässigkeit und Sicherheit.
Zunächst möchte ich sagen, dass alles, was Ihren Dateispeicher gefährdet, wahrscheinlich auch alles andere gefährdet, da ein Angreifer dann einfach Ihren Anwendungscode ändern oder zumindest Schlüssel und Speicherzugriffsprotokolle / -anmeldeinformationen erkennen kann, selbst wenn diese schreibgeschützt sind Zugriff. Die Dateispeicherung funktioniert gut für Websites mit geringem Volumen, ist einfach einzurichten und leicht zu begründen. So oft Sie sagen, dass Sie auf die Festplatte zugegriffen haben, trifft ein DB-Lesevorgang auch auf die Festplatte. Wenn die DB sie zwischenspeichern kann, hat Ihr Betriebssystem wahrscheinlich auch die Sitzungsdatei zwischengespeichert. Außerdem wird nur eine Datei gelesen, und Ihr Dateisystem kann hervorragend darauf zugreifen, wenn Sie den Namen bereits kennen. Wenn Sie PHP verwenden, wissen Sie, wie viele Dateilesevorgänge das System ausführen muss, um Ihre Anwendung zu bedienen? Der Nachteil ist, dass Sie können '
Memcache ist relativ schnell und wenn Sie Memcache-Klassenlösungen allgemeiner betrachten (Redis usw.), gibt es einige, die sogar eine Persistenz bei Lesevorgängen im Speicher versprechen, damit Sie das Beste aus beiden Welten herausholen können. Sie sind auch relativ einfach zu überlegen, und der Schlüsselwert von Sitzungen ist genau das, wofür diese entwickelt wurden. Wissen Sie, wie viel Sie in eine Sitzung stecken müssten, um eine davon zu füllen? In jedem Fall zwingen Sie alle Ihre Optionen zu Kompromissen, wenn Sie ihre Kapazität erreichen. Festplatten füllen sich mit Dateien (Anzahl und Größenfaktor hier), Cache-Speicher füllen sich mit Kapazität und Datenbanken haben eine begrenzte Anzahl von Zeilen und die gleichen Festplattenkapazitätsgrenzen wie der Dateiansatz. Außerdem werden diese Systeme nur verteilt, wenn Sie sie verteilt ausführen. Die meisten funktionieren einwandfrei mit einem einzelnen Server-Setup. Wenn Sie sie verteilen, haben Sie wahrscheinlich bereits verteilte Webserver / Datenbankserver usw., sodass Ihre Probleme mit verteilten Systemen bei der Auswahl Ihres Sitzungsspeichers sicherlich nicht auftreten. Wenn Sie jedoch das 10-fache des Datenverkehrs / der Kapazität usw. wünschen, ist es viel natürlicher, dorthin zu gelangen, als mit dem Dateispeicherschema. In einigen Schlüssel- / Wertspeichern können Sie auch relativ einfach einfache Analysen der Sitzungsdaten durchführen, aber die meisten bringen Sie nicht in die Nähe der Möglichkeiten von SQL.
Ich bin mir nicht sicher, warum Sie vorschlagen, dass die Datenbank zuverlässiger ist als die anderen Optionen, aber ich habe den Reiz der Datenbank, da Ihre PHP-Anwendung sie wahrscheinlich bereits verwendet. Dies bedeutet, dass Sie keine weitere Serverabhängigkeit hinzufügen und wahrscheinlich dieselbe Verbindung wiederverwenden können, die Sie zum Abrufen von Sitzungsdaten verwenden, um Benutzerdaten abzurufen, sodass Sie keine für Daten, eine für Memcache usw. einrichten müssen Tabelle gut, es wird auch einigermaßen schnell arbeiten und bietet eine ziemlich einfache Semantik, mit der Sie bereits vertraut sind, um alte Sitzungen zu ernten oder sogar Sitzungsdaten zu analysieren (ich bin mir nicht sicher, warum Sie dies möchten und wenn Sie es auch nicht sind, ist dies wahrscheinlich nicht der Fall). nicht so wichtig). Das Skalieren auf massive Maßstäbe ist nicht so trivial wie bei so etwas wie Redis.
Ich denke, diese Wahl ist am Anfang nicht so wichtig. Jeder Ansatz hat Herausforderungen, Vorteile und Dinge, über die Sie nachdenken müssen. Im Allgemeinen können Sie wahrscheinlich davonkommen, wenn Sie nur die Standardeinstellungen von PHP / das von Ihnen verwendete Framework verwenden oder sogar die einfachste Methode, mit der Sie beginnen können. Wenn sich die Auswahl später als schlecht herausstellt, werden Sie von Ihrer Leistungsanalyse darüber informiert und Sie werden mit den Daten ausgestattet, die Sie benötigen, um die richtigen Entscheidungen zu treffen, je nach der Art des Verkehrs, den Sie erhalten. Alles, was Sie vernünftigerweise haben können, sind allgemeine Spekulationen.
quelle
Es hängt von Ihren Bedürfnissen ab.
Es gibt einige Unterschiede zwischen Dateien und Datenbankspeicher. Siehe diese Frage .
Sie können jedoch standardmäßig das tun, was in Rails 3 getan wird, und nur verschlüsselte Cookies für Ihre Sitzung verwenden. Sie verschlüsseln also alle Werte so, dass nur Sie sie später entschlüsseln können (z. B. private / öffentliche Schlüssel), und lassen den Client den Status für Sie behalten.
Einerseits sind Sie auf 4 KB beschränkt, was normalerweise ausreicht (da Sie normalerweise IDs speichern möchten, nicht ganze Objekte), aber der wirklich schöne Vorteil ist, dass Sie sich keine Gedanken über die Sitzungsbereinigung machen müssen. Sie überlassen das dem Kunden, wo es eigentlich sein sollte.
quelle
Für meine spezielle Situation kann ich Ihnen sagen, dass Sitzungen in einer Datenbank mit Abstand die Hauptursache für unsere Serverprobleme sind. Unsere Sitzungstabelle wird häufig genug beschädigt, sodass wir sie präventiv abschneiden müssen.
Memcache klingt attraktiv, aber wir haben zu viele Prozesse, die den gesamten Memcache löschen, sodass Benutzersitzungen zu häufig unterbrochen werden. und die älteren Sitzungen würden gelöscht, wenn der Speicher voll wäre ... also keine permanenten Anmeldungen mehr.
Wir werden bald die standardmäßigen dateibasierten Sitzungen ausprobieren.
Wenn Sie sich Sorgen um die Sicherheit Ihrer Sitzungsdaten machen, sollten Sie diese Daten nicht in die Sitzung aufnehmen - und der Sitzung nicht vertrauen - und den Benutzer bei jeder Anforderung validieren.
quelle
Sie können versuchen, Ihre Sitzung auf Redis zu speichern . Redis ist schnell wie Memcached, verfügt jedoch auch über mehrere Optionen für die Datenpersistenz. Darüber hinaus werden verschiedene PHP-Clients unterstützt.
Darüber hinaus können Sie Dienste von Drittanbietern wie die Memcached Cloud ausprobieren , die über integrierte Replikations- und Speicher-Engine-Funktionen verfügt
Offenlegung, ich bin Mitbegründer und CTO von Garantia Data.
quelle