Как сделать сессию

Обновлено: 04.07.2024

Почти на каждом сайте, на котором есть хоть какая-то интерактивность (регистрация, форма заказа и т.п.), используется такой способ хранение данных о посетителе, как сессии. Сессия - это механизм, который позволяет однозначно идентифицировать посетителя и хранить данные, которые связаны с ним.

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

Создание сессии и работа с ней

Давайте попробуем инициализировать (начать) PHP сессию и записать в неё какие-нибудь данные. Для этого воспользуемся функцией с говорящим названием session_start. А затем запишем в сессию какие-нибудь данные: '; ?>

Переменная $_SESSION является массивом. Если интересно, что в ней находится, то всегда можно распечатать этот массив через print_r. Результат выполнения кода из примера выше будет таким: Чтение значений массива $_SESSION происходит точно также, как и чтение элементов любого другого массива.

Сессии - это удобный инструмент, потому что данные сохраняются вне зависимости от загрузки страницы сайта. Приведём простейший пример, демонстрирующий это. Сделаем скрипт, который считает, сколько раз была перезагружена страница с кодом: Теперь перезагрузим страницу с этим скриптом и увидим, как счётчик увеличивает своё значение.

Чтобы удалить данные, записанные в $_SESSION, используйте те же механизмы, которые используете для массивов, то есть:

Длительность сессии

Длительность хранения данных в сессии зависит от настроек PHP. Обычно составляет примерно 30 минут. Вы можете самостоятельно проверить длительность, получив его из настроек PHP командой: В результате выполнения этого кода, будет выведена длительность времени жизни сессии в секундах. После окончания этого времени сессия и все данные будут удалены.

Вы можете увеличить время жизни сессии, установив значение gc_maxlifetime в настройках PHP или прописав "php_value session.gc_maxlifetime количество_секунд" в файле .htaccessхостингах.

Файлы сессий

В настройках Apache при создании задаётся путь к директории, которой будут хранится сессии сайта. Эта директория может быть похожа на /tmp/php_sessions/ваш_домен/ . Если на сайте существует функционал сессий, то можно перейти в эту директорию и обнаружить там файлы. В этих файлах будут находиться сериализованные данные всех сессий и все значения, которые записывались в сессию. Эти файлы постепенно удаляются по мере истечения срока жизни сессий.

Завершение сессии

Если сессия не нужна, то необходимо закончить её. Эта задача обычно повялется в случае, если пользователь выходит из своей учётной записи на сайте. Тогда поможет функция session_destroy: После выполнения этого кода сессия будет закрыта.

По умолчанию это выглядит вот так:

Клиенту устанавливается кука PHPSESSID, значение которой - идентификатор сессии клиента. Обычно это строка примерно такого вида - " cmcjeagp3289oga05a2nw3qga6 "

На сервере к этому идентификатору привязывается место, в котором хранятся данные именно этого клиента.

Имя куки, которую устанавливает php можно изменить в параметре session.name в php.ini:

или с помощью ini_set:

или с помощью вызова session_name:

Когда на сервер приходит запрос от клиента, то браузер всегда передает все необходимые куки. Таким образом, когда php получает запрос, он "узнает" клиента по куке и теперь данные его сессии доступны внутри глобальной переменной-массива $_SESSION.

В PHP-сессии по умолчанию выключены и для их включения необходимо вызывать session_start(), либо настроить в php.ini автозапуск сессий:

Если session.auto_start выключен, то массив $_SESSION не будет связан с конкретной сессий до вызова session_start(). Поэтому не забывайте запускать session_start() в самом начале работы, до выполнения какой-либо логики.

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

За это отвечает настройка session.save_handler и ее уточняющая настройка session.save_path. Если установить на сервер расширение php-memcached будут доступны следующие варианты для session.save_handler:

"files" - хранить сессии в файлах. В session.save_path заполняется путь к директории, в которой будут хранится сессии

"memcached" - хранить сессии на сервере memcached. В session.save_path указывается строка подключения к серверу, например: "127.0.0.1:11211". Подробнее это описано здесь

Собственно, в случае memcached ключ образуется из идентификатора сессии, а в случае работы с файлами, имя файла составляется из идентификатора.

Рабочий пример

Как пользоваться сессиями на простом и рабочем примере:

