Ответ начинается до первого байта тела
header и setcookie работают, пока вывод не начался. Случайный пробел, BOM или warning нарушает возможность установить статус. Pulse строит Response value и единственный emitter отправляет status, headers и body в правильном порядке.
Output buffering может помочь композиции, но не должен скрывать ранний вывод как норму. В production display_errors выключен, а шаблон получает готовую view model.
Путь загруженного файла
Cookie не является сессией
Cookie session id — случайный ключ, а данные сессии хранятся сервером. После входа идентификатор регенерируется, cookie получает Secure, HttpOnly и подходящий SameSite. Значение session не содержит пароль, роль или право в форме, которой сервер обязан верить.
Session lock способен сериализовать параллельные запросы одной сессии. После чтения нужного состояния lock закрывают, если дальнейшая работа долгая. Предметные данные Pulse остаются в базе.
Partitioned и срок жизни
PHP 8.5 добавил поддержку атрибута partitioned в setcookie options. Он решает конкретные сценарии third-party контекста и не заменяет Secure или SameSite policy. Применение проверяется на реальном browser contract.
Срок cookie, срок server session и срок предметного доступа — три разные величины. Logout удаляет server state и отправляет expired cookie с теми же path/domain options.
Загрузка — поток недоверенных байтов
Проверяются UPLOAD_ERR, фактический размер, общий post_max_size, MIME через содержимое и предметный формат. Оригинальное имя используется только как очищенная подпись, а физическое имя создаёт сервер. Файл хранится вне web-root и никогда не include/require.
CSV или NDJSON обрабатывается ограниченными строками. Archive требует лимита числа записей, распакованного объёма, вложенности и запрета traversal. Async-очередь не отменяет проверку перед постановкой.
Лаборатория
Создайте форму импорта Pulse с PRG. Проверьте пустую загрузку, превышение лимита, ложное расширение, повтор POST и попытку передать имя ../report.php.
- Нет серверного eval или include загруженного пути.
- Повтор refresh не создаёт второй импорт.
- Session lock не держится во время обработки файла.
Закрепите материал
Отметка, заметка, чек-лист и ответы остаются в localStorage этого браузера и не отправляются в аналитику.
Перелинковка со справочником
Проверка актуальности
- php.nethttps://www.php.net/manual/en/book.session.phpПервичный источник для актуализации фактов. Адрес приведён как текст и не является активной ссылкой.
- php.nethttps://www.php.net/releases/8.5/en.phpПервичный источник для актуализации фактов. Адрес приведён как текст и не является активной ссылкой.
- php.nethttps://www.php.net/manual/en/book.filesystem.phpПервичный источник для актуализации фактов. Адрес приведён как текст и не является активной ссылкой.
Текст и схемы созданы для этого самоучителя без воспроизведения страниц, иллюстраций и листингов приложенной книги. Проверено: .