2017-11-12 2 views
1

Ich habe eine Menge Informationen über Sitzung Serialisierung von PHP 5.4 und niedriger, aber nicht viel für PHP 7. Vor ein paar Jahren wurde mir geraten, $_SESSION['var'] = serialize($object); beim Speichern einer Klassenvariablen (class object { public $value; function __construct() { $this->value = new object2(); }}) zu verwenden.PHP Session Serialize Objekt

Heute habe ich meinen Code von einer Entwicklungsumgebung auf eine andere umgestellt. Das neue scheint nicht zu gefallen = serialize($object); aber scheint mit = $object in Ordnung zu sein.

Vor ein paar Wochen stieß ich auf ein paar Posts, die erwähnten, dass PHP Variablen immer serialisiert, bevor sie in Sitzungen eingefügt werden, und seit diesem Ereignis (während der heutigen Suche) habe ich viele dieser gleichen Posts gefunden.

In der Dokumentation von PHP stieß ich auf eine Erwähnung von session_register(), die anscheinend verwendet werden sollte, um Objekte in Sitzungsvariablen zu speichern ... aber es wurde anscheinend in 5.3 unterbrochen.

Frühere Tests haben mich gelehrt, dass die Zuweisung von Sitzungsvariablen mit Klassenvariablen, ohne sie zuerst zu serialisieren, Klassenvariablen nicht gut zu verfolgen scheint, insbesondere in Situationen wie oben, wo eine Variable eine andere Klassenvariable (Objekt2) ist.

Die Probleme, die ich hatte, schienen Hit-and-Miss, und war in der Tat der Grund, warum ich nach einer Antwort suchte und Serialisierung fand, und sobald ich serialize/unserialize hinzufügte (und keine anderen Änderungen), hat alles funktioniert wie beabsichtigt.

Also, hier ist meine Frage: Was ist die "echte" Art, Objekt Serialisierung für PHP-Sitzungen zu behandeln?

$_SESSION['var'] = serialize($object); verursacht 500 Fehler. $_SESSION['var'] = $object hat keinen Fehler, aber aufgrund früherer Probleme bin ich nicht sicher, wie gut es funktioniert.

Während des Themas, was ist der beste Ansatz für das Deserialisieren? $object = unserialize($_SESSION['var']); ist mein derzeitiger Ansatz. Es führt nicht zu einem Fehler, sondern kann im Interesse möglicher geringfügiger Optimierung und zukünftigem Wissen die Basis ebenfalls abdecken.

Wenn mein Ansatz (mit serialize() und unserialize()) korrekt ist, welche Einstellung (en) würde dazu führen, serialize() zum Scheitern verurteilt?

Wenn es irgendwelche Tippfehler in irgendeinem 'Code'-Stück hier gibt, schrieb ich sie inline in der Post, also ignoriere sie.

Antwort

1

Sie können Objekte in Sitzungen wie jeden anderen Wert speichern. Am Ende des Skripts bekam die Sitzung serialized and saved trotzdem:

Wenn PHP herunterfährt, wird es automatisch den Inhalt des $_SESSION superglobalen nehmen, serialisiert werden, und es für die Lagerung mit der Session Save Handler senden.

Das „main“ Problem ist, dass die Sitzung erneut die Klassendefinition für das Objekt zum Laden Sie zu laden versuchen, verfügbar sein muss/geladen vor den session_start(); Anruf mit. Ansonsten sollte alles gut funktionieren.

Für Ihre 500-Server-Fehler, müssen Sie die Fehlermeldung und/oder Fehlerprotokoll, was das Problem ist.

+0

Der Fehler 500 wurde tatsächlich versucht, eine PDO-Instanz zu serialisieren, so dass der Teil ...aber das Verhalten, das ich mit den vorherigen Sitzungen in Verbindung brachte, zeigte an, dass die Klassenvariablen nicht richtig gespeichert wurden. Obwohl $ _SESSION am Ende des Skripts serialisiert werden kann, liegt möglicherweise ein Problem vor, wenn eine Klassenvariable (speziell) nicht in $ _SESSION -prior- gespeichert wird. Ich bin mir nicht sicher, ich weiß nur, dass das Verhalten "vergesslich" und etwas unberechenbar war, bis ich vor dem Speichern in Sitzung serialisierte. –