Если обращаться к этому файлу в браузере, будут вот такие ответы:

Следующий ответ после F5:

Следующий ответ после F5:

Можно посмотреть на имена кук и поиграть с этим руками:

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

Сессии это инструмент для управления состоянием приложения.

Как и $_COOKIE $_SESSION это суперглобальная переменная ( массив ) , которая хранится на веб сервере.

У каждой сессии есть уникальный номер Session ID или SID

Сессия должна быть начата до отправки данных браузеру.

Данные на сервере и куки в браузере работают в связке. SID хранится в куки.

Сессия удаляется автоматически при закрытии браузера. рассмотрим эти задачи в следующем параграфе

Что можно сделать с помощью сессий

  • Хранить данные о пользователях на сервере. Это безопаснее чем куки. Данные хранятся в файлах или в Базе Данных
  • Данные, которые часто используются, можно сохранить в сессии. Тогда обращаться к ним будет быстрее чем к базе данных.
  • Хранить неограниченное количество информации. Нет лимита в 4KB как у куки.
  • Сессии не отправляют одну и ту же информацию по кругу как куки - меньше размер запроса.

Пример

Из обычной жизни: когда вы получаете счёт за электричество, там содержится много разной информации. Но чтобы оплатить его, нужен только номер счёта. Вводите номер счёта и всё остальное подтянется с сервера.

Пример запроса от клиента

Рекомендуется отпрвлять Session ID с сервера в виде куки. Другой вариант: Session ID можно передать в URL параметре.

Запрос к другой странице будет уже с SID

Примерно таким образом куки позволяют запоминать пользовательские настройки

Где настраивать сессии

Настроек более 40, способов их задавать тоже несколько.

Первое место, где можно задавать настройки сессий это файл php.ini .

С помощью php.ini можно изменить настройки для всего PHP сервера.

Возможно, вы уже пользовались .htaccess для перенаправления запросов

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

Session Configurations Options

session.auto_start: автоматически начинает сессию.

По умолчанию выключена.

session.name: задаёт имя текущей сессии и сессионной куки

По умолчанию PHPSESSID.

Может быть изменено с помощью функции session_name()

session.save_path: путь по которому сохраняется информация о сессии

По умолчанию tmp директория сервера.

session.gc_maxlifetime: максимальное время жизни

По умолчанию 1440 секунд (24 минуты).

session.cookie_lifetime: время жизни куки, которая отправляется браузеру. По сути это значение, которое мы добавляем к time() когда задаём expires

session.cookie_path: задаёт cookie path

По умолчанию выключена.

По умолчанию выключена.

По умолчанию выключена.

По умолчанию включена.

По умолчанию включена.

Если включить - SID будет добавляться как параметр прямо в URL. Например:

По умолчанию выключена.

Пользуйтесь trans sid с осторожностью так как это может поставить под угрозу безопасность пользователя.

session.cache_limiter: указывает способ контроля за кэшем во время сессии.

  • nocache
  • private
  • private_no_expire
  • public

По умолчанию nocache.

Для сессий с аутентификацией нужно, чтобы кэширование в браузере было отключено.

session.cookie_samesite: контролирует доступности куки в кроссдоменных запросах.

Доступные варианты: Lax и Strict

Кросдоменные запросы могу быть не только от злоумышленников. Их может делать ваш сайт с разных поддоменов. Либо вы можете следить за перемешением пользователя между своими проектами.

Функции

session_start(): начинает сессию и делает доступной переменную $_SESSION.

session_name(): переименовывает сессию.

Меняет значение, заданное с помощью функции session.name.

session_id(): получает или устанавливает текущий session id

set new session ID: session_id(' ')

session_destroy(): удаляет всю информацию записанную в сессию

Пример .htaccess

Настройки вашего сервера могут отличаться, это просто пример

Инициализация сессии

Сессия начинается с помощью функции session_start()

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

Сперва выполняет проверку наличия активной сессии. Если сессии нет - начинает новую.

Сохраняет данные в супер глобальной переменной $_SESSION, которая является массивом

session_start() ; $_SESSION ['username'] = 'Andrei'; echo isset ( $_SESSION ['username']) ? $_SESSION ['username'] : 'Not available';

Если последняя строка вам непонятна - прочитайте статью

Демонстрацию работы session_start() в вашем браузере вы можете сделать на этой странице

