РНР 5 в подлиннике

Страница 278 из 554


Гпава 29. Управление сессиями

561

II Если на сайт только-только зашли, обнуляем счетчик, if (!isset($_SESSION['count'])) $_SESSION[1 count'] =0; // Увеличиваем счетчик в сессии. $_SESSION['count'L = $_SESSION['count'] + 1;

<h2>Счетчик</h2>

В текущей сессии работы с браузером Вы открыли эту страницу

<?=$_SESSION['count']?> раз(а).<Ьг>

Закройте браузер, чтобы обнулить счетчик.<Ьг>

<а href="<?=S_SERVER[' SCRIPT_NAME' ] ?>" target="_biank">OTKpbiTb дочернее окно браузера</а>.

Как видите, все "крутится" вокруг массива $_session. Мы работаем с одним из его элементов, увеличивая его при каждом запуске скрипта на единицу.

Давайте немного поэкспериментируем с программой и выясним несколько важных особенностей работы сессий.

1. Попробуйте открыть скрипт из листинга 29.1 в браузере и несколько раз нажать кнопку Обновить. Вы увидите, что счетчик начнет увеличиваться. Но достаточно закрыть браузер и открыть новый, как цифра обнулится. Итак, данные сессии пропадают при закрытии браузера.

При закрытии браузера cookie, в котором хранится SID, пропадает (т. к. это односессион-ный cookie, "живущий" до закрытия окна). А значит, теряется связь с временным хранилищем, и данные сессии оказываются потерянными. При этом само хранилище может сразу и не уничтожиться (удаление происходит в фазе "чистки мусора"), но это не имеет значения. Ниже мы рассмотрим данный момент подробнее.

2. Попробуйте открыть другое, независимое, окно браузера, не закрывая первого. Поочередно нажимая кнопку Обновить в обоих окнах, вы увидите, что счетчики увеличиваются независимо друг от друга. Итак, данные сессии "привязаны" к окну браузера, а не к пользовательскому компьютеру.

Когда вы открыли два окна, то фактически стали, сточки зрения сервера, выглядеть, как два разных пользователя. И это неудивительно: при запуске сценария в независимом окне он загружает в cookies браузера новый SID. Именно SID определяет "привязку" хранилища сессии к браузеру пользователя.

3. Щелкните теперь на ссылке Открыть дочернее окно браузера, которую выводит наш скрипт. Откроется новый браузер (за счет target="_biank"), однако вы увидите, что счетчик не обнулился\ Более того, "накрутив" счетчик в новом окне и вернувшись к старому, вы увидите, что он и там тоже изменился в точности на ту же величину. Вывод: при открытии нового окна щелчком по ссылке на некоторой странице данные сессии совместно используются этим окном с его родителем.

Если новое окно открывается не отдельно, а при переходе по ссылке на некоторой странице, SID останется прежним — ведь cookies наследуются дочерними окнами. А значит, обоим окнам будут соответствовать одни и те же временные хранилища сессии.

562

Часть IV. Стандартные функции РНР

Уничтожение сессии

bool session_destroy()

Данная функция уничтожает хранилище сессии. При этом массив $_session не очищается] Чтобы полностью удалить сессию, вы должны выполнить следующую последовательность команд:

// Очистить данные сессии для текущего сценария. $_session = array ();

// Удалить cookie, соответствующую sid. Sunset($_cookie[session_name()]); // Уничтожить хранилище сессии. session_destroy();

Очистка хранилища сессии полезна тем, что начиная с этого момента все страницы, использующие то же самое хранилище, получат пустую сессию. Скрипты "логаута" (явного "выхода" с сайта; противоположность "логину" — авторизации) чаще всего используют данную последовательность команд.

До сих пор мы подразумевали, что использование сессий немыслимо без cookies. Действительно, cookies представляют собой наиболее элегантное и простое решение задачи идентификации каждого подключившегося пользователя, что необходимо для связи временного хранилища и данных сессии. Но как быть, если пользователи отключили cookies в своих браузерах?

К сожалению, пользователи отключают cookies гораздо чаще, чем это может показаться на первый взгляд. Например, несколько лет назад Всероссийский Клуб Веб-мастеров проводил опрос, в результате которого выяснилось, что количество пользователей Интернета, отключивших у себя по каким-то соображениям поддержку cookies, достигает 20—30%. Что это за соображения? Многие думают, что cookies потенциально являются "дырой" в безопасности их компьютера. Это совершенно не соответствует действительности, потому что браузеры всегда имеют ограничения на количество и суммарный объем cookies, которые могут быть в них установлены. Другие же просто не хотят, чтобы неизвестно кто писал что угодно на их жесткий диск. Правда, это не мешает таким "перестраховщикам" открывать пришедший по почте исполняемый файл — такой же, как из письма типа "Love letter"...

В общем, вы видите, что для абсолютной уверенности в работоспособности ваших сценариев на любом браузере нужен механизм, позволяющий отказаться от использования cookies при управлении сессиями. Такой механизм действительно существует в РНР, и основная его идея состоит в том, чтобы передавать идентификатор сессии не в cookies, а каким-нибудь аналогичным путем, например, в данных запроса get. Последнее мы сейчас и рассмотрим.

Сессии и cookies

Явное использование константы SID

В РНР существует одна специальная константа с именем sid. Она всегда содержит имя группы текущей сессии и ее идентификатор в формате имя= идентификатор.




  Hostland.Ru

 «Бесплатный хостинг Hostland.Su» © 2006