Я только что заметил что-то странное. Я подумал, что, как говорит руководство РНР, session_start()
должен вызываться до любого вывода отправляется в браузер:session_start() работает после отправки вывода
Чтобы использовать куки на основе сеансов, session_start() должен быть вызван до outputing ничего в браузере.
Итак, просто для любопытства, я создал два сценария. Одним из них является write.php:
<?php
echo 'foo';
session_start();
$_SESSION['bar'] = 'baz';
?>
И другая является read.php:
<?php
echo 'foo';
session_start();
var_dump($_SESSION['bar']);
?>
И удивительно, что сессия записывается и читается даже после того, как echo
ИНГ Foo.
Однако, если добавить вызов flush()
после echo
с, сообщает журнал ошибок апача:
[Вт 3 января 11:57:21 2012] [ошибка] [клиент 127.0.0.1] PHP Предупреждение: session_start(): Не удается отправить ограничитель кеша сеанса - заголовки уже отправлены в /var/www/sessions/write.php в строке 5 [Tue Jan 03 11:57:21 2012] [ошибка] [клиент 127.0.0.1] PHP Stack trace: [Tue Jan 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()
?
[Google «PHP-буферизация вывода»] (http://www.google.com/search?q=php+output+buffering) – DaveRandom