Примеры работы с сессиями PHP4

Автор статьи: OneZero
Сайт Автора: getinfo.ru
E-mail Автора: нет
Дата публикации: 11.11.2005




Что происходит по умолчанию

Читайте данную главу особенно внимательно, здесь описано поведение ПХП по умолчанию и что требуется от программера в особых случаях (если куки у посетителя отключены, но юзать сессии хочеться). Поведение ПХП при нестандарных параметрах описано ниже.

Представьте, посетитель обратился к одной из страниц вашего сайта. ПХП прочел файлы конфигурации. Интерпретатор ПХП начинает выполнять ПХП-файл. Если он там не встретит команду 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").