Start · Sprachen · PHP · Referenz · gc_disable

gc_disable

Funktion

Deaktiviert den Garbage Collector für zirkuläre Referenzen, sodass keine automatische Bereinigung von Referenzzyklen mehr stattfindet.

seit PHP 5.3.0 Kategorie: misc

Signatur

gc_disable(): void

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

Typ
void
Beschreibung
Die Funktion gibt keinen Wert zurück.

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;
Verarbeitung abgeschlossen. Einträge: 100000

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;
GC aktiv: ja GC aktiv nach gc_disable(): nein GC aktiv nach gc_enable(): ja

// 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.