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

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


Параметры и функции для сессий

В данной главе приведено описаний сессий - это ФУНКЦИИ и одноименные НАСТРОЙКИ в php.ini или .htaccess. Функции от настроек отличаются тем, что у первых есть скобочки - функция(). Для тех, кто не в курсе. Вы можете настраивать сессии, задавая разные параметры в php.ini, httpd.conf или .htaccess файлах. В php.ini все переменные уже написаны и содержат какие-либо значения (их называют глобальными настройками), с помощью httpd.conf или .htaccess можно указать для какого-либо виртуального сервера или отдельного каталога локальные настройки ПХП. Для этого используют строку php_value Имя Значение. Обратите внимание, что использовать настройки можно только если ваш ПХП является модулем Апача. В противном случае (ПХП - не модуль, а отдельная CGI-программа) такая строка в .htaccess вызовет ошибку, как и любая неправильная строка. session_start() Запустить поддержку сессий в скрипте. Данная функция подробно была описана выше.

Функцию можно не использовать, т.к. первая же session_register("НазваниеПеременнной") запустит сессии.

session_destroy() уничтожит: все данные, хранящиеся в сессии; файл, отведенный для данных; переменные в программе и идентификатор посетителя. Функция отменяет действие session_start(). Вызывать нужно после вызова session_start(). Можно применять, чтобы уничтожать сессиию пользователя, а потом сразу вызывать в программе второй раз session_start(), получиться совершенно новый посетитель с новым идентификатором и чистой сессией. session_name(), session.name, PHPSESSID: ПХП для хранения идентификатора использует какую-то переменную. В куку записывают переменную: значение переменной - идентификатор, название переменной - PHPSESSID. PHPSESSID - это название, которое используют по-умолчанию. Я рекомендую переименовать ее во что-либо короткое, например SID. А для этого надо заменить параметр session.name на значение SID: можно заменить php.ini: session.name = SID; можно создать .htaccess файл в каталоге со скриптами вашего сайта и поместить строку php_value session.name SID. После такого переименования получится, что константа SID содержит строку "SID=номер_сессии" (echo SID;), а переменная $SID только сам номер (echo $SID;). Для тех, кто не в курсе, константы в ПХП используют без символа доллара.

Чтобы получить название переменной, которую используют для хранения идентификатора, что в свою очередь происходит из-за настроек, надо воспользоваться функцией без параметра $name=session_name().

Чтобы установить такую переменную в произвольное название, воспользуйтесь функцией с параметром session_name("МоеНазвание"). Разумеется, если вам почему-то понадобилось изменить имя переменной для кук с помощью этой функции, то ее надо вызывать перед session_start() или session_register(), иначе, как не трудно догадаться, будет поздно что-либо менять. К тому же, вы должны будете использовать эту функцию во всех своих скриптах, где требуется заменить "PHPSESSID" на "МоеНазвание".

session_module_name(), session.save_handler: получить или установить текущий модуль сессии. ПХП может хранить сессии разном виде. По умолчанию - в файлах. См. так же session_set_save_handler().

session_save_path(), session.save_path: получить или установить каталог, в котором будут храниться файлы сессии. $path=session_save_path() - получить. session_save_path("/mydir/temp"); - установить. Параметр session.save_path можно задавать в php.ini или .htaccess.

session_id() - получить или установить идентификатор посетителя (128-битное число, представленное в виде строки в 32 байта). В нормальных условиях вам не нужно устанавливать номер сессии. Но если вы хотите для всех своих посетителей использовать одну сессиию, то перед session_start() придумайте любое имя (произвольная строка) - session_id("dima"); или получите настоящий идентификатор другим образом. Вызов функции без параметров вернет вам текущий номер сессии (в таком случае - вызвать после session_start()).

session_register() - зарегистрировать одну или несколько переменных. Передавать надо имена переменных, а не сами переменные: session_register("переменная1", "переменная2", ...). Сама функция подробна описана выше.

session_unregister() - выполнить обратное действие: удалить из сессии необходимую переменную. Можно передать только одно имя переменной за один вызов функции.

