Как работать с php-сессиями и что такое flash-сессии

Думаю, что каждый php-программист знаком с сессиями и может даже работал с ними. Сессии — это стандартный механизм PHP и применяется наверное во всех CMS или фреймворках в том или ином виде. Так же написаны сотни (если не больше) php-библиотек, которые предлагают множество функций для упрощения кода.

В целом же работа с сессиями очень простая и если говорить с практической точки зрения, то есть очень мало задач, которые стоят перед программистом. Первая — это добавление и получение данных в сессию, и вторая — организация flash-сессий для создания «мигающих сообщений». Очень часто это так и называется «flash message». Простой пример: после обновления данных, нужно вывести сообщение для пользователя только один раз.

Что такое сессии?

Сессия это не что иное, как простой текстовый файл на сервере, в котором в специальном (серилизованном) виде хранятся произвольные данные. Сессия всегда привязывается к пользователю, поэтому все сессии на сервере будут уникальными. Для того, чтобы связать сессию с пользователем, как правило используется механизм кук. Это т.н. идентификатор SID, а имя куки PHPSESSID. У сессии (и куки) есть время жизни — обычно это 180 минут, поэтому как правило сессии используются для хранения данных пользователя в небольших временных пределах.

Доступность сессий

Важный момент в том, что PHP на сервере может быть настроен так, что сессии не будут создаваться автоматически для каждого пользователя. То есть перед тем, как хоть что-то начать делать с сессиями, нужно запустить их механизм. Правильный код будет таким:

if (session_status() == PHP_SESSION_NONE) session_start();

В PHP предусмотрена суперглобальная переменная $_SESSION, которая представляет собой обычный массив, где можно хранить любые данные. Поэтому все операции с данными происходят только через $_SESSION.

Добавление, получение и удаление данных

Работать с сессиям нужно ровно так, как и с любым другим массивом.

// добавить
$_SESSION['test'] = 'данные для сессии';
 
// получить
if (isset($_SESSION['test'])) echo $_SESSION['test'];
 
// удалить
if (isset($_SESSION['test'])) unset($_SESSION['test']);

То есть чтобы работать с сессиями не нужны какие-то сторонние библиотеки.

Что такое flash-сессии (сообщения)

Например php-скрипту нужно отправить уведомление пользователю о результате выполнения операции. Это может быть какой-то html-блок. Но, PHP это не JavaScript, где можно динамически поменять html-код страницы, поэтому сообщение записывается в текущую сессию и будет выведено уже при первой перезагрузке страницы.

После того, как сообщение получено, оно сразу же удаляется. То есть, если и ещё раз перезагрузить страницу, то сообщения уже не будет.

Вот этот алгоритм и называется flash-сессиями.

Практика

Если ваш проект предполагает работу с сессиями, то можно написать несколько функций для основных операций. Я сделал тестовый файл, который вы можете скачать и запустить на своём сервере.

// запуск механизма сессий
function my_session_start() {
    if (session_status() == PHP_SESSION_NONE) session_start();
}
 
// добавление данных в сессию
function my_session_set($key, $val) {
    $_SESSION[$key] = $val;
}
 
// получение данных из сессии
function my_session_get($key) {
    if (isset($_SESSION[$key])) 
        return $_SESSION[$key];
    else
        return '';
}
 
// удаление данных из сессии
function my_session_clear($key) {
    if (isset($_SESSION[$key])) unset($_SESSION[$key]);
}
 
// добавить во flash-сессию
function my_session_flash_set($key, $val) {
    $_SESSION['_flash'][$key] = $val;
}
 
// получить из flash-сессии
function my_session_flash_get($key) {
    if (isset($_SESSION['_flash'][$key])) {
        $data = $_SESSION['_flash'][$key];
        unset($_SESSION['_flash'][$key]);
        
        return $data;
    }
    else
        return '';
}

Теперь посмотрим как это использовать вначале с обычными сессиями.

// запускаем механизм сессий
my_session_start();
 
// получаем из сессии данные
$data = my_session_get('test');
 
if (!$data) {
    echo 'Нет данных в сессии.';
    echo '<form method="post"><button type="submit" name="add">Добавить данные в сессию</button></form>';
} else {
    echo '<b>' . $data . '</b>'; // есть данные
    echo '<form method="post"><button type="submit" name="clear">Очистить данные сессии</button></form>';
}
 
// добавить данные
if (isset($_POST['add'])) {
    my_session_set('test', 'Тестовые данные из сессии');
    echo 'Данные добавлены.';
}
 
// нужно очистить данные
if (isset($_POST['clear'])) {
    my_session_clear('test');    
    echo 'Данные очищены.';
}

Вначале мы запускаем механизм сессий. После этого получаем данные по какому-то ключу.

Если данных нет, то нужно их добавить. Можно сразу использовать my_session_set(), но я решил, пусть это будет кнопка и обработчик POST-запроса, в котором уже и добавляем данные в сессию.

Если же данные есть, то выводим их и добавляем кнопку на удаление. Такая вот простенькая интерактивность получилась. Обновляя страницу и нажимая кнопки можно добавлять или удалять данные в сессию.

С flash-сессиями работать можно аналогично, только удаление происходит сразу после получения данных. В этом примере данные flash-сессии будут «мигать» при каждом обновлении страницы. Когда данные есть, мы их выводим (и они автоматом удаляются), а когда нет, они ставятся. Теперь вы понимаете, почему их и называются flash messages.

// получаем данные
$data_flash = my_session_flash_get('message');
 
if (!$data_flash) {
    echo 'Данных во flash-сессии нет';
    
    // добавим что-то во flash-сессию
    my_session_flash_set('message', 'Мои данные во flash-сессии');
} else {
    echo '<b>' . $data_flash . '</b>';
}

Flash-сессии хранятся в отдельном ключе массива $_SESSION. В моих примерах это $_SESSION['_flash'], но, естественно, можно заменить на любое другое имя. Главное избежать ситуации, когда может быть создан одноимённый ключ «обычной сессии», который затрёт flash. Обычно это решается на уровне предупреждений в документации.

Скачать файл примерам.

Комментариев: 6 RSS

1Александр30-05-2020 18:09

Подскажите, может не в тему поста, как вы делаете compiled html в страницах на Codeigniter. Этот сайт работает на вашем же CMS?

3Аноним31-05-2020 21:31

Это когда удаляются все пробелы и табы между тегами HTML для уменьшения веса страницы

4MAX31-05-2020 21:40

Это стандартная возможность MaxSite CMS. Достаточно просто отметить «галочку».

5Александр31-05-2020 21:57

А можете поделиться с помощью чего это реализовано в Codeigniter?

6MAX01-06-2020 11:14

Это не CodeIgniter, а часть функционала MaxSite CMS. Смотрите код на гитхабе, на пальцах этого не показать.

Оставьте комментарий!

Комментарий будет опубликован после проверки. Вы соглашаетесь с правилами сайта.

(обязательно)