почему ob_start () должен прибыть перед session_start () для работы в PHP?

Еще лучше, чем jconsole visualvm, который разрабатывается и распределяется свободно Sun. Это имеет плагин анализа GC, названный gchisto, который мог бы помочь Вам.

Редактирование: Извините, я не видел Ваш JDK 1.4.2 требования. В этом случае visualvm не поможет Вам, увы.

8
задан omg 20 September 2009 в 13:13
поделиться

3 ответа

В « нормальном случае » я не думаю, что ob_start нужно вызывать перед session_start - ни наоборот.

Цитируя страницу руководства session_start , однако:

session_start () зарегистрирует внутренний обработчик вывода для перезаписи URL при транс-сид включен. Если пользователь использует ob_gzhandler или что-то подобное с ob_start (), порядок обработки вывода важно для правильного вывода. За например, пользователь должен зарегистрироваться ob_gzhandler перед началом сеанса.

Но это своего рода особый случай: здесь важен порядок обработчиков вывода: если вы хотите, чтобы один обработчик изменил действия, которые сделал другой, они должны быть выполнены в «правильном» порядке.


Как правило, если вы не используете такого рода обработчики (Apache и mod_deflate отлично справляются, например, с сжатием вывода) , единственное, что имеет значение, это то, что заголовки не должны отправляться до вызова session_start (поскольку, в зависимости от вашей конфигурации, session_start отправляет файлы cookie, которые передаются как заголовки HTTP) .

И заголовки отправляются, как только необходимо отправить какой-либо фрагмент данных, то есть, как только появляется какой-либо вывод, даже один пробел за пределами теги:

Примечание. Если вы используете файлы cookie сеансы, вы должны позвонить session_start () до того, как что-либо будет выводится в браузер.

ob_start указывает, что PHP должен буферизовать данные:

Эта функция включает вывод буферизация включена. При буферизации вывода активен, выходной сигнал не отправляется скрипт (кроме заголовков), вместо этого вывод хранится во внутреннем буфер.

Таким образом, вывод не отправляется, пока вы не скажете: « отправить данные ». Это означает, что заголовки не отправляются немедленно - это означает, что session_start может быть вызван позже, даже если он должен был быть выведен, если ob_start не использовался.


Надеюсь, это поможет все немного яснее ...

13
ответ дан 5 December 2019 в 09:26
поделиться

session_start может потребоваться изменить заголовок HTTP, если установлены определенные параметры конфигурации. Например, session.use_cookies , который требует установки / изменения поля заголовка Set-Cookie .

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

Таким образом, вы либо убедитесь, что нет абсолютно никакого вывода перед вызовом session_start . Или вы используете элемент управления буферизацией вывода для буферизации вывода, чтобы можно было изменить заголовок HTTP, даже если он уже существует.

0
ответ дан 5 December 2019 в 09:26
поделиться

Если по умолчанию ваш output_buffering выключен , и вы, к сожалению, отправили один байт данных обратно клиенту, то ваш ] Заголовки HTTP уже отправлены. Это эффективно предотвращает передачу session_start () заголовка cookie обратно клиенту. Вызывая ob_start () , вы включаете буферизацию и, следовательно, задерживаете отправку заголовков HTTP.

5
ответ дан 5 December 2019 в 09:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: