Определение состояния сессии в PHP: все способы с примерами

Раздел: PHP программирование -> Управление сессиями

Проверка существования сессии в PHP: варианты и рекомендации

Как проверить, активна ли сессия в PHP, самым надёжным способом?

Наиболее эффективное решение - использовать функцию session_status() и сравнить результат с константой PHP_SESSION_ACTIVE. Этот способ не зависит от наличия данных в сессии или состояния cookies.


if (session_status() === PHP_SESSION_ACTIVE) {
    echo 'Сессия активна.';
} else {
    echo 'Сессия не запущена или уже завершена.';
}

Start php session id (установка id сессии)

Возможная проблема: если сессия была запущена, но позже закрыта (например, через session_write_close()), session_status() вернёт PHP_SESSION_ACTIVE, хотя запись в сессию больше невозможна.

Цель: универсальная проверка, подходит для любого этапа выполнения скрипта. Используется, когда нужно безопасно работать с сессией, не вызывая ошибок повторного запуска.

Как проверить, что сессия уже стартовала, по идентификатору?

Можно использовать session_id() - если идентификатор пуст, сессия не начата.


if (session_id() !== '') {
    echo 'Сессия активна (идентификатор: ' . session_id() . ').';
} else {
    echo 'Сессия не запущена.';
}

Isset session php (проверка существования сессии в php)

Типичная ошибка: после вызова session_destroy() идентификатор остаётся в cookie, но на сервере данные удалены. session_id() может вернуть непустую строку, хотя сессия фактически уничтожена. Решение: дополнительно проверять session_status().

Как узнать, что сессия содержит хотя бы одну переменную?

Проверка isset($_SESSION) && count($_SESSION) > 0 даёт информацию о наличии данных, но не о том, что сессия активна.


if (isset($_SESSION) && count($_SESSION) > 0) {
    echo 'Сессия активна и содержит данные: ' . implode(', ', array_keys($_SESSION));
} else {
    echo 'Либо сессии нет, либо она пуста.';
}

Php session start (запуск сессии в php)

Проблема: если сессия была запущена, но в неё ничего не записали, count($_SESSION) вернёт 0, и проверка даст ложный отрицательный результат. Подходит только для сценариев, где гарантированно есть хотя бы одна переменная.

Можно ли полагаться только на isset($_SESSION)?

Переменная $_SESSION инициализируется только после вызова session_start(). Поэтому проверка isset($_SESSION) корректна, если сессия была запущена в текущем запросе.


if (isset($_SESSION)) {
    echo 'Сессия была запущена ранее в этом скрипте.';
} else {
    echo 'Сессия ещё не стартовала.';
}

Ошибка: если сессия стартовала в другом запросе, а в текущем session_start() не вызывался, $_SESSION не определена. Проверка вернёт false, хотя сессия существует на стороне сервера. Решение: комбинировать с проверкой cookie или session_id().

Как проверить сессию через cookie?

Можно проверить наличие cookie с именем сессии (session_name()). Это не говорит о том, что данные загружены, но указывает на возможную активную сессию.


$cookieName = session_name();
if (isset($_COOKIE[$cookieName]) && $_COOKIE[$cookieName] !== '') {
    $id = $_COOKIE[$cookieName];
    echo 'Кука сессии присутствует, ID: ' . htmlspecialchars($id);
} else {
    echo 'Кука сессии не найдена.';
}

Недостаток: cookie может быть установлена, но сессия на сервере может быть устаревшей или удалённой. Надёжность низкая. Используется для предварительной проверки перед session_start().

Расширенные примеры проверки существования сессии

Пример

// Пример 1. Комбинированная функция безопасной проверки
function isSessionActive(): bool {
    if (session_status() === PHP_SESSION_ACTIVE) {
        return true;
    }
    // Дополнительно проверяем cookie
    $name = session_name();
    return isset($_COOKIE[$name]) && $_COOKIE[$name] !== '';
}

if (isSessionActive()) {
    echo 'Сессия определена как активная.';
} else {
    echo 'Сессия не обнаружена.';
}
// Результат (пример): Сессия определена как активная.
Пример

// Пример 2. Проверка после уничтожения сессии
session_start();
$_SESSION['user'] = 'admin';
session_destroy();

// session_destroy не очищает $_SESSION и не сбрасывает ID сессии в cookie
echo 'После session_destroy:' . PHP_EOL;
echo 'session_status(): ' . session_status() . PHP_EOL;   // 1 (PHP_SESSION_NONE)
echo 'session_id(): ' . session_id() . PHP_EOL;           // пустая строка или ID?
echo 'isset($_SESSION): ' . (int)isset($_SESSION) . PHP_EOL; // 1 (если переменная не переопределена)
echo 'count($_SESSION): ' . count($_SESSION) . PHP_EOL;  // 0 (массив пуст)
// Результат (пример):
// После session_destroy:
// session_status(): 1
// session_id(): (пусто)
// isset($_SESSION): 1
// count($_SESSION): 0
Пример

// Пример 3. Проверка при рестарте сессии
session_start();
$_SESSION['count'] = 1;
session_write_close();

// Сессия активна, но запись закрыта
if (session_status() === PHP_SESSION_ACTIVE) {
    echo 'Сессия всё ещё активна.' . PHP_EOL;   // true
}

session_start(); // рестарт
$_SESSION['count']++;
echo 'Значение счётчика: ' . $_SESSION['count']; // 2
// Результат:
// Сессия всё ещё активна.
// Значение счётчика: 2
Пример

// Пример 4. Проверка с обработкой ошибки повторного запуска
if (session_status() !== PHP_SESSION_ACTIVE) {
    session_start();
} else {
    // сессия уже активна, можно работать напрямую
    echo 'Используем существующую сессию.';
}
Пример

// Пример 5. Утилита для логирования состояния сессии
function logSessionState(): void {
    $statusMap = [
        PHP_SESSION_DISABLED => 'Отключена',
        PHP_SESSION_NONE     => 'Не запущена',
        PHP_SESSION_ACTIVE   => 'Активна'
    ];
    $status = session_status();
    $log = sprintf(
        '[%s] Статус: %s, ID: %s, Кука: %s',
        date('Y-m-d H:i:s'),
        $statusMap[$status] ?? 'Неизвестно',
        session_id() ?: '(пусто)',
        isset($_COOKIE[session_name()]) ? 'есть' : 'нет'
    );
    file_put_contents('session.log', $log . PHP_EOL, FILE_APPEND);
}
logSessionState();
Пример

// Пример 6. Проверка сессии во время AJAX-запроса (без вызова session_start())
header('Content-Type: application/json');
if (isset($_COOKIE[session_name()]) && session_status() === PHP_SESSION_NONE) {
    // Можно безопасно запустить сессию
    session_start();
}
if (session_status() === PHP_SESSION_ACTIVE) {
    echo json_encode(['session_active' => true, 'user' => $_SESSION['user'] ?? null]);
} else {
    echo json_encode(['session_active' => false]);
}

Проверка существования сессии в PHP - comments

En
Isset session php (php)