Библиотека сессии
Класс сессии позволяет сохранить “состояние” пользователей и отслеживать их деятельность, пока они просматривают ваш сайт.
CodeIgniter поставляется с несколькими драйверами хранения сессий:
- файлы (по умолчанию; файлах)
- базы данных
- redis (сетевое журналируемое хранилище данных типа «ключ — значение» с открытым исходным кодом. Нереляционная высокопроизводительная СУБД)
- memcached (кеширование данных в оперативной памяти на основе хеш-таблицы)
Кроме того, вы можете создать свои собственные, пользовательские драйверы сессии на основе других видов хранения или воспользоваться функциями класса сессии.
Использование класса сессии
Инициализация сессии
Сессии, как правило доступны глобально с каждой загрузкой страницы, поэтому класс сессии должен быть инициализирован в конструкторе контроллера или он может быть загружен автоматически системой. По большей части класс сессии будет запускаться автоматически в фоновом режиме, так что после инициализации класса можно будет читать, создавать и обновлять сессии при необходимости.
Для инициализации класса сессии вручную в конструкторе контроллера, используйте $this->load->library() метод:
$this->load->library('session');
После загрузки класса сессий, объекты библиотеки будут доступны через:
$this->session
Важно
Так как Loader Class создается базовым контроллером CodeIgniter, обязательно вызовите parent::__construct() прежде чем пытаться загрузить библиотеку из конструктора контроллера.
Как работаю сессии?
При загрузке страницы, класс сессии проверит действительна ли сессия отправленная пользователем в браузере. Если сессия НЕ существует (или не совпадает с сессией созданной на сервере или истекла) новая сессия будет создана и сохранена.
Если сессия существует, её информация будет обновлена. С каждым обновлением, идентификатор сессии может быть сгенерирован при соответствующей настройке.
Важно, чтобы вы понимали, что после инициализации класса сессии, она запускается автоматически. Не нужно ничего делать, чтобы вызвать описанное выше поведение. Вы можете, что будет показано ниже, работать с данными сессии, но процессы чтения, записи и обновления сессии - автоматические.
Примечание
Из командной строки (CLI), библиотека сессии будет автоматически остановлена, так как это концепция, основанная целиком на HTTP протоколе
Записки о параллелизме
Если вы разрабатываете сайт с использованием AJAX - можете пропустить этот раздел. Если вы испытываете проблемы с производительностью, то эта заметка именно то, что вам нужно
Сессии в предыдущих версиях CodeIgniter не срвершали блокировку, что означало, что два http запроса могут работать одновременно с помощью одного сеанса. Более подходящий термин - запросы были без блокировки.
Работа без блокировки запросов в рамках сессии также означает - небезопасность, поскольку изменения данных сессии (или восстановление ID сессии) в одном запросе может препятствовать осуществлению второй, в параллельном запросе. Эта деталь в корне многих проблем и является главной причиной, почему в CodeIgniter 3.0 была полностью переписана библиотека сессии.
Почему мы все это вам рассказываем? Ведь вполне вероятно, что после попытки найти причину проблемы с производительностью, вы можете сделать вывод, что проблема в блокеровке и начать искать пути снятия блокировки ...
НЕ ДЕЛАЙТЕ ЭТОГО! Снятие блокировки будет ошибочным и будет вызывать больше проблем!
Блокировка не проблема, это - решение. Ваша проблема в том что вы храните сессию открытой когда уже обработали ее и поэтому она больше не нужна. Итак, то что вам нужно, так это закрыть сессию для текущего запроса после чего она больше не нужна.
Короче говоря - вызывая session_write_close() один раз, больше не нужно ничего делать с переменными сессии.
Что такое данные сессии?
Данные сессии - просто массив, связанный с конкретным ID сессии (куки).
Если вы использовали сессий в PHP ранее, то должны быть знакомы с PHP $_SESSION superglobal (если нет, пожалуйста, прочитайте содержание этой ссылки).
CodeIgniter дает доступ к данным сессии используя те же средства, что использует механизм обработки сессий предусмотренный в PHP. Используя данные сессии так же просто, как манипулирование (чтение, запись и удаление значений) $_SESSION массивом.
Кроме того, CodeIgniter имеет 2 специальных типа данных сессии, которые будут описаны ниже: flashdata и tempdata.
Примечание
В предыдущих версиях CodeIgniter данные сессии называли ‘userdata’. Имейте это в виду, если этот термин используется в другом месте данного руководства. Большинство из сказаного объясняет методы работы ‘userdata’.
Получение данных сессии
Любой кусок информации из массива сессии доступен через суперглобальную $_SESSION:
$_SESSION['item']
Или сквозь магический получатель:
$this->session->item
И для обратной совместимости, через userdata() метод:
$this->session->userdata('item');
Где item - это ключ массива, соответствующий пункту, который вы желаете извлеч. Например, чтобы присвоить ранее сохраненный пункт ‘name’ переменной $name следует так:
$name = $_SESSION['name'];
// or:
$name = $this->session->name
// or:
$name = $this->session->userdata('name');
Примечание
Метод userdata() возвращает если элемент, который вы пытаетесь получить, не существует.
Если вы хотите получить все существующие пользовательские данные, вы можете просто опустить ключ элемента (магический получатель работает только для свойств):
$_SESSION
// или:
$this->session->userdata();
Добавление данных сессии
Пусть определенный пользователь входит на ваш сайт. После авторизации, можете добавить имя пользователя и email адрес в сессию, что избавит от необходимости запуска запроса к базе данных, когда вам это нужно.
Вы можете просто присваивать данные $_SESSION массиву, как и любой другой переменной. Или как свойство $this->session.
Кроме того, старый способ присвоения его как “userdata” также доступен. Передает в массив ваши новые данные set_userdata() метод:
$this->session->set_userdata($array);
Где $array ассоциативный массив. Вот пример:
$newdata = array(
'username' => 'johndoe',
'email' => 'johndoe@some-site.com',
'logged_in' => TRUE
);
$this->session->set_userdata($newdata);
Если вы хотите добавить значения одного пользователя за раз, set_userdata() также поддерживает такой синтаксис:
$this->session->set_userdata('some_name', 'some_value');
Если вы хотите проверить, существует ли значение сессии, просто используйте isset():
// возвращает FALSE если 'some_name' не существует или NULL,
// TRUE в остальных случаях:
isset($_SESSION['some_name'])
Или можете вызвать has_userdata():
$this->session->has_userdata('some_name');
Удаление данных сессии
Так же, как с любой другой переменной, удаление значения в $_SESSION можно сделать через unset():
unset($_SESSION['some_name']);
// или несколько значений:
unset(
$_SESSION['some_name'],
$_SESSION['another_name']
);
Как set_userdata() может использоваться для добавления информации к сессии, unset_userdata() может использоваться, для её удаления, путем передачи ключа сессии. Например, если вы захотели удалить ‘some_name’ из массив данных сессии:
$this->session->unset_userdata('some_name');
Этот метод принимает массив ключей для удаления:
$array_items = array('username', 'email');
$this->session->unset_userdata($array_items);
Примечание
В предыдущих версиях unset_userdata() метод принимал ассоциативный массив key => 'dummy value' в виде пары. Больше это не поддерживается.
Flashdata
CodeIgniter поддерживает “flashdata” или сеанс передачи данных, которые будут доступны только для следующего запроса, а затем удаляются автоматически.
Это может быть очень полезно для разовых уведомлений об ошибках или сообщений о состоянии (например: “Запись 2 удалена”).
Следует отметить, что переменные flashdata обычные переменные сессии, только помеченные определенным образом под ‘__ci_vars’ ключом (пожалуйста, не трогайте его, вас предупредят).
Чтобы отметить существующий элемент как “flashdata”:
$this->session->mark_as_flash('item');
Если вы хотите отметить несколько элементов, как flashdata, просто передайте ключи в виде массива:
$this->session->mark_as_flash(array('item', 'item2'));
Чтобы добавить flashdata:
$_SESSION['item'] = 'value';
$this->session->mark_as_flash('item');
Или, альтернативно, с помощью set_flashdata() метода:
$this->session->set_flashdata('item', 'value');
Вы также можете передать массив в set_flashdata(), таким же образом, как set_userdata().
Чтение данных flashdata такое же, как чтение обычных данных сессии через $_SESSION:
$_SESSION['item']
Важно
Метод userdata() НЕ возвращает элементы flashdata.
Если вы хотите быть уверены, что вы читаете “flashdata” (и никакие другие), вы можете также использовать flashdata() метод:
$this->session->flashdata('item');
Или получить массив со всеми flashdata данными, просто опустив ключ:
$this->session->flashdata();
Примечание
Метод flashdata() возвращает NULL если элемент не найден.
Если вы обнаружите, что вам нужно сохранить переменную flashdata через дополнительный запрос, вы можете сделать это, используя keep_flashdata() метод. Вы можете передать один элемент или массив элементов flashdata.
$this->session->keep_flashdata('item');
$this->session->keep_flashdata(array('item1', 'item2', 'item3'));
Tempdata
CodeIgniter также поддерживает “tempdata”, или сессии данных с определенным сроком действия. По истечению срока действия или истечения срока действия сессии или при удалении, значение будет автоматически удалено.
Аналогично flashdata, tempdata переменные сессии, помечены определенным ключом ‘__ci_vars’ (и снова, это не трогаем).
Чтобы отметить существующий элемент как “tempdata”, просто передайте свой ключ и время истечения (в секундах!) в mark_as_temp() метод:
// 'item' будет удален через 300 секунд
$this->session->mark_as_temp('item', 300);
Вы можете пометить несколько элементов как tempdata двумя способами, в зависимости от того, хотите ли вы, чтобы все они были одного время истечения или нет:
// Оба 'item' и 'item2' истекают через 300 секунд
$this->session->mark_as_temp(array('item', 'item2'), 300);
// 'item' будет удален через 300 секунд, в то время как 'item2'
// будет удален только через 240 секунд
$this->session->mark_as_temp(array(
'item' => 300,
'item2' => 240
));
Чтобы добавить tempdata:
$_SESSION['item'] = 'value';
$this->session->mark_as_temp('item', 300); // Истекает через 5 минут
Или, альтернативно, с помощью set_tempdata() метода:
$this->session->set_tempdata('item', 'value', 300);
Вы также можете передать массив set_tempdata():
$tempdata = array('newuser' => TRUE, 'message' => 'Thanks for joining!');
$this->session->set_tempdata($tempdata, NULL, $expire);
Примечание
Если время истечения не указано или задано 0, время "жизни" будет использовано по умолчанию 300 секунд (что равно 5 минутам).
Читать переменную tempdata, опять же вы можете просто открыть его через суперглобальный массив $_SESSION:
$_SESSION['item']
Важно
Метод userdata() НЕ вернет tempdata значений.
Если вы хотите быть уверены, что вы читаете “tempdata” (и никакие другие), вы можете также использовать tempdata() метод:
$this->session->tempdata('item');
И конечно же если вы хотите получить все существующие tempdata:
$this->session->tempdata();
Примечание
Метод tempdata() вернет NULL если элемент не найден.
Если вам нужно удалить значение tempdata до истечения срока его действия, вы можете удалить его напрямую из $_SESSION массива:
unset($_SESSION['item']);
Однако это не удаляет маркер, сделанный для конкретного элемента tempdata (он будет недействительным в следующем HTTP запросе), поэтому, если вы намерены повторно использовать этот же ключ в том же запросе, поступайте так unset_tempdata():
$this->session->unset_tempdata('item');
Уничтожение сессии
Для очистки текущей сессии (например, во время выхода из системы), вы можете просто использовать любую PHP функцию session_destroy() или sess_destroy() метож. Оба они делают одно действие:
session_destroy();
// или
$this->session->sess_destroy();
Примечание
Это должна быть последняя операция, которую вы делаете в течение того же запроса. Все данные сессии (включая flashdata и tempdata) будут безвозвратно уничтожены и функции будут непригодными для использования в течение того же запроса после уничтожения сессии.
Доступ к метаданным сессии
В предыдущих версиях CodeIgniter, массив данных сессии включал 4 элемента по умолчанию: ‘session_id’, ‘ip_address’, ‘user_agent’, ‘last_activity’.
Это было обусловлено спецификой работы сессий, но сейчас в этом уже нет необходимости с нашей новой реализацией. Однако, может случиться так, что ваше предыдущее приложение опиралось на эти установки, так вот альтернативные методы доступа к ним:
- session_id: session_id()
- ip_address: $_SERVER['REMOTE_ADDR']
- user_agent: $this->input->user_agent() (неиспользуется сессиями)
- last_activity: Зависит от хранения, не прямолинейно. К сожалению!
Параметры сессии
Для CodeIgniter обычно, чтобы все работало из коробки. Однако сессии очень чувствительный компонент любого приложения, поэтому некоторые настройки необходимо выполнить. Пожалуйста, не торопитесь, рассмотрите все варианты и их последствия.
Вы найдете следующие настройки сессии, в application/config/config.php файле:
Предпочтения | По умолчанию | Варианты | Описание |
---|---|---|---|
sess_driver | files | files/database/redis/memcached/custom | Драйвер хранения сессий. |
sess_cookie_name | ci_session | Только [A-Za-z_-] символы | Имя, используемое для куки сессии. |
sess_expiration | 7200 (2 часа) | Время в секундах (число) | Количество секунд "жизни" сессии. Если вы хотите бессрочную сессии (до закрытия браузера) установите значение ноль: 0 |
sess_save_path | NULL | Нет | Задает место хранения, зависит от используемого драйвера. |
sess_match_ip | FALSE | TRUE/FALSE (булево) | Нужно ли проверять IP адрес пользователя при чтении файла сессии. Обратите внимание, что некоторые провайдеры динамически меняют IP, поэтому если хотите сессиию с неограниченным сроком действия, установите это значение в FALSE. |
sess_time_to_update | 300 | Время в секундах (число) | Этот параметр определяет, как часто класс сессии будет самовосстанавливаться и создать новый идентификатор сессии. Установка в 0 отключает код сеанса регенерации. |
sess_regenerate_destroy | FALSE | TRUE/FALSE (булево) | Следует ли уничтожить данные сеанса, связанного со старым ID сессии при автоматической регенерации идентификатора сессии. Если задано значение FALSE, данные будут позже удалены сборщиком мусора. |
Примечание
В качестве последнего средства, библиотека сессий постарается получить сессию из параметров INI PHP настроек, как наследие CI параметров, таких как ‘sess_expire_on_close’ когда любой из вышеперечисленных методов не настроен. Однако вам не следует полагаться на такое поведение, так как это может привести к неожиданным результатам или быть изменено в будущем. Пожалуйста настройте все правильно.
Кроме вышеуказанных значений, куки (cookies) и родные драйвера принимают следующие значения конфигурации классов вводный и безопасности:
Предпочтения | По умолчанию | Описание |
---|---|---|
cookie_domain | ‘’ | Домен, для которого будет применина сессия |
cookie_path | / | Путь к сессии |
cookie_secure | FALSE | Создавать ли файл куки (cookie) сессии только на зашифрованных (HTTPS) соединениях |
Примечание
Настройка ‘cookie_httponly’ не влияет на сессии. HttpOnly параметр включен всегда, по соображениям безопасности. Кроме того, ‘cookie_prefix’ настройка полностью игнорируется.
Драйверы сессии
Как уже говорилось, библиотека сессия содержит 4 драйвера или движка хранения, которые можно использовать:
- файлы
- база данных
- redis
- memcached
По умолчанию будет использоваться драйвер файлов при инициализации сессии, потому что это самый безопасный вариант и должен работать везде (так как практически в каждой ОС имеется файловая система).
Любой другой драйвер может быть выбран в строке $config['sess_driver'] файла application/config/config.php, если вы решили сделать это. Имейте это в виду, каждый драйвер имеет свои недостатки, поэтому обязательно ознакомтесь с ними ниже, прежде чем сделать выбор.
Кроме того, вы можете создавать и использовать собственные драйвера, если наши не удовлетворяют ваши потребности.
Примечание
В предыдущих версиях CodeIgniter, был другой “драйвер куки” и в единственном варианте - мы получили негативные отзывы за не предоставление иных вариантов. Хотя мы принимаем во внимание обратную связь от сообщества, мы хотим предупредить вас, что он был удален по соображениям безопасности и мы НЕ советуем пытаться возродить его через специальный драйвер.
Драйвер файла
Драйвер ‘файлов’ использует файловую систему для хранения данных сессии.
Можно с уверенностью сказать, что он работает так же, как собственная реализация сессии в PHP, но если это для вас важно, то имейте в виду, что это на самом деле не один и тот же код и он имеет некоторые ограничения (и преимущества).
Чтобы быть более конкретным, он не поддерживает РНР уровни директорий и форматы, используемые в режиме session.save_path, и он имеет большинство опций жесткой безопасности. Вместо этого, поддерживаются только абсолютные пути $config['sess_save_path'].
Еще одна важная вещь которую вы должны знать: убедитесь, что не пользуетесь общим каталогом для хранения файлов сессий. Убедитесь, что только вы имеете доступ для получения содержимогог выбранного вами sess_save_path каталога. В противном случае, любой, сможет украсть любой из файлов текущих сеансов (также известно как атака “фиксации сессии”).
В UNIX подобных системах, это достигается путем установки прав доступа 0700 на каталог используя chmod команду, которая позволяет только владельцу каталога выполнять операций чтения и записи в нее. Но будьте осторожны, потому что пользователь системы запускаемого скрипта, как правило является ‘www-data’, поэтому устанавливайте права доступа невозможных для взлома приложения.
Вы должны сделать что-то подобное, в зависимости от среды
mkdir /<path to your application directory>/sessions/
chmod 0700 /<path to your application directory>/sessions/
chown www-data /<path to your application directory>/sessions/
Полезный Совет
Некоторые из вас выберут другой драйвер сессии вместо хранения данных в файлах, так как этот драйвер медленнее. Это правдиво лишь от части.
Очень просто проверить что SQL база данных работает быстрее, но в 99% случаев, это верно только пока у вас есть только несколько текущих сессий. При увеличении числа сессий, увеличивается и нагрузка на сервер - что является причиной, когда это имеет значение - файловая система будет постоянно опережать практически все реляционные базы данных.
Кроме того, если производительность - ваша основная забота, вы можете взглянуть на использование tmpfs, (внимание: внешний ресурс), который может сделать сессии молниеносными.
Драйвер базы данных
Драйвер ‘базы данных’ использует реляционные базы данных, такие как MySQL или PostgreSQL для хранения сессий. Это популярный выбор среди многих пользователей, поскольку он дает разработчику простоту доступа к данным сессии внутри приложения - это просто еще одна таблица в базе данных.
Однако, есть некоторые условия, которые должны быть выполнены:
- Подключается только база данных по умолчанию (или та к который установлен доступ $this->db из ваших контроллеров).
- У вас должен быть включен Построитель запросов
- Вы НЕ можете использовать постоянное соединение.
- Вы НЕ можете использовать соединение с включенным cache_on параметром.
Для того, чтобы использовать драйвер сессий ‘базы данных’, также необходимо создать эту таблицу, как мы уже упоминали, а затем установить её в качестве $config['sess_save_path'] значения. Например, если вы хотите использовать ‘ci_sessions’ как имя вашей таблицы, вы можете сделать это так:
$config['sess_driver'] = 'database';
$config['sess_save_path'] = 'ci_sessions';
Примечание
Если вы выполнили обновление с предыдущей версии CodeIgniter и у вас не настроен ‘sess_save_path’, тогда библиотека сессии будет искать старую ‘sess_table_name’ настройку для использования. Пожалуйста, не полагайтесь на это поведение, так как будет удалено в будущем.
Ну и конечно же создание таблицы базы данных ...
Для MySQL:
CREATE TABLE IF NOT EXISTS `ci_sessions` (
`id` varchar(40) NOT NULL,
`ip_address` varchar(45) NOT NULL,
`timestamp` int(10) unsigned DEFAULT 0 NOT NULL,
`data` blob NOT NULL,
KEY `ci_sessions_timestamp` (`timestamp`)
);
Для PostgreSQL:
CREATE TABLE "ci_sessions" (
"id" varchar(40) NOT NULL,
"ip_address" varchar(45) NOT NULL,
"timestamp" bigint DEFAULT 0 NOT NULL,
"data" text DEFAULT '' NOT NULL
);
CREATE INDEX "ci_sessions_timestamp" ON "ci_sessions" ("timestamp");
Вам также нужно будет добавить PRIMARY KEY в зависимости от вашей ‘sess_match_ip’ настройки. Приведенные ниже примеры работают как для MySQL так и для PostgreSQL:
// Когда sess_match_ip = TRUE
ALTER TABLE ci_sessions ADD PRIMARY KEY (id, ip_address);
// Когда sess_match_ip = FALSE
ALTER TABLE ci_sessions ADD PRIMARY KEY (id);
// До удаления ранее созданного первичного ключа (используется при изменении параметра)
ALTER TABLE ci_sessions DROP PRIMARY KEY;
Важно
Только MySQL и PostgreSQL базы данных официально поддерживаются, из-за отсутствия документации по блокирующим механизмам на других платформах. Использование сеансов без блокировки может вызвать всевозможные проблемы, особенно интенсивное использование AJAX, и мы не будем поддерживать в таких случаях. Используйте session_write_close() после того как вы сделали обработку данных сессии и у вас возникли проблемы с производительностью.
Redis драйвер
Примечание
С тех пор как Redis не имеет блокируещего механизма, блокировка для этого драйвера эмулируются отдельным значением, которое состовляет до 300 секунд.
Механизм хранения Redis обычно используется для кэширования и популярен благодаря своей высокой производительности, которая тоже использует ‘redis’ драйвер сессий.
Недостатком является то, что он не так вездесущ, как реляционные базы данных и требует phpredis PHP расширения, установленного на вашей системе, которое не поставляется в комплекте с PHP. Скорее всего вы будете его использовать, только если вы уже знакомы с Redis и использовали его для других целей.
Так же как и драйверы ‘файлов’ и ‘базы данных’, вы также должны настроить место хранения сессий в $config['sess_save_path'] настройке. Здесь формат немного другой и сложнее одновременно. Хорошо описано phpredis расширение в README файле, так что мы просто дадим ссылку на него:
Внимание
Библиотека сессий CodeIgniter НЕ использует актуальную версию ‘redis’ session.save_handler. Обратите внимание только на формат пути в ссылке выше.
Наиболее распространенный случай, достаточно просто host:port пары:
$config['sess_driver'] = 'redis';
$config['sess_save_path'] = 'tcp://localhost:6379';
Memcached драйвер
Примечание
С тех пор как Memcache не имеет блокируещего механизма, блокировка для этого драйвера эмулируются отдельным значением, которое состовляет до 300 секунд.
Драйвер ‘memcached’ очень схож с ‘redis’ и обладает всеми нужными свойствами, кроме доступности, потому что PHP расширение Memcached распространяется через PECL и некоторые Linux дистрибутивы делают его доступным после простой установки пакета.
Кроме этого нет каких либо существенных отклонений от Redis, необходимо сказать о Memcached - это также популярный продукт, который обычно используется для кэширования и славится своей скоростью.
Однако, стоит отметить, что единственная гарантия Memcached это то что значение X истекает после Y секунд, другими словами, результат будет удален через Y секунд (но не обязательно, что оно не истечет ранее указанного времени). Это бывает очень редко, но следует учитывать, так как это может привести к потере сессий.
Формат $config['sess_save_path'] здесь довольно прост - соответствует host:port паре:
$config['sess_driver'] = 'memcached';
$config['sess_save_path'] = 'localhost:11211';
Полезный Совет
Мультисерверная конфигурации с дополнительным параметром weight в качестве третьего двоеточия (:weight) также поддерживается, но мы должны отметить, что мы не проверяли на надежность.
Если вы хотите поэкспериментировать с этой функцией (на свой страх и риск), просто расделите путь сервера запятыми:
// localhost будет иметь повышенный приоритет (5),
// по сравнению с 192.0.2.1 с weight равным 1.
$config['sess_save_path'] = 'localhost:11211:5,192.0.2.1:11211:1';
Пользовательские драйверы
Вы также можете создавать свои собственные, пользовательские драйверы сессии. Имейте в виду, что это не простая задача, так как это требует много знаний, чтобы сделать это правильно.
Нужно знать не только как работают сессии в целом, но и как они работают конкретно в PHP, как работает механизм хранилища, как обрабатывать параллелизм, во избежание взаимоблокировок (но не за счет ОТСУТСТВИЯ блокировок) и последнее, но не менее важное - уметь справиться с потенциальными проблемами безопасности, что является далеко не тривиальным.
Короче говоря - если вы не знаете, как это сделать это в PHP, вы должны делать это средствами CodeIgniter. Вас предупредили.
Если вы хотите добавить некоторые дополнительные функции для сессий, просто расширить базовый класс сессии, что сделать намного проще. Прочтите статью создание библиотек чтобы научиться делать это.
Теперь к делу - есть три основных правила, которым нужно следовать при создании драйвера сессии для CodeIgniter:
Положите файл драйвера в application/libraries/Session/drivers/ и следуйте правилам именования файла класса сессии.
Например, если вы хотите создать ‘dummy’ драйвер, ваш класс должен называться Session_dummy_driver, который объявляется в application/libraries/Session/drivers/Session_dummy_driver.php.
Расширение CI_Session_driver класса.
Это просто базовый класс с несколькими внутренние вспомогательные методами. Он также расширяется, как и любой другой класс, если вам действительно нужно это сделать, мы не будем объяснять, как ... если вы знакомы с тем как работают расширения/переопределения класса в CI, можно считать вы сможете это сделать. Если нет - ты не должен делать это в первую очередь.
Реализация SessionHandlerInterface интерфейса.
Примечание
Вы можете заметить, что SessionHandlerInterface обеспечивается PHP начиная с версии 5.4.0. CodeIgniter автоматически объявит интерфейс, если вы используете старую версию PHP.
Ссылка объяснить что и как.
Поэтому, опираясь на наш ‘dummy’ драйвер (пример выше), должно получиться в итоге что-то вроде этого:
// application/libraries/Session/drivers/Session_dummy_driver.php:
class CI_Session_dummy_driver extends CI_Session_driver implements SessionHandlerInterface
{
public function __construct(&$params)
{
// НЕ забудьте это
parent::__construct($params);
// Конфигурация и остальные настройки
}
public function open($save_path, $name)
{
// Инициализируем механизм установки (подключение)
}
public function read($session_id)
{
// Чтение данных сессии (если есть), создаем блокировки
}
public function write($session_id, $session_data)
{
// Создать / обновить данные сессии (она не может существовать!)
}
public function close()
{
// Снимаем блокировку, закрываем соединение / потоки / и тд.
}
public function destroy($session_id)
{
// Вызываем close() метод и уничтожаем данные для текущей сессии (порядок может отличаться)
}
public function gc($maxlifetime)
{
// Удалить данные стекших сессий
}
}
Если вы все сделали правильно, теперь вы можете установить значение sess_driver в ‘dummy’ и использовать свой собственный драйвер. Поздравляем!
Справка класса
- class CI_Session
- userdata([$key = NULL])
Параметры: - $key (смешанный) – Ключ элемента сессии или NULL
Возвращает: Значение указанного ключа элемента, или массив всех пользовательских данных
Возвращаемый тип: смешанный
Получает значение определенного $_SESSION элемента или массив всех “userdata” элементов если без ключа.
Примечание
Этот способ наследия сохранен только для совместимости со старыми приложениями. Вам следует напрямую обращаться к $_SESSION.
- all_userdata()
Возвращает: Весь массив userdata Возвращаемый тип: массив Возвращает массив, содержащий все “userdata” элементы.
Примечание
Этот метод УСТАРЕЛ. Используйте userdata() без параметров.
- &get_userdata()
Возвращает: Ссылку на $_SESSION Возвращаемый тип: массив Возвращает ссылку на $_SESSION массив.
Примечание
Этот способ наследия сохранен только для совместимости со старыми приложениями.
- has_userdata($key)
Параметры: - $key (строка) – Ключ элемента сессии
Возвращает: TRUE если указанный ключ существует, FALSE если нет
Возвращаемый тип: булево
Проверяет, если элемент существует в $_SESSION.
Примечание
Этот способ наследия сохранен только для совместимости со старыми приложениями. Это просто псевдоним для isset($_SESSION[$key]) - пожалуйста, используйте его.
- set_userdata($data[, $value = NULL])
Параметры: - $data (смешанный) – Массив пар ключ/значение для установки данных сессии или ключ для одного элемента
- $value (смешанный) – Значение для установки конкретного элемента сессии, если $data - ключ
Возвращаемый тип: пустота
Присваивает данные суперглобальной $_SESSION.
Примечание
Этот способ наследия сохранен только для совместимости со старыми приложениями.
- unset_userdata($key)
Параметры: - $key (смешанный) – Ключ к элементу данных сессии для удаления или массив ключей
Возвращаемый тип: пустота
Удаляет указанный ключ(и) из суперглобальной $_SESSION.
Примечание
Этот способ наследия сохранен только для совместимости со старыми приложениями. Это просто псевдоним для unset($_SESSION[$key]) - пожалуйста, используйте его.
- mark_as_flash($key)
Параметры: - $key (смешанный) – Пометить ключи как flashdata или массив ключей
Возвращает: TRUE при успехе, FALSE при неудаче
Возвращаемый тип: булево
Помечает $_SESSION ключ (или несколько) как “flashdata”.
- get_flash_keys()
Возвращает: Массив ключей содержащие все “flashdata” элементы. Возвращаемый тип: массив Получает список всех $_SESSION которые были отмечены как “flashdata”.
- umark_flash($key)
Параметры: - $key (смешанный) – Ключ для снятия отметки flashdata или массив ключей
Возвращаемый тип: пустота
Снимает метки $_SESSION ключей (или нескольких) “flashdata”.
- flashdata([$key = NULL])
Параметры: - $key (смешанный) – Ключ Flashdata или NULL
Возвращает: Значение указанного ключа продукта, или массив всех flashdata
Возвращаемый тип: смешанный
Получает значение определенного $_SESSION элемента, который был отмечен как “flashdata” или массив значений “flashdata”, если ключ не был указан.
Примечание
Этот способ наследия сохранен только для совместимости со старыми приложениями. Вам следует напрямую обращаться к $_SESSION.
- keep_flashdata($key)
Параметры: - $key (смешанный) – Flashdata хранить ключ или массив с несколькими ключами
Возвращает: TRUE при успехе, FALSE при неудаче
Возвращаемый тип: булево
Сохраняет указанные данные сессий как “flashdata” до следующего запроса.
Примечание
Этот способ наследия сохранен только для совместимости со старыми приложениями. Это просто псевдоним mark_as_flash() метода.
- set_flashdata($data[, $value = NULL])
Параметры: - $data (смешанный) – Массив пар ключ/значение для установки flashdata, или ключ для одного элемента
- $value (смешанный) – Значение для установки конкретного элемента сессии, если $data - ключ
Возвращаемый тип: пустота
Присваивает данные суперглобальной $_SESSION и помечает их как “flashdata”.
Примечание
Этот способ наследия сохранен только для совместимости со старыми приложениями.
- mark_as_temp($key[, $ttl = 300])
Параметры: - $key (смешанный) – Помечает ключ как tempdata или массив ключей
- $ttl (число) – Время жизни значения tempdata в секундах
Возвращает: TRUE при успехе, FALSE при неудаче
Возвращаемый тип: булево
Помечает $_SESSION ключевой элемент (или несколько), как “tempdata”.
- get_temp_keys()
Возвращает: Массив, содержащий все ключи элементов “tempdata”. Возвращаемый тип: массив Получает список всех элементов $_SESSION которые были отмечены как “tempdata”.
- umark_temp($key)
Параметры: - $key (смешанный) – Ключ для снятия отметки tempdata или массив с несколькими ключами
Возвращаемый тип: пустота
Снимает отметку $_SESSION элемента ключа (или нескольких), как “tempdata”.
- tempdata([$key = NULL])
Параметры: - $key (смешанный) – Tempdata элемент ключа или NULL
Возвращает: Значение указанного ключа элемента или массив всех tempdata
Возвращаемый тип: смешанный
Получает значение определенного $_SESSION элемента помеченного как “tempdata” или массив всех “tempdata” элементов, если ключ не был указан.
Примечание
Этот способ наследия сохранен только для совместимости со старыми приложениями. Вам следует напрямую обращаться к $_SESSION.
- set_tempdata($data[, $value = NULL])
Параметры: - $data (смешанный) – Массив пар ключ/значение для пометки как tempdata или ключ для одного элемента
- $value (смешанный) – Значение для установки конкретного элемента сессии, если $data - ключ
- $ttl (число) – Время жизни значения tempdata элемента(ов) в секундах
Возвращаемый тип: пустота
Присваивает данные суперглобальной $_SESSION и помечает их как “tempdata”.
Примечание
Этот способ наследия сохранен только для совместимости со старыми приложениями.
- sess_regenerate([$destroy = FALSE])
Параметры: - $destroy (булево) – Следует ли уничтожить данные сессии
Возвращаемый тип: пустота
Регенерирует ID сессии, при необходимости уничтожает данных текущей сессии.
Примечание
Этот метод является псевдонимом для родной PHP session_regenerate_id() функции.
- sess_destroy()
Возвращаемый тип: пустота Уничтожает текущую сессию.
Примечание
Это должно быть последней функцией сессии которую вы вызываете. Все данные сессии будут потеряны, после этого.
Примечание
Этот метод является псевдонимом для родной PHP session_destroy() функции.
- __get($key)
Параметры: - $key (строка) – Ключевой элемент сессии
Возвращает: Запрошенный элемент данных сессии или значение NULL, если он не существует
Возвращаемый тип: смешанный
Волшебный способ, который позволяет использовать $this->session->item вместо $_SESSION['item'] если вы пожелаете.
Он также вернет ID сессии как после вызова session_id(), если вы вызовите $this->session->session_id.
- __set($key, $value)
Параметры: - $key (строка) – Ключевой элемент сессии
- $value (смешанный) – Значение для присвоения элементу ключа сессии
Возвращает: пустота
Волшебный способ, который позволяет использовать $_SESSION вызывая $this->session свойство:
$this->session->foo = 'bar'; // Результат: // $_SESSION['foo'] = 'bar';