Статья
Версия для печати
Обсудить на форуме
Сессии PHP. Часть 1.


Введение.

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

Сессии PHP. Механизм идентификации сессии.

Когда мы посещаем сайты, часто ли задумывается мы, как серверная программа помнит такие вещи, как введенный логин, какие сообщения мы еще не читали, какие товары мы положили в "корзину покупателя" и т.п.? Посетителю сайта нет необходимости знать это, а web-программисту эти знания лишними не будут.
Работает этот механизм просто, но в то же время довольно сложно.
Серверная программа запоминает переданные пользователем данные в сессии (сеансе) и достает их оттуда при следующем обращении на сервер. Но пользователей, работающих с одним сайтом, может быть несколько и для того, чтобы понять, где чья сессия, нужен какой-либо механизм идентификации. Так как же точно идентифицировать данную сессию?
Первое, что приходит на ум - использовать для этого IP-адрес компьютера пользователя. Вполне возможно, что на заре web-программирования так и делали, но с одного IP-адреса могут посылать запросы несколько пользователей. Например, если они работают через один proxy-сервер, или находятся в одной локальной сети и выходят в Интернет через NAT-шлюз, назначающий им один и тот же внешний IP-адрес. Да и за время посещения сайта адрес пользователя может поменяться (например, при восстановлении прерванного модемного соединения). Т.е., механизм этот не надежен.
Выход только один - пользователь должен сам передавать свой идентификатор, сообщенный ему сервером.
Идентификатор сессии можно передавать в строке параметров URL. Многие сайты так и делают (обычно это используется как дублирующий механизм). Но у этого метода есть большой недостаток. Если вам захочется, к примеру, послать такую ссылку другу, и он зайдет по ней на сайт, то он может внедрится в вашу сессию. Выходит, этот механизм тоже не без изъяна.
Для решения этой задачи компанией Netscape была придумана и внедрена в созданный ею браузер возможность запоминать специальные данные, переданные сервером, на компьютере пользователя. При следующем обращении на сервер браузер отсылает эти данные назад, и серверная программа идентифицирует по ним пользователя. Назвали они этот механизм Куки (cookie - печение). Позже Miscosoft реализовала Куки в InternetExpoler. Сегодня Куки поддерживаются всеми современными браузерами.
Этот механизм тоже имеет недостатки: пользователь может запретить своему браузеру работать с Куки или неправильно настроенный proxy-сервер может их удалять из запроса. Но, если не заниматься такой, извиняюсь, ерундой, механизм Куки выглядит более надежным и безопасным, чем идентификация по IP и параметрам URL.
Работу сессии PHP можно продемонстрировать на таком примере:

Код: (PHP)
<?php
session_start(); // запускаем механизм сессии

// PHP проверяет существование сессии
// Если ее нет, то она будет автоматически создана (пустая - без данных)
// Если она уже есть, то данные помещаются в массив $_SESSION

if (isset($_POST['name'])) // пользователь прислал свое имя
{
        $_SESSION['name'] = $_POST['name'];
        echo "Здравствуйте, " . $_SESSION['name'] . "!";
}
else if (isset($_SESSION['name'])) // не прислал, но мы помним его
{
        echo "А я вас узнал. Вы - " . $_SESSION['name'] . "!";
}
else // кто он - этот пользователь?
{
        echo '<form method="post">';
        echo 'Назовите себя:';
        echo '<input type="text" name="name" />';
        echo '<input type="submit" value="Сообщить" />';
        echo '</form>';
}

// По завершению программы содержимое массива $_SESSION автоматически
//  сохраняется в хранилище сессии.
?>

Вот так вот просто работает. Пока просто. ;)
Продолжение - в следующей статье.

Роман Чернышов (RXL) 24.03.2006
Версия для печати
Обсудить на форуме