session_start()
зарегистрирует внутренний обработчик вывода для перезаписи URL, когда trans-sid
включен. Если пользователь использует ob_gzhandler
или как с ob_start()
, порядок обработчика вывода важен для правильного вывода.
Например, пользователь должен зарегистрироваться ob_gzhandler
до начала сеанса.
Но это какой-то особый случай. Дело в том, что здесь важен порядок обработчиков вывода. Если вы хотите, чтобы один обработчик изменил то, что сделал другой, они должны быть выполнены в «правильном» порядке.
Как правило, если вы не используете такого рода обработчики (например, Apache и mod_deflate
отлично справляются со сжатием выходных данных), единственное, что имеет значение, это то, что заголовки не должны отправляться перед вами. звоните session_start
(потому что, в зависимости от вашей конфигурации, session_start
отправляет куки, которые передаются как заголовки HTTP).
И заголовки отправляются, как только должен быть отправлен какой-либо фрагмент данных, т. Е. Как только появляется какой-либо вывод, даже один пробел за пределами тегов <?php ?>
:
Примечание: Если вы используете сеансы на основе файлов cookie, вы должны вызвать session_start()
, прежде чем что-либо будет выведено в браузер.
ob_start
указывает, что PHP должен буферизовать данные:
Эта функция включает буферизацию вывода. Пока активна буферизация вывода, из сценария не отправляются выходные данные (кроме заголовков), вместо этого выходные данные сохраняются во внутреннем буфере.
Таким образом, вывод не отправляется до того, как вы на самом деле говорите «отправьте данные». Это означает, что заголовки не отправляются немедленно - это означает, что session_start может быть вызван позже, даже если он должен был быть выведен, если ob_start
не использовался.