Как остановить php?
Друг поставил header с перенаправлением и считает, что PHP дальше сам остановится. У меня после него выполняются ещё 2 действия с данными. Чем завершить именно текущий запрос?
Пока нет лидеров с лучшими ответами.
Ваш вопрос
Друг поставил header с перенаправлением и считает, что PHP дальше сам остановится. У меня после него выполняются ещё 2 действия с данными. Чем завершить именно текущий запрос?
v4-pro
Завершите обработчик явно после формирования ответа. Например:
if (!$allowed) {
header('Location: /login');
exit;
}
// Здесь разрешённая работа с данными.
$allowed должен быть результатом вашей проверки доступа. Условие ставят раньше защищённой операции, поскольку exit ничего не откатывает. Заголовок Location сам по себе лишь описывает ответ клиенту.
Если аналогичная проверка находится в отдельной функции, простой return завершит только функцию: вызывающая сторона обязана правильно обработать результат. Закрывающий тег PHP тоже не подходит для остановки.
Для ответа без перенаправления можно установить HTTP-статус, вывести допустимое сообщение и вызвать exit. Не передавайте HTTP-статус числом в exit: числовой аргумент обозначает код завершения для командной строки.
После header('Location: /login'); добавьте exit;. Сам заголовок перенаправления не останавливает скрипт, поэтому нижние строки продолжают исполняться. Делайте проверку до изменения данных: завершение не отменяет уже выполненные операции. Если нужен только выход из функции, применяют return, но вызывающий код после него может продолжиться. Службу PHP для остановки одного запроса выключать не требуется.
Пока нет премиум-вопросов в подборке
Не нашли то, что искали?
Задайте свой вопрос
Лучший ответ
4o-mini
4o-mini
Как остановить php?
✓ После отправки заголовка перенаправления явно завершите текущий скрипт:
header('Location: /login'); exit;. Заголовок сообщает клиенту о переходе, но не прекращает выполнение расположенного ниже PHP-кода. Поэтому без завершения ваши действия с данными способны выполниться. ✓ Разместите проверку до операций, которые запрещены для этого запроса. Если доступ не разрешён, сначала сформируйте подходящий ответ, затем остановите обработку. Уже совершённые изменения базы или файлов вызовexitназад не откатывает. ✓ Различайте остановку всего скрипта и выход из функции.returnвнутри функции передаёт управление вызывающему коду, который может продолжить работу. В подключённом файлеreturnзавершает выполнение этого файла и возвращает управление месту подключения. ✓ Закрывающий тег PHP не является командой остановки. После него движок может выводить обычный текст и затем исполнять новый блок PHP. Заменаexitна такой тег вашу проблему не решает. ✓ В командной строке целое число вexit(1)является кодом завершения процесса, а строка вexit('Ошибка')выводит сообщение. Для HTTP-кода применяйтеhttp_response_code(), не рассчитывайте задать статус страницы числовым аргументомexit. ✓ Учитывайте действия при завершении: зарегистрированные обработчики shutdown и деструкторы могут исполняться. Поэтому обещать, что после вызова вообще никакой пользовательский код не выполнится, неверно. Не прячьте критические изменения данных в подобных обработчиках. ✓ Для библиотеки чаще удобнее вернуть результат или выбросить исключение, чтобы внешний обработчик решил, какой ответ сформировать. Для вашей проверки в основном обработчике простойexitпосле перенаправления подходит. Он завершает этот запрос и не требует выключать службу FPM для остальных посетителей.