Назначение сессий практически такое же — сохранение некоторых данных после завершения работы скрипта для последующего использования. Однако, у двух этих методов есть существенное различие. Куки хранятся на стороне клиента и поэтому пользователь может без труда прочитать и даже изменять их. Допустим, на нашем сайте существует форма авторизации. Войдя под администраторской учетной записью пользователь получает дополнительные привилегии на сайте, к примеру, доступ к администраторской панели. Чтобы после каждого перехода пользователю не вводить заново пароль, необходимо каким-то образом запомнить факт того, что данный пользователь авторизован с административными правами. Используя куки задача решается следующим образом: после удачной авторизации пользователю устанавливается некая куки admin=1. При серфинге по страницам сайта проверяемся, есть ли у пользователя данная куки. Если есть, то пользователь — администратор. С точки зрения безопасности такое решение является в корне неправильным, так как любой посетитель может самостоятельно добавить в своем браузере куки admin=1 и автоматически стать администратором на вашем сайте. Используя сессии такой номер не пройдет, потому что сессионные параметры хранятся на стороне веб-сервера.
Рассмотрим принцип работы сессий в PHP. Для инициализации новой или возобновления ранее созданной необходимо вызвать PHP-функцию session_start(). Данную функцию необходимо вызывать до вывода контента в коде. Сессионные параметры находятся в глобальном массиве $_SESSION. Рассмотрим пример:
session_start();
if ( ! isset($_SESSION['test']) )
{
echo 'Сохраняем значение...<br />';
$_SESSION['test'] = 'Hello, world';
}
echo $_SESSION['test'];
При первом выполнении скрипта создастся новая сессия функцией session_start(). Условие выполнится, так как сессионной переменной test не существует и при этом будет создана данная сессионная переменная. При последующих выполнениях функция session_start() будет возобновлять ранее созданную сессию, условие выполняться не будет, а будет лишь выводиться значение переменной test.
При создании сессии PHP создает специальный временный файл, в котором хранит сессионные переменные. Для каждой сессии создается отдельный файл. Чтобы определить, какая сессия к какому клиенту относится, при создании сессии клиенту устанавливается куки вида:
PHPSESSID=be9657fa55a93d16d286234faf4ae56b
Это так называемый идентификатор сессии. Существует также способ передачи идентификатора сессии в GET-параметрах, но данный способ я считаю слишком устаревшим. Имя параметра можно изменить в конфигурационном файле PHP php.ini:
session.name = PHPSESSID
По умолчанию сессия уничтожается при закрытии клиентом браузера. Но можно задать и конкретное время жизни сессии в php.ini (указывается время в секундах):
session.cookie_lifetime = 0
В скрипте сессию можно принудительно уничтожить функцией session_destroy().
И напоследок рассмотрим еще один пример. Небольшой скрипт, эмулирующий авторизацию пользователя на сайте. Формы ввода логина и пароля нет, есть просто две кнопки "войти" и "выйти".
<?php
//--Создаем новую либо возобновляем созданную сессию
session_start();
//--Процедуры входа и выхода
if ( isset($_POST['do']) )
{
if ( $_POST['do'] == 'login' )
{
$_SESSION['logined'] = 'yes';
header('location: ' . $_SERVER['PHP_SELF']);
exit();
}
if ( $_POST['do'] == 'logout' )
{
session_destroy();
header('location: ' . $_SERVER['PHP_SELF']);
exit();
}
}
//--Форма авторизации
$login_form = <<<END
<form method="POST" action="{$_SERVER['PHP_SELF']}">
<input type="hidden" name="do" value="login" />
<input type="submit" name="submit" value="Войти" />
</form>
END;
//--Форма выхода
$logout_form = <<<END
<form method="POST" action="{$_SERVER['PHP_SELF']}">
<input type="hidden" name="do" value="logout" />
<input type="submit" name="submit" value="Выйти" />
</form>
END;
//--Если пользователь авторизован
if ( isset($_SESSION['logined']) && $_SESSION['logined'] == 'yes' )
{
echo 'Приветствуем Вас, авторизованный пользователь!<br />';
//--Выводим форму выхода
echo $logout_form;
}
else
{
echo 'Приветствуем Вас, гость!<br />';
//--Выводим форму выхода
echo $login_form;
}
?>
После входа пользователь остается авторизованным при обновлении страницы. Код очень простой, но на его основе можно легко реализовать настоящую авторизацию на сайте.