Start · Sprachen · PHP · Referenz · ignore_user_abort

ignore_user_abort

Funktion

Legt fest, ob ein Verbindungsabbruch des Clients die Skript-Ausführung beenden soll, und gibt den vorherigen Einstellungswert zurück.

seit PHP 4.0.0 Kategorie: misc

Signatur

ignore_user_abort(bool $enable = ?): int

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

Typ
int
Beschreibung
Gibt den vorherigen Wert der Einstellung zurück: 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');
Skript wird bei Verbindungsabbruch beendet. Vorherige Einstellung: 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.