Signatur
Beschreibung
connection_status() liefert den aktuellen Verbindungsstatus als Integer-Bitfeld. Damit lässt sich während der Skriptausführung prüfen, ob die Verbindung zum Client noch aktiv ist, ob sie abgebrochen wurde oder ob das Skript durch ein Timeout beendet wurde.
PHP definiert dafür drei Konstanten: CONNECTION_NORMAL (0) — Verbindung ist aktiv; CONNECTION_ABORTED (1) — der Client hat die Verbindung getrennt; CONNECTION_TIMEOUT (2) — das Skript-Timeout wurde überschritten. Da es sich um ein Bitfeld handelt, können diese Zustände kombiniert auftreten, z. B. CONNECTION_ABORTED | CONNECTION_TIMEOUT (3).
Typischer Einsatzort sind langläufige Skripte (z. B. Dateiexporte, Batch-Verarbeitungen), bei denen unnötige Arbeit vermieden werden soll, wenn der Nutzer die Seite bereits geschlossen hat. In Verbindung mit ignore_user_abort(true) kann das Skript auch nach einem Client-Abbruch weiterlaufen, sollte aber regelmäßig den Status prüfen, um ressourcenaufwändige Operationen frühzeitig abzubrechen.
Wichtig: Der Status wird vom PHP-Kern erst dann korrekt aktualisiert, wenn Output an den Client gesendet (und geflushht) wird, da PHP-Verbindungsabbrüche über fehlgeschlagene Schreibvorgänge auf den Output-Buffer erkennt.
Rückgabewert
CONNECTION_NORMAL (0), CONNECTION_ABORTED (1), CONNECTION_TIMEOUT (2) oder eine Kombination davon (z. B. 3 für abgebrochen und Timeout).Beispiele
Grundlegende Statusabfrage während eines langen Skripts
<?php
ignore_user_abort(true); // Skript läuft auch nach Client-Abbruch weiter
for ($i = 0; $i < 100; $i++) {
// Verbindungsstatus prüfen
$status = connection_status();
if ($status & CONNECTION_ABORTED) {
// Client hat die Verbindung getrennt — Verarbeitung abbrechen
error_log('Verbindung durch Client getrennt nach ' . $i . ' Iterationen.');
break;
}
if ($status & CONNECTION_TIMEOUT) {
error_log('Skript-Timeout erreicht nach ' . $i . ' Iterationen.');
break;
}
// Simulierte Arbeit
echo "Schritt $i abgeschlossen.\n";
flush();
sleep(1);
}
echo "Verarbeitung beendet.\n";
Statuswert mit Konstantennamen ausgeben
<?php
$status = connection_status();
$labels = [];
if ($status === CONNECTION_NORMAL) {
$labels[] = 'NORMAL';
}
if ($status & CONNECTION_ABORTED) {
$labels[] = 'ABORTED';
}
if ($status & CONNECTION_TIMEOUT) {
$labels[] = 'TIMEOUT';
}
echo 'Verbindungsstatus: ' . implode(' | ', $labels) . ' (' . $status . ')';
// Wichtig · Fallstricke
Output erforderlich für korrekte Erkennung: PHP erkennt einen Client-Abbruch erst, wenn es versucht, Daten zu senden. Ohne vorherigen flush()-Aufruf bleibt der Status möglicherweise CONNECTION_NORMAL, obwohl der Client längst weg ist.
CLI-Skripte: Unter der Kommandozeile ist der Verbindungsstatus immer CONNECTION_NORMAL, da es keinen HTTP-Client gibt.
In Kombination mit ignore_user_abort() und set_time_limit() ermöglicht connection_status() eine feingranulare Steuerung langläufiger Prozesse.