Wer ruft __wakeup() auf?

08/04/2015 - 13:01 von Stefan+Usenet | Report spam
Ich habe in einer Applikation vor zwei Tagen alle __sleep() und __wakeup
Methoden eliminiert und durch Serializable, serialize() und unserialize()
ersetzt (um besser mit verschachtelten Klassen umgehen zu können).

In der Basisklasse, von der alle Objekte abgeleitet sind, werden die
magischen Methoden per Default abgeschaltet, so auch:

| public function __sleep() {
| throw new Exception(sprintf('Serializing class "%s" is not allowed.', get_class($this)));
| }
|
| public function __wakeup() {
| throw new Exception(sprintf('Deserializing class "%s" is not allowed.', get_class($this)));
| }

Seitdem der Umstellung bekomme ich sporadisch Exceptions, die durch einen
Aufruf von __wakeup() ausgelöst werden. Dummerweise sind das immer andere
User, immer andere Seiten, die Vorfàlle sind nicht reproduzierbar, und ein
Backtrace führt mich direkt zu session_start().

Wie bzw. wodurch kann __wakeup() für eine Klasse, die \Serializable
implementiert, überhaupt noch aufgerufen werden? Das Manual schreibt
lapidar: "Classes that implement this interface no longer support __sleep()
and __wakeup()". Ist's am Ende gar nicht wahr?

Servus,
Stefan

http://kontaktinser.at/ - die kostenlose Kontaktboerse fuer Oesterreich
Offizieller Erstbesucher(TM) von mmeike

Stefan - der pampischste Erfolg des Jahres.
(Sloganizer)
 

Lesen sie die antworten

#1 Christoph M. Becker
08/04/2015 - 13:21 | Warnen spam
Stefan Froehlich schrieb:

Ich habe in einer Applikation vor zwei Tagen alle __sleep() und __wakeup
Methoden eliminiert und durch Serializable, serialize() und unserialize()
ersetzt (um besser mit verschachtelten Klassen umgehen zu können).

In der Basisklasse, von der alle Objekte abgeleitet sind, werden die
magischen Methoden per Default abgeschaltet, so auch:

| public function __sleep() {
| throw new Exception(sprintf('Serializing class "%s" is not allowed.', get_class($this)));
| }
|
| public function __wakeup() {
| throw new Exception(sprintf('Deserializing class "%s" is not allowed.', get_class($this)));
| }

Seitdem der Umstellung bekomme ich sporadisch Exceptions, die durch einen
Aufruf von __wakeup() ausgelöst werden. Dummerweise sind das immer andere
User, immer andere Seiten, die Vorfàlle sind nicht reproduzierbar, und ein
Backtrace führt mich direkt zu session_start().



Ich denke, dass ist der entscheidende Hinweis. Offensichtlich sind
Objektexemplare in der Session gespeichert, und die wollen
deserialisiert werden.

Wie bzw. wodurch kann __wakeup() für eine Klasse, die \Serializable
implementiert, überhaupt noch aufgerufen werden? Das Manual schreibt
lapidar: "Classes that implement this interface no longer support __sleep()
and __wakeup()". Ist's am Ende gar nicht wahr?



Es ist zumindest nicht unbedingt wahr. Entscheidend ist vermutlich, wie
bereits serialisierte Objekte serialisiert wurden. Entweder mit der
alten Variante, dann haben sie die Marke "o", oder mit der modernen,
dann haben sie die Marke "C". Wird nun versucht ein "o" Objekt zu
deserialisieren, dann wird wohl auch __wakeup() aufgerufen (wàre
jedenfalls naheliegend).

Christoph M. Becker

Ähnliche fragen