Урок 19

Сессии — как сайт запоминает пользователя

20 мин

Проблема: HTTP не запоминает

Когда вы открываете страницу сайта, происходит следующее:

  1. Браузер отправляет запрос на сервер
  2. Сервер обрабатывает запрос и возвращает страницу
  3. Соединение закрывается

При следующем запросе сервер не помнит, что это тот же пользователь! Каждый запрос — как новый посетитель.

Но как тогда сайты помнят, что вы вошли в аккаунт?

Решение: Сессии

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

Как это работает:

  1. При первом визите сервер создаёт уникальный идентификатор сессии (Session ID)
  2. Этот ID сохраняется в cookie браузера
  3. При каждом запросе браузер отправляет этот ID
  4. Сервер по ID находит данные сессии и "узнаёт" пользователя
┌─────────────┐                    ┌─────────────┐
│   Браузер   │                    │   Сервер    │
└──────┬──────┘                    └──────┬──────┘
       │  1. Первый запрос                │
       │─────────────────────────────────→│
       │                                  │ Создаёт сессию
       │                                  │ ID: abc123
       │  2. Ответ + Cookie: abc123       │
       │←─────────────────────────────────│
       │                                  │
       │  3. Второй запрос + Cookie       │
       │─────────────────────────────────→│
       │                                  │ Находит сессию abc123
       │  4. "Привет, Иван!"              │
       │←─────────────────────────────────│

Использование сессий в PHP

Запуск сессии

В начале каждого файла, где нужны сессии:

<?php
session_start();
?>
Важно: session_start() должен вызываться до любого вывода (до echo, до HTML, даже до пробелов и переносов строк перед <?php).

Запись данных в сессию

<?php
session_start();

// Сохраняем данные в сессию
$_SESSION["user_id"] = 1;
$_SESSION["username"] = "Иван";
$_SESSION["is_admin"] = false;
?>

Чтение данных из сессии

<?php
session_start();

// Проверяем, есть ли данные
if (isset($_SESSION["user_id"])) {
    echo "Привет, " . $_SESSION["username"];
} else {
    echo "Вы не авторизованы";
}
?>

Удаление данных из сессии

<?php
session_start();

// Удалить одно значение
unset($_SESSION["username"]);

// Удалить всё
$_SESSION = [];

// Полностью уничтожить сессию
session_destroy();
?>

Практика: счётчик посещений

Создайте файл public/counter.php:

<?php
session_start();

// Если счётчик не существует — создаём
if (!isset($_SESSION["visits"])) {
    $_SESSION["visits"] = 0;
}

// Увеличиваем счётчик
$_SESSION["visits"]++;
?>
<!DOCTYPE html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <title>Счётчик посещений</title>
</head>
<body>
    <h1>Счётчик посещений</h1>
    <p>Вы посетили эту страницу <strong><?= $_SESSION["visits"] ?></strong> раз(а).</p>
    <p><a href="counter.php">Обновить страницу</a></p>
    <p><a href="counter.php?reset=1">Сбросить счётчик</a></p>
    
    <?php
    // Сброс счётчика
    if (isset($_GET["reset"])) {
        unset($_SESSION["visits"]);
        header("Location: counter.php");
        exit;
    }
    ?>
</body>
</html>

Откройте http://localhost:8080/counter.php и понажимайте "Обновить". Счётчик увеличивается! Закройте браузер, откройте снова — счётчик помнит значение (пока сессия не истекла).

Добавляем session_start() в config.php

Чтобы не писать session_start() в каждом файле, добавим его в config.php:

В начало файла public/includes/config.php:

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

// ... остальной код config.php
?>

Теперь сессия запускается автоматически при подключении config.php.

Вы узнали:
✅ Что такое сессии и как они работают
✅ Как использовать $_SESSION
✅ Как хранить данные между запросами

В следующем уроке создадим форму регистрации!

Мы используем файлы cookie для улучшения работы сайта и персонализации контента. Продолжая использовать сайт, вы соглашаетесь с использованием cookies в соответствии с нашей Политикой конфиденциальности.