Задача
Необходимо сохранять информацию о пользователе во время его путешествия по сайту.
Решение
Для этого предназначен модуль сеанса. Функция 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 и формы.1,2
Например, рассмотрим следующий код, который печатает URL:
print 'Take the A Train';
Если сеансы разрешены, но пользователь не принимает cookies, то строка, посылаемая броузеру, может выглядеть примерно так:
Take the A
Train
В этом примере имя сеанса PHPSESSID, а идентификатор сеанса равен 2eb89f3344520d11969a79aea6bd2fdd. 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() с новым каталогом, но это надо делать перед обращением к любой переменной сеанса.