session_unset() - очистить все переменные сессии. В отличие от session_destroy(), сессия и идентификатор остаются.

session_is_registered() - проверить, зарегистрирована какая-либо переменная в текущей сессии или нет:

if (session_is_registered("МояПеременная")) ...

session_get_cookie_params() и session_set_cookie_params() - получить информацию о куке, хранящей переемнную с идентификатором сессии.

echo "<pre>SESSION INFO:\n"; print_r(session_get_cookie_params());

Так можно узнать о времени жизни переменной, домене и пути куки. session_set_cookie_params() - соотвественно, переустановить параметры (хотя все эти параметры надо задавать в php.ini - см. ниже).

session_decode() и session_encode() - раскодировать закодированную строку в сессию и получить закодированную строку сессии.

session_set_save_handler() - возможно, вас не усраивают варианты хранения сессий, предлагающихся в ПХП. Может быть вы хотите хранить сессии в простых текстовых файлах, чтобы их можно было легко редактировать; тогда вам нужно создать несколько функций, отвечающих за функционирование сессий и передать названия этих функций в session_set_save_handler() (чтобы пропустить какой либо параметр, передавайте пустую строку - ""). Если вы пишете что-то нестандарное, вам будет полезна фукнция. Описывать ее не буду, т.к. не использовал, да и в мануале есть полное описание и пример.

session.auto_start - по умолчанию равно 0, сессии автоматически не запускаются; если равно 1, то session_start() писать в начале каждого скрипта не нужно.

session.cookie_lifetime - если равно 0 (по-умолчанию), то кука, хранящяя сессию, будет уничтожена на компьютере посетителя, как только он закроет все окошки браузера. Если не ноль, то это задает число секунд для хранения куки.

session.gc_maxlifetime - количество секунд, через которое ПХП уничтожит у себя на диске устаревший файл сессии. По умолчанию - 1440. Это произойдет НЕ РАНЕЕ количества секунд, указанного в переменной. Данное время определяет нижнюю гланицу (НЕ РАНЕЕ), когда файл становится кандидатом на удаление. Верхняя граница определяется следующей переменной. Время отсчитывается от последнеого обращения посетителя т.е. это время доступа к файлу, а не создания. У любого файла есть время создания, модификации (запись) и доступа (чтение).

session.gc_probability - число от 1 до 100, измеряемое в процентах (по умолчанию - 1, т.е. 1%), которое задает вероятность запуска механизма удаления старых файлов сессии. Другими словами, при каждом обращении посетителей к любой программе вашего сайта, использущей сессии, с вероятностью 1% произойдет поиск и удаление устаревших файлов сессии. Таким образом, по-умолчанию, вы на должны опасаться, что на сервере скопится огромное число мусора, и вам придется писать программу для его сбора. Только укажите желаемую частоту сбора. Не рекомендуется устанавливать 100%, т.к. ПХП будет при каждом обращении пользователя искать старые файла, что создаст лишнюю нагрузку. Разумный максимум для данной переменной - 5%, хотя лучше оставить как есть - 1%.

session.use_cookies - использовать ли куки, для хранения идентификатора сессий или нет. По умолчанию - 1, можно использовать. Если равно 0, то ПХП ничего в куки записывать не будет, а будет пытаться все время автозаменять URL и формы.

session.cookie_path - если на вашем сайте используется несколько разных программ (у каждой свои сессии) и вы не хотите, чтобы сессии случайно пересекались, то установить нужный путь для кук. Если установить session.cookie_path /programm1, то все ваши программы, расположенные в каталоге pogramm1 или его подкаталогах, будут иметь одно общее пространство для кук, что равносильно одной и тожей сессии. Если посетитель после каталога /programm1 зайдет в /programm2 (для которого тоже заведены отдельные куки), то он будт идентифицирован новой программой по-новому. Если у вас на сайте всего одна программа или много программ, но на разных названиях серверов, то куки/сессии никак не пересекутся.

session.cookie_domain - из той же области, что и предыдущая переменная. Для полного понимания ее работы читайте о куках. Такой документации на русском языке очень много.