Примеры работы с сессиями PHP4 |
||||
---|---|---|---|---|
Что происходит по умолчанию Читайте данную главу особенно внимательно, здесь описано поведение ПХП по умолчанию и что требуется от программера в особых случаях (если куки у посетителя отключены, но юзать сессии хочеться). Поведение ПХП при нестандарных параметрах описано ниже. Представьте, посетитель обратился к одной из страниц вашего сайта. ПХП прочел файлы конфигурации. Интерпретатор ПХП начинает выполнять ПХП-файл. Если он там не встретит команду session_register() или session_start() , то никакие сессии работать не будут. Если бы ПХП обнаружил параметр настройки session.auto_start равный 1, то сессии стартовали бы без нашей команды (по умолчанию данный параметр содержит 0 - выключено). В нашей программе (мы работаем с сессиями) эти строчки будут одними из первых, что обработаются ПХП-процессором. Поэтому можно считать, что поддержка сессии запуститься при старте скрипта. Что входит в понятие запуск сессий. ПХП пытается выяснить, новый это посетитель или нет. Если новый - надо выдать ему новое случаное число и создать файл под хранение сесии, если старый - взять его идентификатор и извлеть из соответствуюего файла переменные сессии. Возможно, посетитель будет иметь номер несуществующей сессии. Тогда он приравнивается к новому посетителю. Алгоритм извлечения идентификатора. Из настроек сервера известно, что имя переменной, хранящей идентификатор - PHPSESSID (можно задать произвольное). Если идентификатор будет найден в куках, то пользователь считается идентифицированным и использующи куки: повторно кука не устанавливается, URL не подвергаются автозамене (о автозамене чуть ниже). Если идентификатор найден в URL (GET-запрос) или в POST-запросе и не найден в куках, то пользователь считается идентифицированным и не использующем куки: кука выставлятся (на всякий случай), URL проходят автозамену, чтобы вставить в них идентификатор. Если идентификатор не найден ни в куках, ни в URL, то пользователь считается новым, используется ли он куки - не известно, происходит выделение нового случайного идетификатора и установка в куки, автозамена всех URL. Таким образом, можно определить поведение ПХП. При первом визите человека на ваш сайт ПХП не находит идентификатора; он устанавливает куку и производит автозамену всех URL и форм. При втором и последующем обращениях, если у человека включены куки, то ПХП будет каждый раз получать идентификатор из кук и соответветственно не будет производить повторной установки куки или автозаменять URL. Если при повторном посещении ПХП обнаружит идентификатор только в URL, то ПХП будет и далее пытаться установить куку и производить автозамену. Все это следует из приведенных выше 3-х правил. Алгоритм установки кук. После завершения первого алгоритма получается, что все пользователи становятся идентифицированными с каким-то номером - старым или новым. Если в предыдущей проверке выполнились 2 или 3 варианты, по ПХП устанавливает куку. Если выполнился вариант 1 - кука повторно не отсылается. Вы скорее всего когда либо работали с куками и знаете, что устанавить их можно только до вывода на экран какого-либо текста. Поэтому и надо писать команду session_start() в самом начале программы. Хотя, можно применить буферизацию вывода установив output_buffering в on. Тогда вы сможете стартовать сессии в любом месте программы, ставить куки и писать где угодно информацию в заголовок страницы (с помощью функции Header()). Алгоритм автозамены всех ссылок и форм. После того, как ПХП-программа закончит работу и до вывода результата браузеру, происходит автозамена ссылок. Вернее, ПХП решает, нужно ли ее производить. Если из вышеприведенных 3-х вариантов срабатывают 2-й или 3-й (либо посетитель новый, либо у него намерянно отключены куки), то ПХП производит автозамену. Автозамена всех ссылок такого типа: БЫЛО: <a href=test.php?a=1&name=Dima>click here</a> СТАЛО: <a href=test.php?a=1&name=Dima&PHPSESSID=ac4f4a45bdccaffb1c1811>click here</a> Подобным образом ПХП пытается вставить идетификаторы во все формы GET или POST запроса: БЫЛО: <form action=test.php> Имя: <input type=text name=nick value='$nick'> <input type=submit> </form> СТАЛО: <form action=test.php?PHPSESSID=ac4f4a45bdc893434c95dcaffb1c1811> <input type=hidden name=PHPSESSID value='ac4f4a45bdc893434c95dcaffb1c1811'> Имя: <input type=text name=nick value='$nick'> <input type=submit> </form> Данная автозамена происходит без вашего участия, ПХП сам решает когда нужно заменять и сам пытается встроить идетификатор посетителя, чтобы не потерять его. Таким образом, если вы будете делать нормальные страницы, содержащие ссылки и формы, ПХП постарается все позаменять. Однако, если вы постараесь ему помешать, например, вставляя HTML-теги с помощью функции javascript:document.write(), то ПХП явно не станет анализировать эти скрипты. Короче говоря, ПХП не гарантирует вам 100% замены всех ссылок и форм, но работает он очень хорошо. Чтобы автоматичиская замена URL работала, убедитесь, что ПХП скомпилирован с опцией --enable-trans-id. Если на вашем сайте не поисходит автозамены - перекомпилируйте свой ПХП. Обычно ПХП компилируют с минимальным количеством параметров и указанного паратра там нет. Если ваш сервер очень нагружен, по подумайте, стоит ли вообще включать автозамену URL (скорее всего вы можете себе это позволить, т.к. на подовляющем большинстве серверов процессор в среднем загружен только на 5-10%). Обратите внимание, что все связанное с автозаменой нужно только для пользователей с отключеными куками. Поэтому, если вы не хотите рассматривать вариант отключенных кук, соотвественно вам не нужен режим автозамены. Если вы хотите поддерживать работу сайта с отключенными куками но не хотите, чтобы ПХП автоматически заменял ссылки и формы, либо если ПХП на какой-то конкретной ссылке/форме глючит и не вставляет идентификатор, проделывайте это вручную. Это очень просто. Для начала отпределим новую константу SIDFORM (после session_start()): define ("SIDFORM","<input type=hidden name=".session_name()." value=".session_id().">"); Представим, что у нас есть ссылки и формы (еще бывают фреймы и теги типа AREA, но там делают аналогично). С помощью двух констант SID - определена в ПХП и SIDFORM - придумали сами себе, переработаем текст: ------------------БЫЛО (ПХП-файл)------------------ <html><body> Ссылка: <a href=test.php?a=1>click here</a> ... Форма: <form action=test.php> ... ... ... </form> ------------------МЫ ЗАМЕНЯЕМ НА (новая версия ПХП-файла)------------------ <html><body> Ссылка: <a href=test.php?a=1&<?=SID?>>click here</a> Форма: <form action=test.php> <?=SIDFORM?> ... ... ... </form> ------------------РЕЗУЛЬТАТ ВЫПОЛНЕНИЯ (это получит браузер)------------------ <html><body> Ссылка: <a href=test.php?a=1&PHPSESSID=ac4f4a45bdc893434c95dcaffb1c1811>click here</a> Форма: <form action=test.php> <input type="text" name="PHPSESSID" value="ac4f4a45bdc893434c95dcaffb1c1811"> ... ... ... </form> Тоже самое будет и в ПХП-варианте: echo "<a href=test.php?e=2>click here</a>"; надо заменить на echo "<a href=test.php?e=2&".SID.">click here</a>"; Обратите внимание, что SID - это константа. И если вы хотите иметь переменную $SID, то просто напишите в начале программы $SID=SID; (после старта сессий). Итак, подведем итог автозамене. Если вы не хотите вставлять идентификаторы - полагайтесь на ПХП, который постарается все ссылки заменить. Если вы хотите 100% надежность того, что все смогут использовать ваш сайт и ни один пользователь ни на одной старнице случайно не потеряет сессию, то прибавляйте к каждой форме и ссылке по небольшой константе (их можно названить очень коротко, типа "X" и "Y"). |