Session
Сессии представляют набор переменных, которые хранятся на сервере (либо часть на сервере, а часть - в cookie
браузера) и которые относятся только к текущему пользователю. В какой-то степени сессии являются альтернативой кукам в плане сохранения данных о пользователе.
Для запуска сессии необходимо вызвать функцию session_start()
. Она должна вызываться до отправки ответа пользователю:
<?
session_start();
При запуске сессии с помощью функции session_start()
, если пользователь первый раз заходит на сайт, PHP назначает ему уникальный идентификатор сессии. Запустите браузер и откройте в нём Developer Tools и посмотрите на заголовки которые нам прислал сервер. Там будет много чего, интересует нас только подобная строчка в ответе сервера:
Set-Cookie: PHPSESSID=dap83arr6r3b56e0q7t5i0qf91;
С помощью этого идентификатора пользователь ассоциируется с данными сессии. Если для пользователя уже установлена сессия, то данная функция продлевает текущую сессию вместо установки новой.
PHPSESSID
имя сессии по умолчанию, регулируется из конфига php.ini
директивой session.name
, при необходимости имя можно изменить в самом конфигурационном файле или с помощью функции session_name()
.
С помощью специальных функций мы можем получить идентификатор сессии:
<?
session_start();
echo session_id(); // идентификатор сессии
echo session_name(); // имя - PHPSESSID
То же значение мы могли бы получить, обратившись к cookie
напрямую:
<?
echo $_COOKIE["PHPSESSID"];
Затем для сохранения или получения данных в сессии надо использовать глобальный ассоциативный массив $_SESSION
. Сохранение переменной в сессии:
<?
$_SESSION["имя_переменной"] = значение;
Получение сохраненного значения:
<?
$переменная = $_SESSION["имя_переменной"];
Сохранение данных в сессии
Запустим сессию и сохраним в ней значения:
<?
session_start();
$_SESSION["name"]="Sam";
$_SESSION["age"]=41;
echo "Данные сохранены в сессии";
После установки сессии в браузере мы сможем заметить установку специальной куки, которая по умолчанию называется PHPSESSID
Получение данных сессии
Теперь получим эти значения и выведем на страницу:
<?
session_start();
if (isset($_SESSION["name"]) && isset($_SESSION["age"])) {
$name = $_SESSION["name"];
$age = $_SESSION["age"];
echo "Name: $name <br> Age: $age";
}
Удаление данных сессии
Сессия уничтожается с закрытием браузера, однако мы также можем программно удалить либо какие-то отдельные, либо все данные сессии.
Для удаления одной переменной из сессии применяется функция unset()
:
<?
session_start();
unset($_SESSION["age"]); // удаляем из сессии переменную "age"
Удалить все данные сессии можно с помощью функции session_destroy()
:
<?
session_start();
session_destroy();
Где хранятся ссесии
По умолчанию PHP хранит сессию в файлах, за это отвечает директива session.save_handler
, путь по которому сохраняются файлы ищите в директиве session.save_path
, либо воспользуйтесь функцией session_save_path()
для получения необходимого пути.
В конфигурации путь к файлам может быть не указан, тогда файлы сессии будут хранится во временных файлах системы, вызовите функцию sys_get_temp_dir()
и узнайте где это потаённое место. Идём по данному пути и находим ваш файл сессии по ID
.
Для преобразования этой строки в массив нужно воспользоваться функцией session_decode()
, для обратного преобразования session_encode()
. Можно использовать и стандартную PHP сериализацию, пропишите в конфигурационной директиве session.serialize_handler
значение php_serialize
после этого $_SESSION
можно будет использовать без ограничений - в качестве индекса теперь можно использовать цифры и специальные символы в имени.
Безопасность
Давайте запустим два браузера, в одно установим ссесию в в другой добавим тот же самый ID. Для этого есть простенький javascript код, скопируйте его в консоль браузера и запустите, только не забудьте идентификатор сессии поменять на свой:
javascript:(function(){document.cookie='PHPSESSID=dap83arr6r3b56e0q7t5i0qf91;path=/;';window.location.reload();})()
Вот теперь у вас оба браузера смотрят на одну и туже сессию.
Стоит упомянуть директиву session.cookie-httponly
, благодаря ей сессионная кука будет недоступна из JavaScript.