Signatur
Beschreibung
gc_disable() schaltet den in PHP integrierten Garbage Collector für zirkuläre Referenzen ab. Normalerweise überwacht PHP automatisch den internen Puffer für potenzielle Referenzzyklen und löst periodisch einen Sammlungslauf aus, wenn der Puffer voll ist. Nach dem Aufruf von gc_disable() wird dieser automatische Lauf unterdrückt.
Die Funktion kann sinnvoll sein, wenn ein Skript einen eng begrenzten, klar strukturierten Bereich mit sehr vielen kurzlebigen Objekten durchläuft und bekannt ist, dass dabei keine zirkulären Referenzen entstehen. In solchen Szenarien erzeugt der Garbage Collector nur unnötigen Overhead und kann durch temporäres Deaktivieren Laufzeit sparen.
Wichtig: Das Deaktivieren des Garbage Collectors verhindert nicht die normale Referenzzählung. Objekte ohne Referenzzyklus werden nach wie vor sofort freigegeben, sobald ihr Referenzzähler auf null fällt. Lediglich die kostspielige Erkennung und Bereinigung von Zyklen (z. B. bei gegenseitig referenzierenden Objekten) bleibt aus.
Um den Garbage Collector nach dem kritischen Abschnitt wieder einzuschalten, steht gc_enable() zur Verfügung. Mit gc_enabled() lässt sich der aktuelle Status abfragen.
Rückgabewert
Beispiele
Garbage Collector temporär für eine rechenintensive Schleife deaktivieren
<?php
// Garbage Collector vor der intensiven Verarbeitung deaktivieren
gc_disable();
$result = [];
for ($i = 0; $i < 100_000; $i++) {
// Einfache Objekte ohne Referenzzyklen
$obj = new stdClass();
$obj->value = $i * 2;
$result[] = $obj->value;
}
// Garbage Collector danach wieder aktivieren
gc_enable();
echo 'Verarbeitung abgeschlossen. Einträge: ' . count($result) . PHP_EOL;
Status vor und nach dem Deaktivieren prüfen
<?php
echo 'GC aktiv: ' . (gc_enabled() ? 'ja' : 'nein') . PHP_EOL;
gc_disable();
echo 'GC aktiv nach gc_disable(): ' . (gc_enabled() ? 'ja' : 'nein') . PHP_EOL;
gc_enable();
echo 'GC aktiv nach gc_enable(): ' . (gc_enabled() ? 'ja' : 'nein') . PHP_EOL;
// Wichtig · Fallstricke
Vorsicht bei zirkulären Referenzen: Wenn der Garbage Collector deaktiviert ist und im Code trotzdem Referenzzyklen entstehen (z. B. zwei Objekte, die sich gegenseitig referenzieren), wird der dafür belegte Speicher nicht freigegeben, bis das Skript endet oder gc_enable() bzw. gc_collect_cycles() aufgerufen wird. In lang laufenden Prozessen oder Skripten mit vielen solcher Zyklen kann dies zu erheblichem Speicherverlust führen.
Die Einstellung wirkt nur für die Laufzeit des aktuellen Skripts. Eine dauerhafte Konfiguration ist über die php.ini-Direktive zend.enable_gc möglich.