Сессии и cookies нужны, чтобы сайт помнил пользователя между запросами. Без них каждый запрос для PHP как новый разговор. В этом уроке сделаем простой учебный логин: пользователь вводит имя, PHP сохраняет его в $_SESSION, а страница показывает приветствие до выхода
Это не полноценная авторизация для production, но правильная первая модель: cookie хранит идентификатор сессии, а данные сессии живут на сервере
Что получится в конце
Если пользователь не вошел, он видит форму. После отправки:
Привет, Алия
Кнопка «Выйти» очищает сессию
Базовый пример
Создайте index.php:
<?php
session_start();
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$name = trim($_POST['name'] ?? '');
if ($name !== '') {
$_SESSION['user_name'] = $name;
header('Location: /');
exit;
}
}
$userName = $_SESSION['user_name'] ?? null;
?>
<!doctype html>
<html lang="ru">
<head>
<meta charset="utf-8">
<title>Сессии PHP</title>
</head>
<body>
<?php if ($userName): ?>
<p>Привет, <?= htmlspecialchars($userName) ?></p>
<form method="post" action="/logout.php">
<button type="submit">Выйти</button>
</form>
<?php else: ?>
<form method="post">
<input name="name" placeholder="Ваше имя">
<button type="submit">Войти</button>
</form>
<?php endif; ?>
</body>
</html>
Создайте logout.php:
<?php
session_start();
session_destroy();
header('Location: /');
exit;
Запустите:
php -S localhost:8000
Почему session_start должен быть сверху
session_start() нужно вызвать до вывода HTML. PHP должен успеть прочитать cookie с идентификатором сессии и подготовить $_SESSION
Если вывести пробел, HTML или текст до session_start(), можно получить ошибку про headers already sent. Поэтому сессии, cookies и redirect обычно обрабатывают в самом начале файла
Что хранится в $_SESSION
Строка:
$_SESSION['user_name'] = $name;
сохраняет значение на стороне сервера. В браузер обычно уходит только cookie с идентификатором сессии. Поэтому не нужно вручную класть все данные пользователя в cookie
Читать можно так:
$userName = $_SESSION['user_name'] ?? null;
Если ключа нет, пользователь считается не вошедшим
Чем cookie отличается от session
Cookie хранится в браузере и отправляется на сервер с запросами. Session обычно хранит данные на сервере, а cookie содержит только ID сессии
Пример cookie:
setcookie('theme', 'dark', time() + 3600);
Cookie нужно ставить до вывода HTML, как и redirect. Для настроек интерфейса cookie подходят. Для пароля, роли пользователя и чувствительных данных — нет
Почему это не production-логин
В нашем примере нет пароля, базы данных, CSRF-защиты, ограничения попыток, session_regenerate_id, secure cookie-флагов. Это учебная модель, чтобы понять механику
В реальном логине нужны:
- пароль через
password_hashиpassword_verify; - HTTPS;
- защита форм;
- обновление ID сессии после входа;
- аккуратный logout;
- хранение пользователей в базе.
Частые ошибки
headers already sent. До session_start, setcookie или header уже был вывод. Проверьте пробелы и HTML до PHP-кода
Сессия не сохраняется. Проверьте, принимает ли браузер cookies, не меняется ли домен/порт и вызывается ли session_start() на каждой странице
После logout пользователь все еще виден. Проверьте, что вы снова не записываете $_SESSION['user_name'] и что redirect ведет на правильную страницу
Cookie используется для секрета. Не храните пароль или приватные данные в cookie
Что может быть еще интересно по этой теме
Можно ли сделать логин только на cookie? Технически можно, но безопаснее использовать server-side session или токеновую схему с понятной защитой
Почему после POST нужен redirect? Чтобы обновление страницы не отправляло форму повторно
Нужно ли htmlspecialchars для имени из сессии? Да. Данные могли прийти от пользователя, значит при выводе в HTML их нужно экранировать
Что учить после сессий? Пароли, CSRF, роли пользователей и хранение учетных записей в базе
Что открыть дальше
- Формы в PHP: GET, POST и первая обработка — база для login form.
- PHP и MySQL через PDO: первая база без SQL-инъекций — пользователи обычно хранятся в базе.
- Ошибки PHP: белый экран, error log и display_errors — поможет при проблемах с headers.
- PHP для WordPress: первый маленький shortcode — WordPress использует свою систему пользователей, но PHP-механика все равно полезна.



