Ich habe gerade herausgefunden, dass ich tatsächlich Objekte in der $ _SESSION speichern kann und finde es ziemlich cool, weil ich immer noch mein Objekt habe, wenn ich zu einer anderen Seite springe. Bevor ich diesen Ansatz verwende, möchte ich herausfinden, ob dies wirklich eine so gute Idee ist oder ob potenzielle Fallstricke bestehen .
Ich weiß, wenn ich einen einzigen Einstiegspunkt hätte, müsste ich das nicht tun, aber ich bin noch nicht da, also habe ich keinen einzigen Einstiegspunkt und würde mein Objekt wirklich gerne behalten, weil ich es nicht tue. Ich verliere meinen Zustand nicht so. (Jetzt habe ich auch gelesen, dass ich zustandslose Websites programmieren sollte, aber ich verstehe dieses Konzept noch nicht.)
Also kurz gesagt : Ist es in Ordnung , zum Speichern von Objekten in der Sitzung, gibt es irgendwelche Probleme mit ihm?
Bearbeiten:
Temporäre Zusammenfassung : Mittlerweile ist es wahrscheinlich besser, das Objekt neu zu erstellen, auch wenn die Datenbank erneut abgefragt wird.
Weitere Antworten könnten diesen Aspekt vielleicht etwas näher erläutern !
Antworten:
Ich weiß, dass dieses Thema alt ist, aber dieses Problem taucht immer wieder auf und wurde nicht zu meiner Zufriedenheit angesprochen:
Unabhängig davon, ob Sie Objekte in $ _SESSION speichern oder sie anhand von Daten, die in ausgeblendeten Formularfeldern gespeichert sind, als Ganzes rekonstruieren oder jedes Mal aus der Datenbank abfragen, verwenden Sie state. HTTP ist zustandslos (mehr oder weniger; siehe jedoch GET vs. PUT), aber fast alles, was jemand mit einer Web-App tun möchte, erfordert, dass der Status irgendwo beibehalten wird. Es ist einfach falsch, so zu tun, als würde man den Staat in Ecken und Kanten drängen. Staat ist Staat. Wenn Sie state verwenden, verlieren Sie die verschiedenen technischen Vorteile, die sich aus der Statuslosigkeit ergeben. Dies ist nichts, worüber Sie den Schlaf verlieren können, es sei denn, Sie wissen im Voraus, dass Sie den Schlaf verlieren sollten.
Ich bin besonders verblüfft über den Segen, den die von Hank Gay vorgebrachten "Double Whammy" -Argumente erhalten haben. Baut das OP ein verteiltes und lastausgeglichenes E-Commerce-System auf? Meine Vermutung ist nein; und ich werde weiter davon ausgehen, dass die Serialisierung seiner $ User-Klasse oder was auch immer seinen Server nicht irreparabel lähmen wird. Mein Rat: Verwenden Sie Techniken, die für Ihre Anwendung sinnvoll sind. Objekte in $ _SESSION sind in Ordnung, vorbehaltlich der Vorsichtsmaßnahmen des gesunden Menschenverstandes. Wenn sich Ihre App plötzlich in etwas verwandelt, das mit Amazon im Datenverkehr konkurriert, müssen Sie sich neu anpassen. So ist das Leben.
quelle
Es ist in Ordnung, solange zum Zeitpunkt des Aufrufs von session_start () die Klassendeklaration / -definition bereits von PHP gefunden wurde oder von einem bereits installierten Autoloader gefunden werden kann. Andernfalls kann das Objekt nicht aus dem Sitzungsspeicher deserialisiert werden.
quelle
__autoload()
Funktion haben.HTTP ist aus einem bestimmten Grund ein zustandsloses Protokoll. Sitzungen schweißen den Status auf HTTP. Vermeiden Sie als Faustregel die Verwendung des Sitzungsstatus.
UPDATE: Es gibt kein Konzept für eine Sitzung auf HTTP-Ebene. Server stellen dies bereit, indem sie dem Client eine eindeutige ID geben und ihn anweisen, diese bei jeder Anforderung erneut zu senden. Dann verwendet der Server diese ID als Schlüssel für eine große Hashtabelle von Sitzungsobjekten. Immer wenn der Server eine Anfrage erhält, sucht er die Sitzungsinformationen aus seiner Hashtabelle der Sitzungsobjekte basierend auf der ID, die der Client mit der Anfrage gesendet hat. All diese zusätzliche Arbeit ist ein Doppelschlag in Bezug auf die Skalierbarkeit (ein wichtiger Grund, warum HTTP zustandslos ist).
Vor diesem Hintergrund ist der Einfluss auf die Leistung umso größer, je mehr Informationen Sie in die Sitzung einfügen (wie Vinko betont). Wie Vinko betont, verhält sich die Sitzung schlecht, wenn Ihr Objekt nicht serialisierbar ist. Vermeiden Sie daher als Faustregel, mehr als unbedingt erforderlich in die Sitzung aufzunehmen.
@Vinko Normalerweise können Sie den Serverspeicherstatus umgehen, indem Sie die Daten, die Sie verfolgen, in die zurückgesendete Antwort einbetten und vom Client erneut senden lassen, z. B. indem Sie die Daten in einer versteckten Eingabe senden. Wenn Sie wirklich eine serverseitige Statusverfolgung benötigen, sollte sich diese wahrscheinlich in Ihrem Sicherungsdatenspeicher befinden.
(Vinko fügt hinzu: PHP kann eine Datenbank zum Speichern von Sitzungsinformationen verwenden. Wenn der Client die Daten jedes Mal erneut übermittelt, können potenzielle Skalierbarkeitsprobleme behoben werden. Es wird jedoch eine große Anzahl von Sicherheitsproblemen geöffnet, auf die Sie jetzt achten müssen, da der Client die Kontrolle über alle hat Ihr Staat)
quelle
O(1)
dir etwas? @whammy zwei: Leiten Sie nicht alle Anfragen zufällig an zufällige Server weiter? Führen Sie Round Robin durch und leiten Sie das Routing von demselben Benutzer an denselben Server weiter. Das ist wow, super offensichtlich. Sie müssen Ihre Bücher zusammen mit allen über 30 Upvotes nochAnsonsten habe ich keine Probleme gesehen.
quelle
Nach meiner Erfahrung lohnt es sich im Allgemeinen nicht für etwas Komplizierteres als eine StdClass mit einigen Eigenschaften. Die Kosten für die Unserialisierung waren immer höher als die Neuerstellung aus einer Datenbank mit einer in einer Sitzung gespeicherten Kennung. Es scheint cool zu sein, aber (wie immer) ist die Profilerstellung der Schlüssel.
quelle
Ich würde vorschlagen, nicht state zu verwenden, es sei denn, Sie brauchen es unbedingt. Wenn Sie das Objekt ohne Sitzungen neu erstellen können, tun Sie dies. Wenn Sie Status in Ihrer Webanwendung haben, wird die Erstellung der Anwendung komplexer. Bei jeder Anforderung müssen Sie sehen, in welchem Status sich der Benutzer befindet. Natürlich gibt es Zeiten, in denen Sie die Verwendung der Sitzung nicht vermeiden können (Beispiel: Der Benutzer muss während seiner Sitzung angemeldet bleiben die Webanwendung). Zuletzt würde ich vorschlagen, Ihr Sitzungsobjekt so klein wie möglich zu halten, da dies die Leistung beim Serialisieren und Unserialisieren großer Objekte beeinträchtigt.
quelle
Sie müssen sich daran erinnern, dass Ressourcentypen (wie Datenbankverbindungen oder Dateizeiger) zwischen dem Laden von Seiten nicht bestehen bleiben, und Sie müssen diese unsichtbar neu erstellen.
Berücksichtigen Sie auch die Größe der Sitzung, je nachdem, wie sie gespeichert ist. Möglicherweise treten Größenbeschränkungen oder Latenzprobleme auf.
quelle
Ich würde auch beim Aktualisieren von Softwarebibliotheken darauf hinweisen - wir haben unsere Software aktualisiert und die alte Version hatte Objekte in Sitzung mit den Klassennamen der V1-Software. Die neue Software stürzte ab, als sie versuchte, die Objekte in der Sitzung zu erstellen - als V2 Software verwendete nicht mehr dieselben Klassen, sie konnte sie nicht finden. Wir mussten einen Fixcode eingeben, um Sitzungsobjekte zu erkennen, die Sitzung zu löschen, falls gefunden, und die Seite neu zu laden. Der größte Schmerz anfangs war, dass Sie diesen Fehler neu erstellt haben, als er zum ersten Mal gemeldet wurde (allzu vertraut, "nun, es funktioniert für mich" :), da er nur Leute betraf, die in letzter Zeit in die alten und neuen Systeme ein- und ausgingen - jedoch gut Job, den wir vor dem Start gefunden haben, da alle unsere Benutzer sicherlich die alten Sitzungsvariablen in ihren Sitzungen gehabt hätten und möglicherweise für alle abgestürzt wären.
Wie Sie in Ihrem Änderungsantrag vorschlagen, ist es meines Erachtens auch besser, das Objekt neu zu erstellen. Vielleicht ist es besser / sicherer, nur die ID zu speichern und dann bei jeder Anforderung das Objekt aus der Datenbank zu ziehen.
quelle