session_start () работает после отправки вывода - PullRequest
3 голосов
/ 03 января 2012

Я только что заметил что-то странное.Я подумал, что, как говорится в руководстве PHP, session_start() должен быть вызван перед отправкой любого вывода в браузер:

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

Итак, для любопытства я создал два сценария.Один из них - write.php :

<?php
echo 'foo';

session_start();
$_SESSION['bar'] = 'baz';
?>

А другой - read.php :

<?php
echo 'foo';

session_start();
var_dump($_SESSION['bar']);
?>

И, что удивительно, сеансзаписывается и читается даже после echo ing foo .

Однако, если я добавлю вызов к flush() после echo s, журнал ошибок Apache сообщит:

[Вт Янв 03 11:57:21 2012] [ошибка] [клиент 127.0.0.1] PHP Предупреждение: session_start (): невозможно отправить ограничитель кэша сеанса - заголовки уже отправлены в / var / www / session /write.php в строке 5 [вт. 03 января 11:57:21 2012] [ошибка] [клиент 127.0.0.1] трассировка стека PHP: [вт. 03 янв. 11:57:21 2012] [ошибка] [клиент 127.0.0.1]PHP 1. {main} () /var/www/sessions/write.php:0 [вторник, 03 января 11:57:21 2012] [ошибка] [клиент 127.0.0.1] PHP 2. session_start () / var / www/sessions/write.php:5

Итак, мои вопросы: почему сессия написана правильно после echo что-то?Разве это не сразу отправляется в браузер?И, если это так, значит ли это, что я могу начать сеанс где угодно, если я не позвоню flush() раньше?

Ответы [ 2 ]

7 голосов
/ 03 января 2012

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

Это правда. Настройка cookie на стороне сервера (в отличие от настройки cookie JavaScript) работает путем отправки заголовка HTTP. Заголовки HTTP располагаются перед фактическим документом: как только вы начинаете отправку документа, больше нет места для дальнейших заголовков.

В вашем случае получается следующее:

echo 'foo';

... фактически не отправляет вывод в браузер. Вместо этого он добавляет некоторые выходные данные в очередь, которая будет отправлена ​​позже. Интерпретатор PHP сконфигурирован для хранения этого вывода до тех пор, пока не произойдет определенное событие (возможно, сценарии завершатся или очередь достигнет определенного размера).

Директива output_buffering является вероятным подозреваемым.

0 голосов
/ 03 января 2012

Эта ошибка в session_start() не означает, что у вас еще нет открытых сессий.Этот метод пытается создать новый идентификатор сеанса, но у вас уже может быть один.Попробуйте удалить все файлы cookie перед запуском этих сценариев.

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