Signatur
Beschreibung
ignore_user_abort() steuert, ob PHP ein laufendes Skript weiterlaufen lässt, wenn der Client (z. B. Browser) die Verbindung trennt. Standardmäßig bricht PHP die Skript-Ausführung ab, sobald es bei einem Schreibversuch (z. B. echo) bemerkt, dass der Client nicht mehr verbunden ist.
Wird true übergeben, läuft das Skript weiter, auch wenn der Client die Verbindung geschlossen hat. Dies ist nützlich für länger laufende Hintergrundprozesse wie E-Mail-Versand, Datenbankimporte oder Cron-ähnliche Aufgaben, die unabhängig vom Browser-Zustand abgeschlossen werden sollen.
Wird die Funktion ohne Argument aufgerufen, gibt sie nur den aktuellen Einstellungswert zurück (0 = abbrechen, nicht-0 = weiterlaufen), ohne ihn zu ändern. Das ermöglicht eine nicht-destruktive Abfrage des aktuellen Zustands.
Zu beachten ist, dass PHP den Verbindungsstatus erst beim tatsächlichen Versuch, Daten an den Client zu senden, prüft. Ein Skript ohne jegliche Ausgabe wird daher immer weiterlaufen, unabhängig von dieser Einstellung.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $enable | bool | Wenn true, läuft das Skript auch bei Verbindungsabbruch weiter. Wenn false, wird die Ausführung bei erkanntem Abbruch beendet. Wird kein Argument übergeben, bleibt die aktuelle Einstellung unverändert. |
Rückgabewert
0 bedeutet, das Skript würde bei Verbindungsabbruch beendet; ein Wert ungleich 0 bedeutet, das Skript läuft weiter. Beim ersten Aufruf ohne vorherige Einstellung entspricht der Rückgabewert der aktuellen PHP-INI-Einstellung ignore_user_abort.Beispiele
Hintergrundverarbeitung nach Verbindungsabbruch fortsetzen
<?php
// Skript läuft weiter, auch wenn der Browser geschlossen wird
ignore_user_abort(true);
// Verbindung zum Client sofort schließen, Verarbeitung im Hintergrund
header('Content-Length: 0');
header('Connection: close');
ob_end_flush();
flush();
// Zeitintensive Aufgabe im Hintergrund
sleep(10); // z. B. langer Datenbankimport oder E-Mail-Versand
file_put_contents('/tmp/background_task.log', 'Aufgabe abgeschlossen: ' . date('Y-m-d H:i:s') . PHP_EOL, FILE_APPEND);
Aktuellen Einstellungswert abfragen ohne Änderung
<?php
// Aktuellen Wert lesen (kein Argument = keine Änderung)
$currentSetting = ignore_user_abort();
if ($currentSetting) {
echo 'Skript läuft bei Verbindungsabbruch weiter.';
} else {
echo 'Skript wird bei Verbindungsabbruch beendet.';
}
// Einstellung temporär ändern und alten Wert sichern
$previous = ignore_user_abort(true);
echo 'Vorherige Einstellung: ' . ($previous ? 'weiterlaufen' : 'abbrechen');
// Wichtig · Fallstricke
Wichtig: PHP erkennt einen Verbindungsabbruch erst dann, wenn es versucht, Daten an den Client zu senden (z. B. via echo, flush()). Skripte ohne Ausgabe laufen unabhängig von dieser Einstellung immer durch.
Die Einstellung kann auch global in der php.ini über die Direktive ignore_user_abort gesetzt werden. Der Standardwert ist dort Off (Skript wird bei Abbruch beendet).
Bei CLI-Skripten (Kommandozeile) ist diese Funktion ohne Wirkung, da es keinen HTTP-Client gibt. Sie ist primär für den Web-Kontext (Apache, PHP-FPM) relevant.
Für zuverlässige Hintergrundprozesse sind dedizierte Lösungen wie Queues (z. B. RabbitMQ, Redis) oder Cron-Jobs zu bevorzugen, da ignore_user_abort(true) keine Kontrolle über PHP-Timeouts (max_execution_time) bietet.