W3docs

connection_aborted()

Функция connection_aborted() в PHP проверяет, прервал ли браузер клиента соединение с веб-сервером.

Что делает connection_aborted()

Функция connection_aborted() сообщает, отключился ли клиент (обычно браузер) до того, как скрипт завершил отправку ответа. Клиент «прерывает» соединение, когда посетитель закрывает вкладку, нажимает кнопку остановки, переходит на другую страницу или теряет сетевое соединение.

Функция не принимает аргументов и возвращает целое число:

  • 1 — если соединение было прервано клиентом,
  • 0 — если соединение ещё активно.
connection_aborted(): int

На практике возвращаемое значение используется как boolean, поэтому if (connection_aborted()) естественно читается как «если клиент ушёл».

Когда это нужно

Для большинства страниц эта функция не нужна — PHP просто останавливается, когда клиент отключается. Она становится полезной для долго выполняющихся скриптов, которые должны выполнять очистку или вести учёт даже тогда, когда никто не ждёт результата, например:

  • Отчёт или экспорт, который занимает несколько минут и должен зафиксировать частичный результат или откатить изменения при отключении.
  • Скрипт, записывающий прогресс в лог и сохраняющий информацию о том, «на каком шаге пользователь остановился».
  • Фоновая задача, запущенная веб-запросом, которая должна продолжать работу после того, как пользователь ушёл.

Есть важный нюанс: PHP не может обнаружить прерванное соединение, пока не попытается отправить вывод клиенту. Поэтому connection_aborted() переключается в 1 только после попытки записи (echo/print) и сброса буфера. Обычно её используют вместе с flush() внутри цикла, чтобы PHP действительно отправлял данные и замечал отключение.

По умолчанию PHP также завершает скрипт в момент, когда обнаруживает уход клиента. Чтобы продолжить работу после отключения — что и является смыслом проверки connection_aborted() — сначала нужно вызвать ignore_user_abort(true).

Простой пример

Этот скрипт просит PHP продолжать выполнение после отключения, затем запускает цикл и проверяет соединение на каждой итерации. Когда клиент прерывает соединение, скрипт записывает заметку в лог и останавливается.

<?php

// Keep executing even if the client disconnects.
ignore_user_abort(true);

for ($i = 0; $i < 60; $i++) {
    // Send something and flush so PHP can detect a closed connection.
    echo "Working on step $i ...\n";
    flush();

    if (connection_aborted()) {
        file_put_contents('job.log', "Client left at step $i\n", FILE_APPEND);
        break;
    }

    sleep(1); // simulate slow work
}

connection_aborted() возвращает 0, пока браузер ещё слушает, и 1 после того, как посетитель закрыл вкладку; break затем аккуратно завершает цикл.

Определение причины остановки скрипта

Долгий скрипт может завершиться по двум причинам: клиент прервал соединение или истекло настроенное ограничение по времени. connection_aborted() отвечает на первый вопрос; connection_status() отвечает на оба сразу, возвращая битовую маску. Следующий фрагмент показывает значения констант, которые использует PHP, — его можно запустить через PHP CLI:

<?php

// The bit flags returned by connection_status()
echo "ABORTED  = " . CONNECTION_ABORTED . "\n"; // 1
echo "TIMEOUT  = " . CONNECTION_TIMEOUT . "\n";  // 2
echo "NORMAL   = " . CONNECTION_NORMAL . "\n";   // 0

При запуске выводится:

ABORTED  = 1
TIMEOUT  = 2
NORMAL   = 0

Таким образом, connection_aborted() фактически является сокращением для проверки бита CONNECTION_ABORTED в результате connection_status().

Распространённые подводные камни

  • Нужен вывод и сброс буфера. Без echo/flush() прерывание никогда не обнаруживается и connection_aborted() остаётся 0.
  • Буферизация вывода скрывает прерывания. Если ob_start() или неявная буферизация удерживает вывод, PHP никогда не пишет в сокет. Сбросьте буферы (например, ob_flush(), затем flush()).
  • Работает только в веб-запросе. При запуске из CLI функция всегда возвращает 0, поскольку нет клиента, который мог бы отключиться.
  • Обычно сначала нужен ignore_user_abort(true), иначе скрипт завершится до того, как проверка будет выполнена.

Заключение

connection_aborted() позволяет PHP-скрипту реагировать на отключение посетителя в середине запроса — возвращая 1 после прерванного соединения и 0, пока оно ещё открыто. Функция наиболее ценна в долго выполняющихся скриптах, где её используют вместе с ignore_user_abort() и flush(), чтобы завершить работу по очистке даже тогда, когда никто не ждёт ответа.

Практика

Практика
Что делает функция connection_aborted() в PHP?
Что делает функция connection_aborted() в PHP?
Was this page helpful?