Работа с сессиями в PHP. Как задается время их жизни?

работа с сессиями в php. как задается время их жизни?

Проблемы альтернативных подходов

HTTP-протокол не позволяет явным образом передавать какие-либо данные между запросами. Поэтому его называют протоколом без сохранения состояния. Принцип работы HTTP в общих чертах довольно прост. Клиент посылает запрос, а сервер обрабатывает его и формирует ответ. После отправки сервер «забывает» о клиенте.

Из урока по использованию cookie мы узнали, что данные можно записывать в браузере пользователя и передавать на сервер с каждым запросом. Такой подход позволяет сделать ресурс более отзывчивым. Например, пользователь осуществляет поиск товара через специальную форму. Параметры поиска записываются в cookie. При последующих загрузках этой страницы будут показаны результаты предыдущих поисков за счет использования настроек формы из cookie.

Также в PHP существует масса других способов решения этой задачи. Среди них особенно выделяется запись в оперативную память за счет memcached. Однако стоит отметить, что подавляющее большинство остальных решений довольно «грязные». Мы настоятельно рекомендуем использовать для передачи информации между запросами cookie или сессии, рассматриваемые далее.

Заметка
Работа с cookie имеет один большой минус. Информация хранится на стороне клиента в незашифрованном виде. Если вы запишете важные сведения (номер кредитной карты, личные данные и т.п) в браузере, то поставите пользователя под удар. Существует масса способов, с помощью которых злоумышленники могут извлечь эти данные с локального диска.

Принцип работы сессий

Сессии в PHP, также именуемые сеансами, являются ни чем иным как файлами. Для каждого уникального пользователя в специальной директории на сервере создается файл. Именно в него будут записываться произвольные данные, сгенерированные вашими скриптами. Место расположения этих файлов определяется опцией session.save_path в конфигурационном файле php.ini.

Вы не должны пытаться получить доступ к этим файлам с помощью стандартных файловых операций. PHP делает работу с сессиями прозрачной за счет суперглобального массива $_SESSION. Все данные, записываемые в него, будут доступны в любом запросе пользователя.

PHP привязывает конкретного пользователя к файлу на сервере с помощью установки специальной cookie. Она записывается в браузер пользователя автоматически после вызова функции session_start(). Старт сессии должен быть осуществлен до вывода любой информации, так как эта операция влечет за собой установку заголовков ответа. Если вы используете буферизацию вывода, session_start() может быть вызвана в любом месте.

//простой пример использования сессий для сохранения данных
session_start();

//каждая перезагрузка страницы будет увеличивать счетчик
$_SESSION['counter']++;

switch ($_SESSION['counter']) {
    case 1:
        $_SESSION['message'] = 'Сессии работают замечательно!';
        break;

    case 10:
        $_SESSION['message'] = 'Лимит загрузок исчерпан!';
        break;
}

//на десятую перезагрузку сообщение изменится
echo "Текущее значение счетчика: {$_SESSION['counter']}<br>";
echo $_SESSION['message'];

Такой механизм позволяет защитить данные от несанкционированного доступа на стороне клиента. Вся информация хранится на сервере, а связь пользователя с данными устанавливается за счет уникального идентификатора, записанного в cookie.

Важно
Пользователь может отключить поддержку cookie. Это сделает невозможным запись идентификатора сессии в браузере. PHP имеет решение и на этот случай. Установка параметра session.use_only_cookies конфигурационного файла php.ini в значение off будет добавлять идентификатор сессии прямо в строку запроса. Например, http://test-site/news?PHPSESSID=45bbfc0293aacdc0f9910bac3fcd5738.

Мы рекомендуем устанавливать опцию session.use_only_cookies в значение on. Это запретит работу с сессиями при отключенной поддержке cookie. Передача идентификатора в URL чревато проблемами с безопасностью. Если пользователь скопирует такую ссылку и поделится ей с кем-нибудь, другой человек прошедший по ней получит доступ к сессии. К тому же отключение cookie очень редкое явление.

Время жизни сессии

По умолчанию сессия перестает существовать после закрытия браузера. Это происходит за счет того, что идентификатор, записанный в cookie, затирается и установить дальнейшую связь с файлом на сервере становится невозможно. Пока пользователь взаимодействует с ресурсом, время жизни сессии ничем не ограничена.

Файлы, потерявшие связь с браузером, автоматически удалятся встроенным в PHP механизмом «сборки мусора». Однако существует возможность повлиять на время жизни сессии за счет опции session.gc_maxlifetime конфигурационного файла php.ini. Она устанавливает количество секунд, по истечению которых, файл сессии помечается для удаления. Если пользователь не будет проявлять активности на сайте в течение этого времени, его сессия уничтожится.

Последние публикации