Frage

Ich habe gerade herausgefunden, dass ich kann eigentlich Speicherobjekte in der $ _SESSION und ich finde es ziemlich cool, weil, wenn ich zu einer anderen Seite springen noch ich mein Objekt haben. Nun, bevor ich diesen Ansatz beginnen Ich möchte herausfinden, ob es so wirklich eine gute Idee ist oder wenn es möglichen Gefahren beteiligt.

Ich weiß, dass, wenn ich einen einzigen Eintrittspunkt hätte, würde ich das nicht tun müssen, aber ich bin da noch nicht so möchte ich nicht einen einzigen Eintrittspunkt haben und ich wirklich mein Objekt zu halten, weil ich verliere nicht meinen Zustand so. (Jetzt habe ich auch gelesen, dass ich staatenlos Websites programmieren sollte, aber ich verstehe nicht, dieses Konzept noch.)

So kurz : Ist es in Ordnung zu speichern Objekte in der Sitzung, gibt es irgendwelche Probleme mit ihm


Edit:

Temporäre Zusammenfassung : Jetzt verstehe ich, dass es wahrscheinlich ist besser neu zu erstellen das Objekt, selbst wenn es sich um die Datenbank erneut abfragt.

Weitere Antworten könnten vielleicht näher auf diesen Aspekt ein bisschen mehr!

War es hilfreich?

Lösung

Ich weiß, das Thema ist altes, aber dieses Problem kommt immer auf und wurde zu meiner Zufriedenheit nicht angesprochen:

Ob Sie Objekte in $ _SESSION speichern oder rekonstruieren sie ganzes Tuch auf Basis von Daten in versteckten Formularfeldern gebunkert oder erneut abfragen sie von der DB jedes Mal, verwenden Sie Zustand. HTTP ist zustandslos (mehr oder weniger, aber gegen PUT GET sehen), aber fast alles, was jemand kümmert sich mit einem Web-App zu tun erfordert Zustand irgendwo gehalten werden. Handeln, als ob der Staat in verwinkelten Mengen zu einer Art theoretischen Gewinn drückt, ist einfach falsch. Zustand ist der Zustand. Wenn Sie Zustand verwenden, verlieren Sie die verschiedenen technischen Vorteile gewonnen durch staatenlos zu sein. Das ist nicht etwas zu verlieren Schlaf über, wenn Sie im Voraus wissen, dass Sie Schlaf über sie sollten zu verlieren.

Ich bin besonders flummoxed durch die Segnung durch den „Doppelschlag“ erhielt Argumente, die weiter von Hank Homosexuell. Ist das OP eine verteilte und Lastenausgleich E-Commerce-System bauen? Meine Vermutung ist, nein; und ich werde weiter postulieren, dass seine $ Benutzerklasse Serialisierung, oder was auch immer, nicht seine Server nicht mehr zu reparieren lähmt. Mein Rat: Verwenden Sie Techniken, die für Ihre Anwendung sinnvoll sind. Objekte in $ _SESSION sind in Ordnung, unterliegen üblichen Vorsichtsmaßnahmen. Wenn Ihre App plötzlich in etwas rivalisierenden Amazon dreht im Verkehr bedient, müssen Sie erneut anpassen. So ist das Leben.

Andere Tipps

es ist in Ordnung, solange durch die Zeit, die session_start () Anruf getätigt wird, hat die Klassendeklaration / Definition bereits von PHP angetroffen wurde oder durch einen bereits installierten Autoloader finden. sonst wäre es nicht in der Lage, das Objekt aus dem Session-Speicher deserialisieren.

HTTP ist ein zustandsloses Protokoll für einen Grund. Sessions verschweißen Zustand auf HTTP. Als Faustregel gilt: vermeiden Sitzungszustand verwendet wird.

UPDATE: Es gibt kein Konzept einer Sitzung am HTTP-Ebene; Server speichern diese durch die Kunden eine eindeutige ID zu geben und den Kunden sagen, es bei jeder Anfrage erneut einreichen. Dann verwendet der Server diese ID als Schlüssel zu einer großen Hash-Tabelle von Session-Objekten. Jedes Mal, wenn der Server eine Anfrage erhält, sieht es die Session Informationen aus der Hash-Tabelle von Sitzungsobjekten bis basierend auf der ID der Client mit dem Antrag. All diese zusätzliche Arbeit ist es, einen Doppelschlag auf Skalierbarkeit (ein großer Grund HTTP staatenlos).

  • Whammy One: Es reduziert die Arbeit ein einzelner Server tun können
  • .
  • Whammy Zwei: Es macht es schwieriger, aus maßstab denn jetzt können Sie nicht nur Strecke eine Anfrage an jeden alten Server - sie alle haben nicht die gleiche Sitzung. Sie können mit einer bestimmten Sitzungs-ID auf dem gleichen Server alle Anforderungen Pin. Das ist nicht einfach, und es ist ein Single Point of Failure (nicht für das System als Ganzes, sondern auch für große Brocken Ihrer Benutzer). Oder könnten Sie die Sitzung Speicher auf alle Servern im Cluster teilen, aber jetzt haben Sie mehr Komplexität. Network-Attached-Speicher, einen Stand-alone-Session-Server, usw.

