2012-04-14 2 views
0

so habe ich folgendes Problem. Ich habe eine Sitzungsklasse, die ihre Daten am Ende der Anforderungsausführung in der Datenbank speichern soll. Grundsätzlich, wenn es zerstört wird. Ich verwende Singleton-Muster in diesem Fall. Ich habe eine destructor wie folgt aus:PHP __destruct verursacht net :: ERR_CONNECTION_RESET register_shutdown_function ist nicht. Was ist der Unterschied?

public function __destruct() 
{ 
    $this->_save(); // _save is public 
    // exit('I can reach this point with no error'); 
} 

Aber mit diesem Code bekomme ich net :: ERR_CONNECTION_RESET aus Chrom und anderen Browsern. Wenn ich den destructor Kommentar aus und legen diese in Konstruktor:

register_shutdown_function(array($this, '_save')); 

Die _save Methode keine Ausnahmen Rückkehr wird, wenn ich es direkt aufrufen.

Alles funktioniert gut. Was könnte falsch sein und warum?

Danke!

+0

Nun, Sie müssen die Fehlerprotokollierung aktivieren, um herauszufinden, ob in dieser _save-Funktion tatsächlich ein schwerwiegender Fehler auftritt. Wenn Sie es nicht tun, ist es schwer zu sagen, was den Verbindungs-Reset auslöst. Ich nehme an, es ist ein PHP-Fehler in der Shutdown-Phase. – hakre

Antwort

1

Ok, ich habe die Lösung gefunden. Die Methode _save() hat einige Methoden aufgerufen, die Daten in der Datenbank gespeichert haben. ABER! Die Datenbankinstanz ist ein SINGLETON, also gab es nirgends Referenzen und das Datenbankobjekt war zu diesem Zeitpunkt bereits zerstört. Die Lösung bestand darin, den Verweis auf die Datenbankinstanz irgendwo im Modell zu speichern. Sieht aus, als ob register_shutdown_function funktionierte, weil noch nichts zerstört wurde.

-1

Ihr Fehler hat nichts mit Crome oder anderen Browsern zu tun.

, wenn man sich die PHP-Dokumentation http://php.net/manual/en/language.oop5.decon.php

The destructor method will be called as soon as there are no other references to a particular object, or in any order during the shutdown sequence.

A. Wenn "exit" irgendwo

B. irgendwo FATAL Fehler genannt wird, in dem Code

C. Wenn es ist eine Ausnahme in einem anderen Destruktor geworfen

D. Wenn Sie versuchen, eine Ausnahme in einem DES zu behandeln tructor

$this->_save() ist ein Verfahren, und es könnte Exception die eine oder die andere

Während register_shutdown_functionhttp://php.net/manual/en/function.register-shutdown-function.php

Registers a callback to be executed after script execution finishes or exit is called

Ich gehe davon würde fordern, dass dieses Wetter funktionieren würde das Skript beendet richtig oder nicht

+0

Ich weiß, dass es nichts mit meinem Browser zu tun hat. Ich bekomme nur diese Art von Fehler. Wie gesagt, die _save() Methode gibt keine Exceptions zurück. Die __destruct() sollte keine Probleme haben, da alle erforderlichen Referenzen vorhanden sein sollten. –

+0

Es muss nicht zurückkehren ... hast du es trotzdem umgesetzt ??? Ich arbeite nur mit den begrenzten Informationen, die Sie zur Verfügung gestellt haben. – Baba

+0

_save() -Methode ruft einige Modellmethoden auf, die Informationen in der Datenbank speichern. Diese Methode funktioniert ohne Fehler und Warnungen. Bei manuellem Aufruf funktioniert es. Wenn auch von register_shutdown_function aufgerufen. Ich habe nur Probleme, wenn es von Destruktor aufgerufen wird. –

Verwandte Themen