Signatur
Beschreibung
fastcgi_finish_request() ist eine FPM-spezifische Funktion, die den gesamten Ausgabepuffer an den Client überträgt und die HTTP-Verbindung schließt. Der PHP-Prozess selbst läuft dabei weiter, sodass rechenintensive Nacharbeiten (z. B. Datenbankoperationen, E-Mail-Versand, Cache-Aktualisierungen) ausgeführt werden können, ohne den Nutzer warten zu lassen.
Die Funktion ist ausschließlich im PHP-FPM-SAPI verfügbar. In anderen SAPIs (CLI, Apache mod_php usw.) ist sie nicht vorhanden oder nicht funktionsfähig. Vor dem Aufruf sollte sichergestellt sein, dass alle für den Client relevanten Ausgaben bereits erzeugt wurden.
Typische Anwendungsfälle sind asynchrone Hintergrundaufgaben direkt in PHP: Nach dem Senden der Antwort können z. B. Statistiken geschrieben, Benachrichtigungen versendet oder langlaufende Berechnungen gestartet werden. Im Vergleich zu einem Job-Queue-System ist das zwar weniger robust, aber für einfache Szenarien sehr praktisch.
Nach dem Aufruf von fastcgi_finish_request() sollte ignore_user_abort(true) gesetzt werden, um sicherzustellen, dass der Prozess auch nach dem Schließen der Verbindung weiterläuft. Außerdem gilt: Session-Daten müssen vorher mit session_write_close() gespeichert werden, da die Session sonst nach dem Finish-Request nicht mehr beschreibbar ist.
Rückgabewert
true zurück, wenn die Antwort erfolgreich gesendet wurde, andernfalls false. In Nicht-FPM-Umgebungen gibt die Funktion ebenfalls false zurück oder ist gar nicht definiert.Beispiele
Sofortige Antwort mit Hintergrundverarbeitung
<?php
// Ausgabe vorbereiten und an den Client senden
echo 'Ihre Bestellung wurde empfangen. Wir bearbeiten sie sofort!';
// Session schließen, bevor die Verbindung beendet wird
session_write_close();
// HTTP-Antwort abschließen – Client erhält die Antwort ab hier
fastcgi_finish_request();
// Prozess läuft weiter, Client wartet nicht mehr
ignore_user_abort(true);
// Zeitintensive Nachverarbeitung im Hintergrund
sleep(2); // Simulation einer langlaufenden Aufgabe
file_put_contents('/tmp/order_log.txt', date('c') . " Bestellung verarbeitet\n", FILE_APPEND);
Prüfung auf FPM-Verfügbarkeit vor dem Aufruf
<?php
function sendResponseAndContinue(string $message, callable $backgroundTask): void
{
echo $message;
if (function_exists('fastcgi_finish_request')) {
session_write_close();
fastcgi_finish_request();
ignore_user_abort(true);
$backgroundTask();
} else {
// Fallback: Hintergrundaufgabe sofort ausführen (blockierend)
ob_flush();
flush();
$backgroundTask();
}
}
sendResponseAndContinue(
'E-Mail wird gesendet...',
function () {
// Simuliertes E-Mail-Versenden
sleep(3);
error_log('E-Mail wurde im Hintergrund gesendet.');
}
);
// Wichtig · Fallstricke
Nur in PHP-FPM verfügbar: Die Funktion existiert ausschließlich im FPM-SAPI. Beim Einsatz in anderen Umgebungen (CLI, Apache-Modul) sollte die Verfügbarkeit vorher mit function_exists('fastcgi_finish_request') geprüft werden.
Session-Handling: Da nach dem Aufruf keine HTTP-Verbindung mehr besteht, muss die Session vorher mit session_write_close() gespeichert werden – andernfalls gehen Sitzungsdaten verloren oder es kommt zu Sperr-Problemen.
Ressourcenverbrauch: Der FPM-Worker-Prozess bleibt für die gesamte Dauer der Hintergrundverarbeitung belegt. Bei langen Hintergrundaufgaben oder hohem Traffic kann das den Worker-Pool erschöpfen. Für umfangreiche Aufgaben sollte ein dediziertes Queue-System (z. B. RabbitMQ, Redis Queue) bevorzugt werden.
Ausgabepuffer: Alle offenen Ausgabepuffer (ob_start()) werden beim Aufruf geleert und geschlossen. Dies sollte in der Anwendungsarchitektur berücksichtigt werden.