РНР 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. Она всегда содержит имя группы текущей сессии и ее идентификатор в формате имя= идентификатор. |
| |
|
В начало ←предыдущая следующая→ ... 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 ... | ||