Es wurde auf der Seite des nicht eingestellten Handbuchs im Jahr 2009 erwähnt :
unset()
macht genau das, was sein Name sagt - eine Variable deaktivieren. Es erzwingt keine sofortige Speicherfreigabe. Der Garbage Collector von PHP wird dies tun, wenn es passt - absichtlich, sobald diese CPU-Zyklen ohnehin nicht benötigt werden oder erst, wenn dem Skript der Speicherplatz ausgeht, was zuerst passiert.
Wenn Sie dies tun $whatever = null;
, schreiben Sie die Daten der Variablen neu. Möglicherweise wird Speicher schneller freigegeben / verkleinert, aber möglicherweise werden CPU-Zyklen aus dem Code gestohlen, der sie wirklich früher benötigt, was zu einer längeren Gesamtausführungszeit führt.
(Seit 2013 enthält diese unset
Manpage diesen Abschnitt nicht mehr.)
Beachten Sie, dass bis php5.3, wenn Sie zwei Objekte in Zirkelreferenz haben , z. B. in einer Eltern-Kind-Beziehung, der Aufruf von unset () für das übergeordnete Objekt den für die übergeordnete Referenz im untergeordneten Objekt verwendeten Speicher nicht freigibt . (Der Speicher wird auch nicht freigegeben, wenn das übergeordnete Objekt durch Müll gesammelt wird.) ( Fehler 33595 )
Die Frage " Unterschied zwischen nicht gesetzt und = null " beschreibt einige Unterschiede:
unset($a)
wird auch $a
aus der Symboltabelle entfernt; beispielsweise:
$a = str_repeat('hello world ', 100);
unset($a);
var_dump($a);
Ausgänge:
Notice: Undefined variable: a in xxx
NULL
Aber wann $a = null
wird verwendet:
$a = str_repeat('hello world ', 100);
$a = null;
var_dump($a);
Outputs:
NULL
Es scheint, dass dies $a = null
etwas schneller ist als das unset()
Gegenstück: Das Aktualisieren eines Symboltabelleneintrags scheint schneller zu sein als das Entfernen.
- Wenn Sie versuchen, eine nicht vorhandene (
unset
) Variable zu verwenden, wird ein Fehler ausgelöst und der Wert für den Variablenausdruck ist null. (Denn was sollte PHP sonst noch tun? Jeder Ausdruck muss einen Wert ergeben.)
- Eine Variable, der Null zugewiesen ist, ist jedoch immer noch eine völlig normale Variable.
$whatever
auf ein Objekt gezeigt wird,$whatever = null
der Zeiger und nicht das Objekt selbst überschrieben wird, sodass er im Wesentlichen genauso funktioniert wieunset()
.unset
ist eigentlich keine Funktion, sondern ein Sprachkonstrukt . Es ist nicht mehr ein Funktionsaufruf als einreturn
oder eininclude
.Abgesehen von Leistungsproblemen
unset
macht die Verwendung die Absicht Ihres Codes viel klarer.quelle
unset
alsUnSeT
. Die Community hat sich aus Stilgründen auf Kleinbuchstaben festgelegt, aber andere Gehäuse funktionieren immer noch.Indem Sie ein unset () für eine Variable ausführen, haben Sie die Variable im Wesentlichen für 'Garbage Collection' markiert (PHP hat nicht wirklich eine, aber zum Beispiel), sodass der Speicher nicht sofort verfügbar ist. Die Variable enthält die Daten nicht mehr, aber der Stapel bleibt größer. Wenn Sie die Null-Methode ausführen, werden die Daten gelöscht und der Stapelspeicher fast sofort verkleinert.
Dies war aus persönlicher Erfahrung und auch aus anderen. Siehe die Kommentare der Funktion unset () hier .
Ich persönlich verwende unset () zwischen Iterationen in einer Schleife, damit ich nicht die Verzögerung haben muss, mit der der Stapel von Jo-Jo-Größe ist. Die Daten sind weg, aber der Footprint bleibt erhalten. Bei der nächsten Iteration wird der Speicher bereits von PHP belegt und somit die nächste Variable schneller initialisiert.
quelle
Demnach scheint "= null" schneller zu sein.
PHP 5.4 Ergebnisse:
PHP 5.3 Ergebnisse:
PHP 5.2 Ergebnisse:
PHP 5.1 Ergebnisse:
Mit PHP 5.0 und 4.4 sieht es anders aus.
5.0:
4.4:
Denken Sie daran, dass microtime (true) in PHP 4.4 nicht funktioniert, daher musste ich das Beispiel microtime_float verwenden, das in php.net/microtime / Beispiel 1 angegeben ist.
quelle
unset
ist schneller. Ich habe einen Test, der später die Existenz desunset
Falles überprüft . In dieser Testeinstellungnull
ist es geringfügig schneller. Test: pastebin.com/fUe57C51gc_collect_cycles
bevor Sie den Timer starten, um genauere Ergebnisse zu erhalten.Bei Array-Elementen macht dies einen Unterschied.
Betrachten Sie dieses Beispiel
Hier existiert noch der Schlüssel 'Test'. In diesem Beispiel jedoch
Der Schlüssel existiert nicht mehr.
quelle
Bei Variablen, die als Referenz kopiert wurden, funktioniert dies anders:
quelle
In Bezug auf Objekte, insbesondere im Lazy-Load-Szenario, sollte berücksichtigt werden, dass der Garbage Collector in Leerlauf-CPU-Zyklen ausgeführt wird. Wenn Sie also Probleme haben, wenn viele Objekte eine kleine Zeitstrafe laden, wird die Speicherfreigabe behoben.
Verwenden Sie time_nanosleep, um GC das Sammeln von Speicher zu ermöglichen. Das Setzen der Variablen auf Null ist wünschenswert.
Auf dem Produktionsserver getestet, verbrauchte der Job ursprünglich 50 MB und wurde dann angehalten. Nach Verwendung von Nanosleep waren 14 MB konstanter Speicherverbrauch.
Man sollte sagen, dass dies vom GC-Verhalten abhängt, das sich von PHP-Version zu Version ändern kann. Aber es funktioniert gut mit PHP 5.3.
z.B. dieses Beispiel (Code aus VirtueMart2 Google Feed)
quelle
Ich bezweifle dies immer noch, aber ich habe es in meinem Skript versucht und verwende xdebug, um zu wissen, wie sich dies auf die Nutzung des App-Speichers auswirkt. Das Skript ist auf meine Funktion wie folgt eingestellt:
Und ich füge unset kurz vor dem
return
Code hinzu und es gibt mir: 160200 dann versuche ich es mit zu ändern$sql = NULL
und es gibt mir: 160224 :)Aber es gibt etwas Einzigartiges an diesem Vergleich, wenn ich nicht unset () oder NULL verwende. Xdebug gibt mir 160144 als Speichernutzung
Ich denke also, wenn Sie die Zeile unset () oder NULL verwenden, wird Ihre Anwendung um einen Prozess erweitert, und es ist besser, den Ursprung Ihres Codes beizubehalten und die von Ihnen verwendete Variable so effektiv wie möglich zu verringern.
Korrigieren Sie mich, wenn ich falsch liege, danke
quelle
Ich habe einen neuen Leistungstest für
unset
und erstellt=null
, da, wie in den Kommentaren erwähnt, der hier geschriebene einen Fehler aufweist (die Neuerstellung der Elemente). Ich habe Arrays verwendet, wie Sie sehen, war das jetzt egal.Aber ich kann es nur auf einem PHP 5.5.9 Server testen, hier die Ergebnisse: - dauerte 4.4571571350098 Sekunden - dauerte 4.4425978660583 Sekunden
Ich bevorzuge
unset
aus Gründen der Lesbarkeit.quelle
PHP 7 arbeitet bereits an solchen Speicherverwaltungsproblemen und deren reduzierter bis minimaler Nutzung.
PHP 7.1 Outpu:
dauerte 0,16778993606567 Sekunden dauerte 0,16630101203918 Sekunden
quelle
unset
Code, wenn nicht sofortiger Speicher freigegeben wird, ist immer noch sehr hilfreich und wird empfohlen, dies jedes Mal zu tun, wenn wir Codeschritte weitergeben, bevor wir eine Methode beenden. Beachten Sie, dass es nicht darum geht, sofortigen Speicher freizugeben. Der unmittelbare Speicher ist für die CPU, was ist mit dem sekundären Speicher, der RAM ist.und dies betrifft auch die Verhinderung von Speicherlecks.
Bitte sehen Sie diesen Link http://www.hackingwithphp.com/18/1/11/be-wary-of-garbage-collection-part-2
Ich benutze unset schon lange.
Eine bessere Vorgehensweise wie diese im Code, um alle Variablen, die bereits als Array verwendet wurden, sofort zu deaktivieren.
und
just unset($data);
um alle variablen Nutzung freizugeben.siehe verwandtes Thema zu deaktivieren
Wie wichtig ist es, Variablen in PHP zu deaktivieren?
[Fehler]
quelle
Für die Aufzeichnung und ohne die Zeit, die es dauert:
Es kehrt zurück
Schlussfolgerung: Sowohl null als auch nicht festgelegter freier Speicher wie erwartet (nicht nur am Ende der Ausführung). Wenn Sie eine Variable neu zuweisen, wird der Wert zu einem bestimmten Zeitpunkt zweimal gespeichert (520216 gegenüber 438352).
quelle