Завершение работы PHP сценария

Раздел: Настройка и оптимизация PHP -> Управление выполнением PHP

Методы прерывания выполнения PHP

В PHP существует несколько способов остановить выполнение скрипта. Каждый из них подходит для разных ситуаций и имеет свои особенности.

Как принудительно завершить скрипт в любой точке?

Основной и наиболее эффективный способ - использование функций die() или exit(). Они полностью эквивалентны: обе принимают необязательный строковый или числовой аргумент и немедленно прекращают выполнение скрипта.


<?php
$error = 'Ошибка подключения к базе данных';
die($error);
// Код ниже не выполнится
echo 'Это не будет выведено';
?>
  

прервать выполнение php (прерывание выполнения php)

Ошибка подключения к базе данных
  

Index php control (контроль index.php)

В отличие от return или исключений, die/exit прерывает выполнение всего скрипта, даже если вызов происходит внутри функции. При этом выполняются функции, зарегистрированные через register_shutdown_function.

Возможные проблемы:

  • Не закрываются соединения с базами данных, файлы и другие ресурсы. Рекомендуется перед вызовом die() явно освобождать ресурсы.
  • При передаче строкового сообщения оно выводится как обычный текст. Если требуется пустой ответ, используйте exit; без аргументов.
  • В CLI-скриптах die() без кода возврата завершается с кодом 0. Для сигнализации об ошибке передайте ненулевое число: exit(1);

Как завершить скрипт без вывода сообщения?

Используйте оператор return в глобальной области видимости. Он завершает текущий файл (если скрипт состоит из одного файла - завершается весь скрипт). Подходит для случаев, когда нужно прекратить выполнение без дополнительных действий.


<?php
$condition = true;
if ($condition) {
    return; // дальнейший код не выполняется
}
echo 'Этот текст не появится';
?>
  

Если файл подключается через include или require, return завершает только подключённый файл, а основной скрипт продолжает работу.

Типичная ошибка:

Путаница между return и exit. Внутри функций return лишь возвращает управление вызывающему коду, а exit останавливает всё.

Как прервать выполнение и передать управление обработчику ошибок?

Выбросьте исключение с помощью throw. Это позволяет организовать централизованную обработку ошибок через try...catch. Исключение прерывает текущий блок кода, но может быть перехвачено выше по стеку.


<?php
function divide($a, $b) {
    if ($b == 0) {
        throw new Exception('Деление на ноль');
    }
    return $a / $b;
}

try {
    echo divide(10, 0);
} catch (Exception $e) {
    echo 'Ошибка: ' . $e->getMessage();
    // Можно залогировать и завершить скрипт
    exit(1);
}
?>
  
Ошибка: Деление на ноль
  

Если исключение не перехвачено, PHP генерирует фатальную ошибку и скрипт завершается.

Рекомендации:

  • Используйте пользовательские классы исключений для разных типов ошибок.
  • В обработчике catch можно принять решение: завершить скрипт (exit) или продолжить выполнение.

Как выполнить код после остановки скрипта?

Зарегистрируйте функцию через register_shutdown_function. Она будет вызвана после завершения скрипта (независимо от причины: exit, ошибка или естественное окончание). Это удобно для закрытия соединений, записи логов.


<?php
register_shutdown_function(function() {
    echo 'Скрипт завершён. Выполняется очистка.';
});

echo 'Основной код...';
exit;
?>
  
Основной код...
Скрипт завершён. Выполняется очистка.
  

Важно: внутри shutdown-функции нельзя гарантировать, что все ресурсы ещё доступны. Не используйте её для сложного восстановления.

Ошибка:

Попытка выбросить исключение внутри shutdown-функции - это приведёт к неопределённому поведению.

Как указать код возврата при завершении в CLI?

Передайте целое число в exit(). Код 0 означает успех, ненулевые значения - различные ошибки. Операционные системы используют этот код для передачи статуса.


<?php
$success = false;
if (!$success) {
    exit(1); // сигнал об ошибке
}
?>
  

В веб-контексте код ответа HTTP не меняется (заголовки могут быть отправлены отдельно).

Частая путаница:

Использование die('0') - выводится строка '0', а не код возврата. Для кода возврата нужно exit(0) (без кавычек).

Цели и случаи использования:

  • die()/exit() - для немедленной остановки при обнаружении критической ошибки, когда дальнейшая работа невозможна.
  • return - в файлах конфигурации или начальных проверках, когда нужно прекратить выполнение только текущего файла.
  • throw - в библиотеках и приложениях с централизованной обработкой ошибок.
  • register_shutdown_function - для гарантированного освобождения системных ресурсов (логирование, закрытие дескрипторов).
  • exit(код) - в CLI-скриптах для корректного взаимодействия с внешними инструментами.

Расширенные примеры и нестандартные сценарии

Пример 1: Прерывание с очисткой буфера вывода

Пример

<?php
ob_start();
echo 'Этот текст попадёт в буфер';
// Внезапная ошибка
if (true) {
    ob_end_clean(); // очищаем буфер
    exit('Произошла ошибка');
}
?>
Произошла ошибка

Без ob_end_clean() предыдущий вывод также попал бы в ответ.

Пример 2: Использование exit с передачей JSON для AJAX

Пример

<?php
header('Content-Type: application/json');
$data = ['status' => 'error', 'message' => 'Недостаточно прав'];
exit(json_encode($data));
?>
{"status":"error","message":"Недостаточно прав"}

Пример 3: Множественные shutdown-функции и их порядок

Пример

<?php
register_shutdown_function(function() {
    echo 'Первая shutdown-функция
';
});
register_shutdown_function(function() {
    echo 'Вторая shutdown-функция
';
});
echo 'Основной код';
?>
Основной код
Первая shutdown-функция
Вторая shutdown-функция

Функции выполняются в порядке регистрации (LIFO).

Пример 4: Прерывание с отправкой HTTP-статуса 500

Пример

<?php
http_response_code(500);
header('Content-Type: text/plain');
exit('Внутренняя ошибка сервера');
?>
(заголовки: 500 Internal Server Error)
Внутренняя ошибка сервера

Пример 5: Использование exit внутри цикла для досрочного завершения итерации

Пример

<?php
$items = [1, 2, 3, 4, 5];
foreach ($items as $item) {
    if ($item == 3) {
        exit('Обнаружено значение 3, остановка');
    }
    echo $item . ' ';
}
?>
1 2 Обнаружено значение 3, остановка

Цикл прерывается полностью, весь скрипт завершается.

Пример 6: Прерывание выполнения в многопоточном скрипте (pthreads)

Пример

<?php
class WorkerThread extends Thread {
    public function run() {
        echo 'Поток начал работу';
        // Здесь exit() завершит только текущий поток!
        exit;
        echo 'Это не будет выполнено';
    }
}
$worker = new WorkerThread();
$worker->start();
$worker->join();
echo 'Основной поток продолжается';
?>
Поток начал работу
Основной поток продолжается

В pthreads вызов exit() в потоке останавливает только данный поток, а не весь процесс.

Прерывание выполнения PHP - comments

En
прервать выполнение php (php)