Da alles, was ist, desto mehr Informationen, die Sie in der Sitzung setzen, die Auswirkungen auf die Leistung, desto größer (wie Vinko weist darauf hin). Auch als Vinko weist darauf hin, wenn das Objekt nicht serialisierbar ist, wird die Sitzung schlecht benehmen. So, als Faustregel, vermeiden mehr als unbedingt notwendig in der Sitzung setzen.

@Vinko Sie können in der Regel arbeiten rund um den Server speichern Zustand, indem der Dateneinbettungs Sie in der Antwort sind Tracking Sie zurückschicken und mit der Client erneut einreichen es, beispielsweise die Daten nach unten in einem versteckten Eingang zu senden. Wenn Sie wirklich müssen serverseitige Tracking von Staat, sollte es wohl in Ihrem Trägerdatenspeicher sein.

(Vinko fügt hinzu: PHP eine Datenbank zum Speichern von Sitzungsinformationen verwenden können, und mit der Client die Daten jedes Mal erneut einreichen könnten mögliche Skalierbarkeit Probleme lösen, sondern eröffnet eine große Dose Sicherheitsfragen Sie die Aufmerksamkeit auf jetzt bezahlen müssen, dass die Kunden in Steuerung aller Ihren Zustand)

  • Objekte, die serialisiert werden können (oder enthalten unserialisierbar Mitglieder) wird nicht kommen aus dem $ _SESSION wie man erwarten würde
  • Sehr große Sitzungen eine Belastung auf dem Server (Serialisierung und Deserialisierung megs Zustand jedes Mal ist teuer)

Anders als das ich keine Probleme gesehen habe.

Nach meiner Erfahrung ist es im Allgemeinen nicht wert für etwas komplizierter als eine StdClass mit einigen Eigenschaften. Die Kosten für das deserialisieren war schon immer mehr als aus einer Datenbank neu zu erstellen Identifier eine sitzungs gespeichert gegeben. Es scheint, cool, aber (wie immer), Profilierung ist der Schlüssel.

würde ich vorschlagen Zustand nicht verwenden, wenn Sie unbedingt brauchen. Wenn Sie das Objekt neu erstellen können, ohne Sitzungen tun es. Zustände in Ihrer Webapplikation zu haben, macht die Anwendung komplexer zu bauen, für jede Anforderung, Sie zu sehen, was Zustand sich der Benutzer befindet Ofcourse gibt es Zeiten, in denen Sie nicht Sitzung (am Beispiel vermeiden können. Benutzer-Login während seiner Sitzung am gehalten werden müssen die Webapplikation). Zuletzt würde ich vorschlagen, Ihr Session-Objekt so klein wie möglich zu halten, da sie Auswirkungen auf serialisiert und unserialize große Objekte Leistung.

Sie werden feststellen, dass Ressourcentypen (zB DB-Verbindungen oder Dateizeiger) erinnern gewohnt haben, um zwischen Seite Lasten bestehen bleiben, und Sie werden unsichtbar diese neu erstellen müssen.

Sehen Sie sich auch die Größe der Sitzung, je nachdem, wie es gespeichert ist, können Sie Größenbeschränkungen haben oder Latenzprobleme.

Ich würde auch bis bringen, wenn die Software-Bibliotheken aktualisieren - wir unsere Software aktualisiert und die alte Version hatte Objekte in Sitzung mit der Klassennamen der V1-Software, die neue Software abstürzt wurde, wenn es versucht, die Objekte zu bauen, die in der Sitzung waren - wie die V2-Software nicht mehr die gleichen Klassen verwendet hat, könnte es sich nicht. Wir hatten in einigen Fixcode setzen Sitzung Objekte zu erkennen, löschen Sie die Sitzung, wenn gefunden, die Seite neu laden. Der größte Schmerz zunächst etwas dagegen, diesen Fehler wurde neu erstellt, wenn es zuerst (allzu vertraut berichtet wurde, „gut, es funktioniert für mich“ :) wie es nur Menschen betroffen, die in dem in der und aus den alten und neuen Systemen vor kurzem - aber gut Job wir haben es vor dem Start finden, da alle unsere Nutzer sicher haben die alten Session-Variablen in ihren Sitzungen hätte und hätte abgestürzt potenziell für alle, eine schreckliche Start gewesen wäre:)

Wie auch immer, wie Sie in Ihrer Änderung vorschlagen, ich denke auch, es ist besser, das Objekt neu zu erstellen. Also vielleicht nur id Speicher und dann auf jede Anforderung das Objekt aus der Datenbank zieht, sind besser / sicherer zu machen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top