Сессии и куки
Каждый запрос к сайту сервер обрабатывает отдельно и ничего не помнит о предыдущих. Чтобы посетитель оставался «вошедшим» при переходе между страницами, нужны сессии и куки.
Примерам этого урока нужен веб-сервер, поэтому здесь они не запускаются.
Как работает сессия
При первом визите PHP создаёт на сервере хранилище и выдаёт браузеру случайный идентификатор. Браузер присылает его с каждым следующим запросом, и PHP находит по нему нужное хранилище. Сами данные остаются на сервере — у посетителя только идентификатор.
Начало сессии
Сессию открывает функция session_start(). После неё доступен массив $_SESSION:
<?php
session_start();
$_SESSION['name'] = 'Анна';Значение сохранится и будет доступно на любой другой странице сайта, где тоже вызвана session_start():
<?php
session_start();
echo $_SESSION['name'] ?? 'Гость';Счётчик посещений
Данные сессии можно менять как обычный массив:
<?php
session_start();
$_SESSION['visits'] = ($_SESSION['visits'] ?? 0) + 1;
echo "Вы открыли эту страницу {$_SESSION['visits']} раз";Вход и выход
На сессиях строится авторизация: после проверки пароля в сессию записывают идентификатор пользователя, а на закрытых страницах проверяют, что он там есть.
<?php
session_start();
if (!isset($_SESSION['user_id'])) {
header('Location: /login.php');
exit;
}При выходе сессию уничтожают:
<?php
session_start();
session_destroy();Куки
Кука — небольшое значение, которое хранится в самом браузере. Её создаёт setcookie(), а прочитать можно из массива $_COOKIE при следующем запросе:
<?php
setcookie('theme', 'dark', time() + 60 * 60 * 24 * 30);
$theme = $_COOKIE['theme'] ?? 'light';Третий аргумент — время, до которого кука действует: здесь это 30 дней от текущего момента.
Что где хранить
| Сессия | Кука | |
|---|---|---|
| Где лежат данные | На сервере | В браузере |
| Может ли посетитель изменить | Нет | Да |
| Для чего | Вход, корзина | Тема, язык |
Частая ошибка
session_start(), setcookie() и header() должны вызываться до любого вывода на страницу — даже до пробела перед <?php. Иначе PHP выдаст предупреждение headers already sent, и ничего не сработает.
И не храните в куках ничего секретного: посетитель видит их содержимое и может изменить его.