Разработчику. Сборник рецептов PHP
Задавайте вопросы

Отслеживание сеанса работы с сайтом

Вернуться назад

Задача

Необходимо сохранять информацию о пользователе во время его путешествия по сайту.

Решение

Для этого предназначен модуль сеанса. Функция session_start() инициализирует сеанс, а заведение элемента в глобальном массиве $_SESSION указывает PHP, чтобы он отслеживал соответствующую переменную.

session_start();
$_SESSION[' visits ']++;
print ' You have visited here ' .$_SESSION['visits']. ' times. ';

Обсуждение

Для того чтобы сеанс начинался автоматически при каждом обращении к сценариям сайта, надо установить опцию session.auto_start в 1 в файле php.ini. При этом отпадает необходимость в вызове функции session_start().

Функции сеанса отслеживают пользователей, посылая им cookies со случайно сгенерированным идентификатором сеанса. Если PHP определяет, что пользователь не принимает cookie с идентификатором сеанса, то он автоматически добавляет идентификатор в URL и формы.


До появления версии PHP 4.2.0 такое поведение разрешалось, только если PHP компилировался с опцией enable trans sid На самом деле все происходит наоборот: сначала PHP добавляет идентификатор сеанса и в cookie, и к URL/формам, а затем, если в URL идентификатор вернулся, а в cookie – нет, то таким образом PHP определяет, что cookies не поддерживаются. В любом случае такое поведение возможно, только если параметр session.use_trans_sid в php.ini установлен в 1. В противном случае сеансы просто не будут работать у пользователей с отключенными cookies.
Например, рассмотрим следующий код, который печатает URL:

print '<a href="train.php">Take the A Train';

Если сеансы разрешены, но пользователь не принимает cookies, то строка, посылаемая броузеру, может выглядеть примерно так:

<a href="train.php?PHPSESSID=2eb89f3344520d11969a79aea6bd2fdd">Take the A
Train

В этом примере имя сеанса PHPSESSID, а идентификатор сеанса равен eb89f3344520d11969a79aea6bd2fdd. PHP добавляет их к URL, и они вместе передаются следующей странице. Формы модифицируются так, чтобы включить скрытые элементы, которые передают идентификатор сеанса. Перенаправления в заголовках Location автоматически не модифицируются, поэтому необходимо добавить к ним идентификатор сеанса с помощью константы SID:

$redirect_url = ' http://www.example.com/airplane.php ';
if (defined(' SID ') && (! isset($_COOKIE[session_name()]))) {
     $redirect_url .= ' ? ' . SID;

}

header(" Location: $redirect_url ");

Функция session_name() возвращает имя cookie, в котором хранится идентификатор сеанса, поэтому данный код добавляет константу SID к переменной $redirect_url, только если константа определена, а cookie сеанса не установлен.

По умолчанию PHP хранит данные сеанса в файлах в каталоге /tmp на сервере. Каждый сеанс хранится в своем собственном файле. Для того чтобы изменить каталог, в который записываются файлы, установите значение конфигурационной опции session.save_path в файле php.ini, соответствующее новому каталогу. Для изменения каталогов можно также вызвать функцию session_save_path() с новым каталогом, но это надо делать перед обращением к любой переменной сеанса.

См. также

Документацию по функции session_start() на http://www.php.net/session-start, по функции session_save_path() на http://www.php.net/session-save-path; раздел «Sessions» в руководстве на http://www.php.net/session, описывающий модуль сеансов и его многочисленные параметры конфигурации, которые помогают управлять длительностью сеанса или способом их кэширования.

Вернуться назад

Рейтинг@Mail.ru

Яндекс.Метрика

Индекс цитирования


Рейтинг Сайтов ДОСКИ.РУ