MAXSITE.ORGКак сделать сайт своими руками

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

30-05-2020Время чтения ~ 4 мин.PHP 11809

Думаю, что каждый 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. Обычно это решается на уровне предупреждений в документации.

Скачать файл примерам.
Похожие записи
Комментарии (6) RSS
1 Александр 2020-05-30 18:09:38

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


2 Admin 2020-05-31 09:29:10 admin

Что такое compiled html?


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

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


4 Admin 2020-05-31 21:40:06 admin

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


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

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


6 Admin 2020-06-01 11:14:25 admin

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

Оставьте комментарий!
Сайт использует cookie
Для улучшения работы сайта собирается анонимная статистика через Google Analytics. Разрешить использование аналитических cookie?