Страницы:
0 1 2 3 4 |Все сразу|
Что происходит по умолчанию
Читайте данную главу особенно внимательно, здесь описано поведение
ПХП по умолчанию и что требуется от программера в особых случаях
(если куки у посетителя отключены, но юзать сессии хочеться). Поведение
ПХП при нестандарных параметрах описано ниже.
Представьте, посетитель обратился к одной из страниц вашего сайта.
ПХП прочел файлы конфигурации. Интерпретатор ПХП начинает выполнять
ПХП-файл. Если он там не встретит команду 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").
Страницы:
0 1 2 3 4 |Все сразу|