|
|
|
|
Ich hab ein PHP Script, in dem irgendwo ein Bug ist, den ich nicht finde. Da in PHP Remote debugging sehr mühsam oder gar nicht möglich ist, mach ich das halt so, in dem ich an bestimmten Stellen irgendwelche Variabeln dumpe, um zu sehen, was dort genau passiert.
Nun habe ich bemerkt, dass bei einer Klasse, von der eigentlich nur eine Instanz vorhanden sein sollte, am Ende des Scripts der Destruktor zweimal aufgerufen wird, der Konstruktor allerdings nur einmal.
Das lässt darauf schliessen, dass irgendwann im Script eine Kopie dieser Instanz erstellt wird. Allerdings kriege ich nicht raus wo! Ein "clone" wird im gesammten Script nirgends benutzt. Die __clone() Methode wird auch nie aufgerufen.
Wie krieg ich raus, wo im Script diese ungewollte Kopie erstellt wird?
|
|
|
|
|
|
|
ausm bauch raus, würd ich das script von oben nach unten immer wieder beenden und schaun ob zu diesem Zeitpunkt schon 2 oder nur ein destruktor aufgerufen wird.
somit sollte sich eigentlich rausfinden lassen, an welcher stelle die kopie erstellt wird.
|
|
|
|
|
|
|
Erstell mal die gewollte instanz der klasse nicht. (also die zeile auskommentieren, und schau, wo der fehler auftritt, also wo er die instanz duplizieren will.
Nur so eine Idee...
|
|
|
|
|
|
|
Gute Idee! Gleich mal probieren.
€: Beide Ideen
|
[Dieser Beitrag wurde 1 mal editiert; zum letzten Mal von Meister Zopf am 25.01.2007 11:12]
|
|
|
|
|
|
Cool, nun hab ichs irgendwie hingekriegt, dass der Destruktor dreimal aufgerufen wird. Ich denke es hat irgendwie mit einer Session Variabel zu tun.
Ich poste mal den Code der, wie ich meine, dafür verantwortlich ist:
|
PHP: |
<?php
class LBX_Search
{
private $SearchRequest;
public function __construct()
{
$SearchRequest = Session::getVar('LBX_SearchRequest');
if ($SearchRequest) {
$this->SearchRequest = unserialize($SearchRequest);
$this->SearchRequest->dump();
} else {
$this->SearchRequest = new LBX_SearchRequest;
}
}
public function __destruct()
{
$serializedSearchRequest = serialize($this->SearchRequest);
Session::setVar('LBX_SearchRequest', $serializedSearchRequest);
}
?>
|
|
Wenn ich gleich zu Beginn des Konstruktors exit() aufruf, dann kommt der Destruktor einmal. Wenn ich exit() am Schluss des Konstruktor aufrufem dann wird der Konstruktor mehrmals aufgerufen.
Die Klasse LBX_SearchRequest hat aber ihrerseite keine Instanz von LBX_Search. :|
|
[Dieser Beitrag wurde 1 mal editiert; zum letzten Mal von Meister Zopf am 25.01.2007 11:24]
|
|
|
|
|
|
Also ich habs gefunden.
LBX_SearchRequest hat seinerseits Properties, welche auch wieder Properties haben, die nicht alle serialisiert werden sollen. Hab den Fehler nun beheben können, indem ich per __sleep() Methode die Properties bestimme, welche auch wirklich serialisiert werden sollen.
Danke für die Inputs
|
|
|
|
|
|
|
irgendwie ... Singleton ?
|
|
|
|
|
|
|
genau das habe ich mir auch gedacht
|
|
|
|
|
|
|
| Zitat von White[AoT]
genau das habe ich mir auch gedacht
| | Watt? Wer bist du denn?
|
|
|
|
|
|
|
Ich finde Singletons immer falsch
|
|
|
|
|
|
|
Singleton bringt herzlich wenig, wenn beim serialisieren dann eine Kopie davon angelegt wird, ne?
€: | Zitat von [DK]Peacemaker
Ich finde Singletons immer falsch
| |
Warum das denn?
|
[Dieser Beitrag wurde 1 mal editiert; zum letzten Mal von Meister Zopf am 25.01.2007 18:42]
|
|
|
|
|
|
Es geht immer irgendwie anders
|
|
|
|
|
|
|
Was ist das denn für eine sinnlose Aussage?
|
|
|
|
|
|
|
der hat MS, hör nich auf den!
ist Session was von dir oder hat php sone Schnittstelle?
|
|
|
|
|
|
|
Session ist was von mir. Session::setVar($var, $value) macht aber nix anderes als $_SESSION[$var] = $value;
Aber wie ich schon geschrieben habe, die Ursache für das Problem hab ich gefunden und behoben.
|
|
|
|
|
|
Thema: Fehlersuche in PHP |