Примеры работы с сессиями PHP4 |
||||
---|---|---|---|---|
Передача идентификатора Двумя главами выше вы установили, что для нашей мечты нужно передавать идентификатор от отного вызова программы к другому. Давайте подумаем, какими способами можно что либо передать. В нашем случае мы установили, что надо передавать идентификатор сессии - строку из букв и цифр длиной 32 символа. Отвлекитись от всего и подумайте, как можно передавать какую-то строку от скрипта к скрипту. Способ 1: Cookies Это самый популярныи и работающий по умолчанию способ передачи идентификатора. Можно один раз поместить в куку переменную и все остальные скрипты будут ее получать. Если у пользователя куки включены, PHP сам поместит туда идентификатор и потом сам его от туда достанет. О том, как PHP узнает о включенности кук - в следующей главе. В этом способе в куках создается переменная с изветным именем (по-умолчанию: PHPSESSID) и значением идентификатора (например: ac4f4a45bdc893434c95dcaffb1c1811). Хорошо: куки (cookies) - это самый простой способ закрепить за посетителем какие-либо данные. Трудно стереть куку или изменить. Плохо: куки могут быть выключены. Зайдите на Спайлог да узнайте, каков % посетителей не смогут работать с вашим сайтом. Способ 2 - параметры параметры - http://php.spb.ru/test.php?PHPSESSID=ac4f4a45bdc893434c95dcaffb1c1811 Если вы будете дописывать все ваши ссылки подобным образом, то все ваши последующие скрипты получат идентификатор. PHP использует и данный метод по умолчанию (совмещая с куками, если те выключены). Т.е. PHP _сам_ применит либо куки, либо способ 2. PHP сам после работы вашей программы проанализирует ее страницу для браузера и позаменяет все ссылки так, чтобы дописать переменную PHPSESSID. Хорошо: 100% надежный способ. Легко передавать во всех ссылках номер сессии (это нагрузка, но она очень простая, поэтому - хорошо). Плохо: любой чайник может переделать номер сессии или удалить ее. Т.к. в принципе нет способа надежной привязки посетителя к номеру - беда небольшая. Злой сосед по компьютеру может украсть номер из URL (32 символа). Но если сделать URL подлиннее (test.php?_________....______&PHPSESSID=12345678), то сосед ничего не увидет. Строка "Адрес" в браузере не бесконечная :-)) Способ 3 PathInfo - http://php.spb.ru/test.php/ac4f4a45bdc893434c95dcaffb1c1811 Это основано на понимании Апачем того, где из этого URL путь к скрипту, а где параметры. Т.е. Апач распознает данный вызов, как обращение к файлу test.php и передаст любую произвольную строку в переменной $pathinfo=getenv("PATH_INFO") - так ее можно взять и получить от туда идентификатор запроса. Соответственно, чтобы передать управление в другой скрипт, надо подобным образом составить URL (GET-запрос) или передать форму GET или POST запросом. Хорошо: ничего хорошего. Плохо: трудно ссылаться на локальные скрипты и картинки. Чтобы все работало, придется в программах и тегах картинок использовать абсолютный путь на сервере. Способ 4 rewrite, виртуальный каталог - http://php.spb.ru/ac4f4a45bdc893434c95dcaffb1c1811/test.php С помощью стандартного модуля rewrite можно огранизовать подобного рода виртуальный каталог. Если написать произвольный путь - Апач возьмет скрипт test.php из фиксированного каталога. В скрипте придеться проанализировать переменную $url=getenv("REQUEST_URI"); и взять из нее идентификатор. Далее по нему PHP восстановит нужную сессию. Хорошо: все хорошо. Легко работать, в отличии от способа 3. Не нужно передать идентификатор - сам собой передастся. Плохо: ничего плохого. Немного надо написать и немного настроить rewrite. Чтобы позволить кешировать картинки, путь к ним надо писать обсолютный. Способ 5 DNS, виртуальный сервер - http://ac4f4a45bdc893434c95dcaffb1c1811.php.spb.ru/test.php Можно настроить DNS так, чтобы по любому подобному пути произошло бы обращение к вашему веб-серверу. В самом сервере с помощью алиаса "*.php.spb.ru" задать, что эти адреса принадлежат главному серверу php.spb.ru. Далее по описанной выше схеме из переменной $host=getenv("HTTP_HOST"); достаем идентификатор и передаем в PHP. После чего тот достает нужную сессию. Хорошо: все хорошо. Совсем ничего не надо делать, по сравнению с виртуальным каталогом. Плохо: злой сосед может срисовать номер сессии. И ее уже не запрятать за правый край строки "Адрес". Но это не страшно, т.к. ситуация со злым соседом весьма редкая. Чтобы позволить кешировать картинки, путь к ним надо писать обсолютный (ссылаясь на главное имя сервера). Способ 6 Фиктивный логин - http://[email protected]/test.php Зеркально похож на способ виртуального каталога. В прессе ранее не не упоминался :-) Придумался сам собой, пока писал эту стать. Хоть и не оригинальная идея, но реальная для использования. Для тех, кто не в курсе, URL состоят из следующего вида: название протокола (http) имя пользователя (логин) пароль имя сервера порт путь к скрипту, минимум - содержит "/" якорь на странице (read.html#якорь) Получается - http://логин:пароль@ИмяСервера:порт/путь#якорь. Если пароль не указывают, получается http://логин@сервер, где слово логин может быть любым. К примеру, на этом основаны регулярно появляющиеся шутки, где пишут разные приколы, подделав дизайн под нужный сайт. Есть и полезное свойтво - если чайник от незнания напишет в браузере адрес [email protected], то он попадет на главную страницу почтовой системы. Еще можно простараться впихать идентификтаор в якорь, только это не имеет смылса, т.к. способ ничем не отличается от "способа 2". Промежуточный итог, характеристика сессий В самом начале мы описали персональную область данных, которой так нехватает веб-программисту, чтобы хранить что либо. Далее, мы установили, что PHP надо только сообщить названия переменных. После этого ПХП присвоит всем посетителям идентификаторы (число 128 бит), которое невозможно подделать, откроет на диске файл, названный аналогично номеру сессии для хранения информации. Данные там запаковыны с помощью функции сериализации, т.е. наипростейшим способом. Чтобы наш сайт успешно работал, мы должны позаботиться о передаче идентификатора от запроса к запросу. Делать это можно разными путями. БОльшую часть работы ПХП делает сам. И так, после вводной части (наша мечта -> реальность с четкими задачами) посмотрим, что проиход по умолчанию. |