PHP: destructor vs register_shutdown_function
Ich habe eine PHP-Klasse, erstellt ein PNG-Bild on-the-fly und sendet Sie zum browser. PHP-Handbuch sagt, dass ich brauche, um sicherzustellen, dass imagedestroy - Funktion aufgerufen wird, am Ende, um den Speicher freizugeben. Nun, wenn ich nicht mit einer Klasse, hätte ich einige code wie folgt:
function shutdown_func()
{
global $img;
if ($img)
imagedestroy($img);
}
register_shutdown_function("shutdown_func");
Ich glaube jedoch, dass geeignete Ort für meine Klasse sein würde, um einen Anruf zu tätigen, um imagedestroy - in-class' - Destruktor.
Ich nicht herausfinden, wenn Destruktoren aufgerufen werden, die gleiche Weise shutdown-Funktionen hat? Zum Beispiel, wenn die Ausführung Stoppt, wenn der Benutzer drückt die STOPP-Taste im browser.
Hinweis: was auch immer Sie schreiben in Ihrer Antwort, bitte zeigen Sie auf einige Artikel oder manual-Seite (URL), die Sie unterstützt.
- Ich würde schätzen, wenn Sie nicht Bearbeiten, meine Antworten zu löschen Abschnitten finden Sie "irrelevant", das ist respektlos. Bezüglich der garbage collection-es war relevant, sondern sich anzupassen.
- Der andere Teil deiner Antwort war relevant und auf den Punkt, ich selbst gewählt es. Könnten Sie bitte setzen Sie ihn wieder?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich gerade getestet mit Apache, PHP als Apache-Modul. Ich habe eine endlos-Schleife wie diese:
Hier ist, was ich herausgefunden habe:
Jedoch, dies zu tun:
shutdown_func aufgerufen wird. Das heißt also, dass Klasse destuctor ist nicht so gut, als shutdown-Funktionen.
Stop
im Firefox (client-Seite) nicht, hält die Ausführung des scripts (Server-Seite) ist so verdammt mir klar, dass ich sein muss, fehlt einem gewissen Punkt. Sie wäre nicht möglich, davon ausgehen, dass dies funktionieren könnte, die Art und Weise, richtig? Das gleiche wie Herunterfahren Apache (alles zu töten) und erreichenmax_execution_time
(kritischen Zustand, alles zu töten). Wie in Gottes Namen konnte Sie erwarten, dass in jeder dieser Situationen wird PHP in der Lage sein, Ihren Anruf Destruktor? Wenn es komplett und vollständig getötet, auf einmal unter diesen Umständen. Ich muss etwas fehlt in deiner Antwort!Basiert auf dem Prinzip, dass Sie sollten beenden, was Sie begonnen, ich würde sagen, der Destruktor ist der richtige Ort für die freie nennen.
Den Destruktor wird aufgerufen, wenn das Objekt entsorgt wird, in der Erwägung, dass eine shutdown-Funktion wird nicht aufgerufen, bis die Skript-Ausführung beendet. Wie bereits von Wolfie, diese wird nicht unbedingt passieren, wenn Sie gewaltsam stoppen Sie den server oder das Skript, aber zu dieser Zeit, den Speicher von PHP befreit wird, sowieso.
Bemerkte auch von Wolfie, PHP, frei, Skript-Ressourcen, wenn das Skript geschlossen wird, so dass, wenn Sie nur das instanzieren eines dieser Objekte, dann würden Sie wahrscheinlich nicht bemerken einen großen Unterschied. Jedoch, wenn Sie später am Ende nicht instanziieren diese Dinge nicht oder nicht in einer Schleife, dann haben Sie wahrscheinlich nicht wollen, haben zu sorgen über einen plötzlichen Anstieg in der Speichernutzung, so dass für die künftigen Vernunft, kehre ich zu meiner ursprünglichen Empfehlung, legen Sie es in den Destruktor.
Kurzem hatte ich Probleme mit diesem, wie ich versuchte, den Griff Zerstörung insbesondere für den Fall, wo die server Erfahrungen ein timeout und ich wollte Klasse, die Daten im error-log. Ich würde eine Fehlermeldung beim Verweis auf &$this (obwohl ich gesehen habe es getan, ein paar Beispiele, die möglicherweise eine version, Ausgabe oder eine symfony-Seite-Effekt), und die Lösung, die ich kam, war ziemlich sauber:
Hoffe, das jemand hilft!
Ich denke, eine ganz große Sache, die Sie verpasst haben ist, dass Sie alle Speicher-PHP zugewiesen hat während der Skript-Ausführung wird freigegeben, sobald das Skript beendet wird. Auch wenn der Benutzer drückt auf die stop-Taste, PHP Prozesse das Drehbuch, bis es fertig ist, gibt Sie zurück an den HTTP-daemon, um bedient zu werden, um die Besucher (oder nicht, je nachdem wie clever der daemon).
So, explizit freigeben von Arbeitsspeicher am Ende des Skripts die Ausführung ist ein wenig überflüssig. Einige argumentieren, dass es eine gute Sache wäre zu tun, aber es ist immer noch redundant.
Aber zum Thema-Klasse-Zerstörer, Sie sind immer aufgerufen, wenn das Objekt zerstört wird, entweder explizit durch
unset()
oder auf Skript-Beendigung/Kündigung.Die Empfehlung der Entwickler explizit die Freigabe der verwendete Speicher in der Bildbearbeitung ist sicher nur, um ganz sicher nicht, um einen Speicherverlust, wie bitmaps werden können, belasten die auf der Speicher-Seite der Dinge (Höhe * Breite * bit-Tiefe * 3 (+ 1 wenn Sie einen alpha-Kanal))
Erfüllen Ihre Wikipedianer braucht: