#11 php Выход (logout): session_destroy и очистка сессии, как разлогинить пользователя

В уроке про авторизацию мы научились впускать посетителя. Финальный штрих — уметь его «выпускать»: добавим на закрытую страницу ссылку «Выйти» и сделаем отдельный logout.php, который уничтожит сессию.

Немного теории

Сессии мы разобрали в заметке учебника и в практическом уроке про них. Для выхода нужны две вещи: очистить массив $_SESSION и вызвать session_destroy() — она удаляет данные сессии с сервера.

Код

Вся страница logout.php целиком — снова «скрипт без интерфейса», как обработчик из урока про форму и обработчик:

<?php
// logout.php - завершаем сессию и возвращаем на вход
session_start();

$_SESSION = [];
session_destroy();

header('Location: login.php');
exit;

А на закрытой странице появляется одна строка — обычная ссылка:

  <p>Здесь мог бы быть ваш личный кабинет.</p>
  <p><a href="logout.php">Выйти</a></p>
</body>
</html>

Разберём logout.php построчно:

  • session_start() — как всегда в начале, ведь сессию сначала надо «открыть», чтобы с ней работать;
  • $_SESSION = [] — очищаем массив в текущем скрипте;
  • session_destroy() — удаляет данные сессии на сервере: после этого кука PHPSESSID указывает в пустоту;
  • знакомый редирект на страницу входа.

Что произошло на самом деле

Клик по «Выйти» — обычный GET-запрос к logout.php. Сервер уничтожил сессию, и теперь «страж» из урока про авторизацию на любой закрытой странице не найдёт в сессии метку вошедшего — и отправит на форму входа. Заметьте: кука PHPSESSID в браузере при этом может остаться — но она больше ничего не «помнит», и это не страшно.

Проверяем

  1. войдите как admin / 12345 (http://localhost:19791/lessons/lesson11-logout/login.php);
  2. на закрытой странице нажмите «Выйти» — окажетесь на форме входа;
  3. попробуйте открыть secret.php напрямую или нажать «назад» в браузере — не пустит: сессии больше нет.

Попробуйте сами

  • после выхода показывайте на странице входа сообщение «Вы вышли» (подсказка: GET-параметр при редиректе — приём уже знакомый);
  • посмотрите в DevTools, что кука PHPSESSID после выхода никуда не делась, и объясните себе, почему доступ всё равно закрыт;
  • посложнее: сделайте подтверждение выхода — маленькая страница «точно выйти?» с двумя ссылками.

Итоги

  • выход — это очистка сессии: $_SESSION = [] и session_destroy(), затем редирект;
  • logout.php — скрипт без интерфейса, как обработчик формы;
  • оставшаяся в браузере кука PHPSESSID безвредна: её сессия уничтожена.

Курс завершён

Мы прошли весь путь: как сервер отдаёт страницы, как передать данные через GET-параметры, как принимать формы, редиректить, «узнавать» посетителя по кукам и сессиям — и наконец построили вход и выход. Дальше — учебник по PHP и полная программа подготовки бэкэнд-разработчика. Все уроки — в списке курса.