Посмотреть куки можно в Chrome DevTools → Application → Cookies

Изучить файл с данными о сессии можно в директории, которую вы указали в php_value session.save_path

php_value session.save_path ./tmp

Поэтому я смотрю содержимое там

Удаление сессии

Сессия истекает когда закрывается браузер, наступает таймаут, её явно делают просроченной.

Если не удалить данные, они так и будут лежать на сервере - это небезопасно.

Уничтожение сессии включает в себя:

  • Удаление всех перемменых в сессии
  • Удаление данных на сервере
  • Удаление куки в клиенте

session_destroy()

Удаляет все данные привязанные к сессии.

Не удаляет никаких переменных из суперглобальной переменной $_SESSION.

Не удаляет куки.

Возвращает boolean - удалились данные или нет

Если использовать только session_destroy() можно переиспользовать $_SESSION просто вызвав session_start()

unset()

unset() это стандартная PHP функция, которую использую не только с сессиями.

Чтобы очистить username нужно выполнить

unset ($_SESSION[ 'username' ]);

Чтобы очистить всё можно обойтись без unset()

Пример полного удалёния сессии

$_SESSION = []; $params = session_get_cookie_params(); $options = array ('lifetime' => time() - 60); setcookie ( session_name(), '', $options ); session_destroy ();

Сессии в PHP

Давайте с Вами поработаем с сессиями в PHP. И начнём с функции session_start(). Данная функция делает следующее: если пользователь зашёл впервые, то создаёт уникальный идентификатор и записывает его в cookie, а также создаёт новый файл, вновь уникальный для пользователя. Если пользователь уже заходил, то тогда сервер считывает значение уникального идентификатора из cookie и, в соответствии с ним, обращается к нужному файлу сессии. Из этого файла PHP считывает все данные и помещает их в массив $_SESSION. Давайте напишем простой код, в котором мы записываем переменную в сессию, либо считываем, если она уже была записана.

Вначале мы вызываем функцию session_start(), которую я описал выше. Затем проверяем: существует ли переменная "name" в сессии. Если существует, то считываем из неё данные и записываем в переменную name. Если не существует (то есть пользователь пришёл в первый раз), то устанавливаем переменной "name" в сессии значение "15St.". Следующей строкой выводим значение переменной $name. Очевидно, что при первом запуске, Вы увидите пустую строку, а вот при втором увидите строку "15St.", считанную из сессии.

Советую Вам сейчас ввести в адресной строке: "javascript:document.cookie" (вводите на той же вкладке, что и запускали скрипт). В результате, Вы увидите примерно следующее: "PHPSESSID=f99c53cca398f756fa958e8cee2136bc". Как раз значение PHPSESSID и является тем самым уникальный идентификатором.

И чтобы всё стало совсем понятно, то советую даже найти файл сессии. Если Вы используете Denwer, то он лежит в папке "tmp". Посмотрите на файлы, которые начинаются на "sess_" - это и есть те самые файлы сессии. Вы можете их открыть в простом блокноте.

Ещё одно очень важное свойство - это временность сессий в PHP. То если cookie хранятся до тех пор, пока их не удалит браузер. А браузер их по умолчанию не удаляет никогда. То сессии хранятся время, заданное в настройках PHP. По умолчанию, это 15 минут. То есть если Вы будете использовать аутентификацию на основе сессии, то через 15 минут бездействия пользователя, ему снова придётся авторизоваться. Разумеется, это хорошо, так как если пользователь забудет "Выйти", то ничего плохого не случится. Злоумышленник не сможет воспользоваться аккаунтом пользователя. Более того, при использовании cookie их можно выкрасть, подставить в своём браузере, и в результате злоумышленник авторизован под чужими данными, не зная даже пароля. А сессию украсть не получится, так как все параметры хранятся на сервере, и узнать о них не получится.

Поэтому старайтесь в своей практике преимущественно использовать сессии, а не чистые cookie.

И, напоследок, хочется предупредить об очень частой ошибке. Никогда не выводите данные в браузеры до использования функции session_start(), иначе она выдаст ошибку. То есть нельзя писать вот так:

При запуске данного скрипта возникнет ошибка. То же самое правило действовало и с cookie (функция setcookie()). Так что, думаю, здесь всё понятно.

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

Читайте также: