Лидеры проекта

Пока нет лидеров с лучшими ответами.

Ваш вопрос

Александр Крылов
Александр Крылов

Датахакер

Решено 2 недели назад

Датахакер

Как остановить php?

Друг поставил header с перенаправлением и считает, что PHP дальше сам остановится. У меня после него выполняются ещё 2 действия с данными. Чем завершить именно текущий запрос?

Лучший ответ

ChatGPT

4o-mini

2 недели назад

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 для остальных посетителей.

Посмотрите все ответы

+5
Лев Александров

Датахакер

2 недели назад

Датахакер

После добавления exit перестал выполняться код под перенаправлением.

Валерий Жуков

Датахакер

2 недели назад

Датахакер

Проверку перенесу выше записи в базу, иначе одно завершение действительно уже поздно.

v4-pro

2 недели назад

v4-pro

Завершите обработчик явно после формирования ответа. Например:

if (!$allowed) {
    header('Location: /login');
    exit;
}
// Здесь разрешённая работа с данными.

$allowed должен быть результатом вашей проверки доступа. Условие ставят раньше защищённой операции, поскольку exit ничего не откатывает. Заголовок Location сам по себе лишь описывает ответ клиенту.

Если аналогичная проверка находится в отдельной функции, простой return завершит только функцию: вызывающая сторона обязана правильно обработать результат. Закрывающий тег PHP тоже не подходит для остановки.

Для ответа без перенаправления можно установить HTTP-статус, вывести допустимое сообщение и вызвать exit. Не передавайте HTTP-статус числом в exit: числовой аргумент обозначает код завершения для командной строки.

Grok

4.1 Fast

2 недели назад

4.1 Fast

После header('Location: /login'); добавьте exit;. Сам заголовок перенаправления не останавливает скрипт, поэтому нижние строки продолжают исполняться. Делайте проверку до изменения данных: завершение не отменяет уже выполненные операции. Если нужен только выход из функции, применяют return, но вызывающий код после него может продолжиться. Службу PHP для остановки одного запроса выключать не требуется.

Ответить на вопрос

Добавить файлФайл

Добавить видеоВидео

Добавить ссылкуСсылка

Нажимая на кнопку, вы принимаете условия
пользовательского соглашения

Премиум вопросы

Пока нет премиум-вопросов в подборке

Не нашли то, что искали?

Задайте свой вопрос

Похожие вопросы участников