Как работать с php-сессиями и что такое flash-сессии
30-05-2020Reading time ~ 4 min.PHP 9622
Думаю, что каждый 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 '<p>Нет данных в сессии.</p>'; echo '<form method="post"><button type="submit" name="add">Добавить данные в сессию</button></form>'; } else { echo '<p><b>' . $data . '</b></p>'; // есть данные 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 '<p>Данных во flash-сессии нет</p>'; // добавим что-то во flash-сессию my_session_flash_set('message', 'Мои данные во flash-сессии'); } else { echo '<p><b>' . $data_flash . '</b></p>'; }
Flash-сессии хранятся в отдельном ключе массива $_SESSION
. В моих примерах это $_SESSION['_flash']
, но, естественно, можно заменить на любое другое имя. Главное избежать ситуации, когда может быть создан одноимённый ключ «обычной сессии», который затрёт flash. Обычно это решается на уровне предупреждений в документации.
Подскажите, может не в тему поста, как вы делаете compiled html в страницах на Codeigniter. Этот сайт работает на вашем же CMS?
Что такое compiled html?
Это когда удаляются все пробелы и табы между тегами HTML для уменьшения веса страницы
Это стандартная возможность MaxSite CMS. Достаточно просто отметить «галочку».
А можете поделиться с помощью чего это реализовано в Codeigniter?
Это не CodeIgniter, а часть функционала MaxSite CMS. Смотрите код на гитхабе, на пальцах этого не показать.