Start · Sprachen · PHP · Referenz · apache_child_terminate

apache_child_terminate

Funktion

Markiert den aktuellen Apache-Kindprozess so, dass er nach Abschluss der aktuellen Anfrage beendet wird.

seit PHP 4.0.5 Kategorie: misc

Signatur

apache_child_terminate(): bool

Beschreibung

apache_child_terminate() weist den Apache-Webserver an, den aktuellen Kindprozess (Child Process) nach dem Abarbeiten der laufenden HTTP-Anfrage zu beenden. Apache erstellt daraufhin bei Bedarf automatisch einen neuen Kindprozess, um weitere Anfragen zu bedienen.

Diese Funktion ist besonders nützlich, wenn ein PHP-Skript sehr viel Speicher allokiert hat und dieser nach der Anfrage nicht vollständig freigegeben werden kann. Durch das gezielte Beenden des Kindprozesses wird der gesamte belegte Speicher an das Betriebssystem zurückgegeben, ohne den gesamten Apache-Server neu starten zu müssen.

Die Funktion steht nur zur Verfügung, wenn PHP als Apache-Modul (mod_php) läuft und wenn die PHP-Konfigurationsdirektive apache2.child_terminate in der php.ini auf On gesetzt ist. Andernfalls gibt die Funktion false zurück und gibt eine Warnung aus. Unter anderen SAPIs (z. B. CLI, FPM) ist sie nicht verfügbar.

Es sei darauf hingewiesen, dass das häufige Beenden von Kindprozessen den Overhead durch das erneute Starten erhöht und sich negativ auf die Performance auswirken kann. Der Einsatz sollte daher auf wirklich notwendige Situationen beschränkt bleiben.

Rückgabewert

Typ
bool
Beschreibung
Gibt true zurück, wenn die Funktion erfolgreich den Kindprozess zum Beenden markiert hat. Gibt false zurück, wenn PHP nicht als Apache-Modul läuft oder apache2.child_terminate nicht aktiviert ist.

Beispiele

Kindprozess nach speicherintensivem Vorgang beenden

<?php
// Speicherintensive Verarbeitung, z. B. Bild- oder XML-Verarbeitung
$data = file_get_contents('/var/data/large_dataset.xml');
$xml = simplexml_load_string($data);

// ... komplexe Verarbeitungslogik ...

// Aktuellen Speicherverbrauch ausgeben
echo 'Speicher nach Verarbeitung: ' . memory_get_usage(true) . ' Bytes' . PHP_EOL;

// Kindprozess nach der Anfrage beenden, damit Speicher vollständig freigegeben wird
if (apache_child_terminate()) {
    echo 'Kindprozess wird nach dieser Anfrage beendet.' . PHP_EOL;
} else {
    echo 'apache_child_terminate() ist in dieser Umgebung nicht verfügbar.' . PHP_EOL;
}
Speicher nach Verarbeitung: 134217728 Bytes Kindprozess wird nach dieser Anfrage beendet.

Bedingte Nutzung abhängig vom Speicherverbrauch

<?php
// Schwellenwert: 64 MB
$threshold = 64 * 1024 * 1024;

// ... ressourcenintensive Operationen ...

$memUsage = memory_get_usage(true);
if ($memUsage > $threshold) {
    // Nur bei hohem Speicherverbrauch den Prozess terminieren
    if (function_exists('apache_child_terminate')) {
        apache_child_terminate();
        error_log('apache_child_terminate() aufgerufen. Speicherverbrauch: ' . $memUsage . ' Bytes');
    }
}

echo 'Anfrage abgeschlossen.';
Anfrage abgeschlossen.

// Wichtig · Fallstricke

Konfigurationsvoraussetzung: Die Direktive apache2.child_terminate = On muss in der php.ini gesetzt sein, da sie standardmäßig auf Off steht. Ohne diese Einstellung gibt die Funktion immer false zurück.

SAPI-Einschränkung: Die Funktion funktioniert ausschließlich unter Apache mit mod_php. Unter PHP-FPM, dem eingebetteten Webserver oder der CLI ist sie nicht verfügbar. Prüfe mit function_exists('apache_child_terminate'), ob sie in der aktuellen Umgebung verfügbar ist.

Performance-Hinweis: Das häufige Beenden von Kindprozessen erzeugt Overhead durch Prozess-Neustarts. Diese Funktion sollte nur als letztes Mittel bei unkontrollierbar wachsendem Speicherverbrauch eingesetzt werden, nicht als reguläre Speicherverwaltungsstrategie.