Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Клуб профессиональных программистов :: Выпуск #6




Сессии PHP. Часть 2.
Особенности работы cookie в рамках сессии.

Часто встречающаяся ошибка при работе с сессией - поздний старт. Когда данные в браузер уже начали отправляться и вызов session_start() приводит к ошибке "headers already sent". На этом спотыкаются многие начинающие (и не только) программисты PHP.

Для понимания проблемы надо немного разбираться в работе протокола HTTP. Текущая версия протокола (1.1) описана в документе RFC2616.

Протокол работает по принципу "запрос - ответ". Браузер пользователя посылает запрос на сервер. Тот, в свою очередь, посылает браузеру ответ. И запрос, и ответ состоят из заголовка и следующих за ним данных (тело). Т.е. если данные уже начали отсылаться, то что-либо добавить в заголовок уже возможности нет. Куки как раз передаются в заголовке HTTP запросов и ответов.

Да же если Вы поместите блок <?php ?>, содержащий session_start() в самое начало файла, но перед ним будет пробел или перевод строки, то это тоже приведет к ошибке. Никаких символов перед блоком быть не должно!

Что же делать, если решение, использовать сессию или нет, принимается не в самом начале программы и перед ним возможен какой-либо вывод?

Выход простой - использовать буферизацию. В PHP буферизацией управляют функции начинающиеся на "ob_" (output buffering). В начале программы (до любого возможного вывода) следует поставить вызов ob_start(), а перед завершением программы (хотя бы после старта сессии) - ob_end_flush().

<?php

ob_start();

?>
<html>
 <head>
  <title>ob_start test</title>
 </head>
 <body>
<?

session_start();

// .... программа

ob_end_flush();

?>
 </body>
</html>

Кстати, при работе непосредственно с Куки и заголовками HTTP возникают те же самые проблемы и решаются они аналогично.

Вернемся к Куки и сессии...

Прочитать статью целиком можно на нашем сайте.

А теперь прощаемся с Вами до следующего выпуска.

                                        С уважением, команда Клуба.




В избранное