Вы находитесь на странице: 1из 4

Лекции курса PHP7 + MySQL с нуля

(краткое содержание)

ЛЕКЦИЯ 43. РАБОТА С СЕТЬЮ. СЕССИИ

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

Механизм работы
Перед тем, как создать сессию, необходимо определить, к кому из
пользователей она будет относиться. Для этого при запуске сессии пользователю
присваивается уникальный идентификатор сессии – Session ID, помещаемый в
cookies браузера. Далее, при последующих обращениях к данным сессии,
происходит идентификация через этот параметр и, таким образом, каждый
пользователь получает доступ к своему личному хранилищу, а не к чужому.
С точки зрения обращения к данным сессии все просто – вся информация
хранится в глобальном массиве $_SESSION. Обращение к нему аналогично
обращению к любому массиву, с ним работают функции, конструкции и операторы
для работы с массивами.

Инициализация сессии
Перед тем, как начать работу с сессией, необходимо ее запустить (или как еще
говорят - инициализировать) с помощью функции:
bool session_start([array $options = array()])
Функция может принимать дополнительные параметры запуска сессии,
предопределяющие текущие директивы сессий.
В стандартном виде запуск сессии производится без дополнительных
параметров:
session_start()
В качестве примера использования сессии при работе с веб-приложением
можно рассмотреть хранение некоторых пользовательских данных, таких как имя
пользователя, время запуска сессии и количество запусков страницы (счетчика):
Листинг 43.1. Пример работы с сессией

//Запускаем сессию
session_start();

//Записываем в сессию имя пользователя с проверкой наличия записи


if(!isset($_SESSION['user_data']['name']))
$_SESSION['user_data']['name'] = "Михаил";

1
Лекции курса PHP7 + MySQL с нуля
(краткое содержание)

//Записываем в сессию дату, когда пользователь вошел на сайт


if(!isset($_SESSION['user_data']['start_time']))
$_SESSION['user_data']['start_time'] = date("Y-m-d H:i:s");

//Создаем счетчик посещений страницы


if(!isset($_SESSION['user_data']['count'])) {
$_SESSION['user_data']['count'] = 0;
} else {
$_SESSION['user_data']['count'] = $_SESSION['user_data']['count'] + 1;
}

//Выводим данные на экран


echo "<b>Данные о пользователе:</b>
<p>Имя пользователя: {$_SESSION['user_data']['name']}</p>
<p>Дата и время последнего выхода в онлайн:
{$_SESSION['user_data']['start_time']}</p>
<p>Счетчик посещения страницы: {$_SESSION['user_data']['count']}</p>";

Уничтожение и очистка сессии


После того, как пользователь завершил все действия на сайте и покинул его,
сессия должна быть уничтожена. Необходимо это по следующим причинам:
- освобождение ресурсов памяти;
- удаление более не используемых личных данных пользователя из
временного хранилища;
- очистка cookie, хранящего данные о сессии;
- защита личных данных пользователя от кражи и взлома через подделку
Session ID.
В PHP существует функция session_destroy(), которая уничтожает
непосредственно хранилище сессии, но при этом глобальный массив $_SESSION не
очищается.
Для полного удаления и очищения сессии необходимо провести ряд процедур:
- очистить массив $_SESSION;
- удалить cookie, хранящее Session ID;
- уничтожить хранилище сессии.
Вариант такой процедуры представлен в следующей последовательности
команд:
//Присвоить массиву $_SESSION пустой массив
$_SESSION = [];
//Проверить наличие и удалить cookie, содержащее Session ID
if(isset($_COOKIE[session_name()]))
unset($_COOKIE[session_name()]);
//Уничтожить хранилище сессии
session_destroy();
В данном примере функция session_name() как раз и позволяет выяснить
идентификатор сессии Session ID.

2
Лекции курса PHP7 + MySQL с нуля
(краткое содержание)

Рассмотрим в листинге 43.2. возможности создания и удаления сессий, а


также работы с ними.
Листинг 43.2. Работа с сессиями

//Создаем функцию для полного уничтожения сессии


function ses_destroy() {
$_SESSION = [];
$_POST['submit'] = null;
unset($_COOKIE[session_name()]);
$_POST['exit'] = null;
header('Location: Listing_43.2.php');
session_destroy();
}

//Создаем условный оператор динамического вывода страницы на экран


if(!$_POST['submit'] && !$_POST['exit']) {
echo '<form action="Listing_43.2.php" method="post">
<input type="text" name="login">
<input type="password" name="pass">
<input type="submit" name="submit" value="Войти">
</form>';
echo "<p>SESSION[login]: {$_SESSION['login']}</p>";
echo "<p>SESSION[password]: {$_SESSION['password']}</p>";
echo "<p>SESSION[status]: {$_SESSION['status']}</p>";
} elseif($_POST['submit'] && !$_POST['exit']) {
//Если нажата кнопка "Войти", запускаем сессиию и сохраняем веденные
данные в сессии и выводим приветствие на экран
session_start();
$_SESSION['login'] = $_POST['login'];
$_SESSION['password'] = $_POST['pass'];
$_SESSION['status'] = true;
echo "<div>
<p>Вы авторизованы как {$_SESSION['login']}.</p>
<form action=\"Listing_43.2.php\" method=\"post\">
<input type=\"submit\" name=\"exit\" value=\"Выход\">
</form>
</div>";
echo "<p>SESSION[login]: {$_SESSION['login']}</p>";
echo "<p>SESSION[password]: {$_SESSION['password']}</p>";
echo "<p>SESSION[status]: {$_SESSION['status']}</p>";
} elseif($_POST['exit']) {
//Если нажата кнопка "Выход", уничтожаем сессию и возвращаемся на экран
авторизации
ses_destroy();
}

3
Лекции курса PHP7 + MySQL с нуля
(краткое содержание)

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


страницу входа, где увидите поля ввода логина и пароля, а также кнопку «Войти».
Кроме того, на странице присутствуют пустые поля вывода:
SESSION[login]:
SESSION[password]:
SESSION[status]:
Пустые они по причине того, что сессия на этот момент еще не запущена и,
соответственно, элементы глобального массива $_SESSION пустуют. Как только Вы
введете в поля формы данные и нажмете «Войти», то попадете на страницу,
которая будет содержать подобное:
Вы авторизованы как user.
Кнопка «Выход»
SESSION[login]: user
SESSION[password]: 123456
SESSION[status]: 1
Таким образом, нажав на кнопку «Войти» Вы инициализировали сессию и
записали в массив $_SESSION данные, которые, в свою очередь, были выведены на
странице браузера.