Библиотека сессий
Класс Session позволяет вам сохранять «состояние» пользователя и отслеживать его активность во время просмотра вашего сайта.
CodeIgniter поставляется с несколькими драйверами хранения сессий:
- files (по умолчанию; на основе файловой системы)
- база данных
- redis
- memcached
Кроме того, вы можете создать собственные пользовательские драйверы сессий, основанные на других типах хранения, сохраняя при этом преимущества возможностей класса Session.
- Использование класса Session
- Ссылка на класс
Использование класса Session
Инициализация сессии
Сессии обычно выполняются глобально при каждом открытии страницы, поэтому класс Session должен быть инициализирован в конструкторах вашего контроллера или может быть автозагружен системой. В основном, класс сессии работает в фоновом режиме, поэтому простое инициализирование класса заставит его считывать, создавать и обновлять сессии при необходимости.
Для ручного инициализирования класса Session в конструкторе контроллера используйте метод $this->load->library().
$this->load->library('session');
После загрузки объект библиотеки Session будет доступен с помощью:
$this->session
Важно
Поскольку класс Loader инициализируется базовым контроллером CodeIgniter, убедитесь, что вы вызываете parent::__construct() перед попыткой загрузить библиотеку внутри конструктора контроллера.
Как работают сессии?
Когда загружается страница, класс сессии проверяет, отправлен ли браузером пользователя действительный куки сессии. Если куки сессии не существует (или если он не совпадает с сохраненным на сервере или истек), будет создана и сохранена новая сессия.
Если действительная сессия существует, её информация будет обновлена. При каждом обновлении идентификатор сессии может быть сгенерирован заново, если это настроено.
Важно понимать, что после инициализации класс Session работает автоматически. Вам ничего не нужно делать, чтобы вызвать вышеописанное поведение. Как вы увидите ниже, вы можете работать с данными сессии, но процесс чтения, записи и обновления сессии происходит автоматически.
Примечание
В консоли (CLI) библиотека Session автоматически останавливается, так как это концепция, основанная исключительно на протоколе HTTP.
Примечание о конкурентности
Если вы не разрабатываете сайт с интенсивным использованием AJAX, можете пропустить этот раздел. Однако, если у вас возникают проблемы с производительностью, эта заметка именно то, что вам нужно.
Сессии в предыдущих версиях CodeIgniter не реализовывали блокировку, что означало, что два HTTP-запроса, использующие одну и ту же сессию, могли выполняться одновременно. Проще говоря, запросы были неблокирующими.
Однако, неблокирующие запросы в контексте сессий также означают небезопасность, поскольку изменения данных сессии (или перегенерация идентификатора сессии) в одном запросе могут повлиять на выполнение второго, одновременного запроса. Этот момент лежал в основе многих проблем и был основной причиной того, почему в CodeIgniter 3.0 была полностью переписана библиотека Session.
Почему мы вам об этом говорим? Потому что, скорее всего, после поиска причины проблем с производительностью, вы можете заключить, что проблема в блокировке, и поэтому попытаетесь убрать блокировки…
НЕ ДЕЛАЙТЕ ЭТОГО! Удаление блокировок будет неправильным и принесёт вам ещё больше проблем!
Проблема не в блокировке, а в решении. Ваша проблема в том, что вы всё ещё держите сессию открытой, хотя уже обработать её и больше в ней не нуждаетесь. Поэтому вам нужно закрыть сессию для текущего запроса, как только вы больше в ней не нуждаетесь.
Короче говоря - вызовите session_write_close() как только вам больше не нужны переменные сессии.
Что такое данные сессии?
Данные сессии — это просто массив, связанный с определённым идентификатором сессии (куки).
Если вы раньше работали с сессиями в PHP, вам должно быть знакомо PHP-сверхглобальное переменная $_SESSION (если нет, пожалуйста, прочтите контент по этой ссылке).
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() возвращает NULL, если элемента, к которому вы пытаетесь получить доступ, не существует.
Если вы хотите получить все существующие данные пользователя, вы можете просто опустить ключ элемента (магический геттер работает только для свойств):
$_SESSION // or: $this->session->userdata();
Добавление данных сессии
Предположим, конкретный пользователь вошёл на ваш сайт. После аутентификации вы можете добавить его имя пользователя и адрес электронной почты в сессию, сделав эти данные доступными глобально, без необходимости выполнения запроса к базе данных, когда вам они понадобятся.
Вы можете просто присвоить данные массиву $_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():
// returns FALSE if the 'some_name' item doesn't exist or is NULL, // TRUE otherwise: isset($_SESSION['some_name'])
Или вы можете вызвать has_userdata():
$this->session->has_userdata('some_name');
Удаление данных сессии
Так же, как и с любой другой переменной, сброс значения в $_SESSION можно выполнить с помощью unset():
unset($_SESSION['some_name']);
// or multiple values:
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'));
Временные данные
CodeIgniter также поддерживает «временные данные» или данные сессии со строком действия. После истечения срока действия значения, истечения срока действия сессии или удаления сессии, значение автоматически удаляется.
Аналогично переменным flashdata, переменные tempdata являются обычными переменными сессии, помеченными определенным образом под ключом «__ci_vars» (снова, не трогайте его).
Чтобы пометить существующий элемент как «временные данные», просто передайте его ключ и срок действия (в секундах!) в метод mark_as_temp():
// 'item' will be erased after 300 seconds
$this->session->mark_as_temp('item', 300);
Вы можете пометить несколько элементов как временные данные двумя способами, в зависимости от того, хотите ли вы, чтобы у всех них был одинаковый срок действия:
// Both 'item' and 'item2' will expire after 300 seconds
$this->session->mark_as_temp(array('item', 'item2'), 300);
// 'item' will be erased after 300 seconds, while 'item2'
// will do so after only 240 seconds
$this->session->mark_as_temp(array(
'item' => 300,
'item2' => 240
));
Для добавления временных данных:
$_SESSION['item'] = 'value';
$this->session->mark_as_temp('item', 300); // Expire in 5 minutes
Или, как альтернативу, используя метод 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 минут).
Для чтения переменной временных данных, вы можете получить доступ к ней через суперглобальный массив $_SESSION:
$_SESSION['item']
Важно
Метод userdata() НЕ вернёт элементы временных данных.
Или, если вы хотите быть уверены, что читаете «временные данные» (а не любые другие), вы также можете использовать метод tempdata():
$this->session->tempdata('item');
И, конечно же, если вы хотите извлечь все существующие временные данные:
$this->session->tempdata();
Примечание
Метод tempdata() возвращает NULL, если элемент не найден.
Если вам нужно удалить значение временных данных до его истечения, вы можете непосредственно удалить его из массива $_SESSION:
unset($_SESSION['item']);
Однако это не удалит метку, которая делает этот конкретный элемент временными данными (он будет недействителен при следующем HTTP-запросе), поэтому если вы намерены повторно использовать тот же ключ в том же запросе, вам следует использовать unset_tempdata():
$this->session->unset_tempdata('item');
Уничтожение сессии
Чтобы очистить текущую сессию (например, при выходе), вы можете просто использовать функцию PHP session_destroy() или метод sess_destroy(). Оба будут работать одинаково:
session_destroy(); // or $this->session->sess_destroy();
Примечание
Это должна быть последняя операция, связанная с сессией, которую вы выполняете в рамках одного запроса. Все данные сессии (включая flashdata и временные данные) будут уничтожены и функции будут непригодны к использованию в рамках того же запроса после уничтожения сессии.
Доступ к метаданным сессии
В предыдущих версиях 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_-] | Имя, используемое для cookie сессии. |
| sess_expiration | 7200 (2 часа) | Время в секундах (целое число) | Количество секунд, в течение которых должна действовать сессия. Если вы хотите, чтобы сессия была без срока действия (до закрытия браузера), установите значение в ноль: 0 |
| sess_save_path | NULL | Нет | Указывает расположение хранения, зависит от используемого драйвера. |
| sess_match_ip | FALSE | TRUE/FALSE (булево) | Определяет, нужно ли проверять IP-адрес пользователя при чтении cookie сессии. Обратите внимание, что некоторые провайдеры динамически изменяют IP-адрес, поэтому если вы хотите сессию без срока действия, скорее всего, вы установите это значение в FALSE. |
| sess_time_to_update | 300 | Время в секундах (целое число) | Этот параметр контролирует частоту регенерации класса сессии и создания нового идентификатора сессии. Установка значения 0 отключит регенерацию идентификатора сессии. |
| sess_regenerate_destroy | FALSE | TRUE/FALSE (булево) | Указывает, нужно ли уничтожить данные сессии, связанные со старым идентификатором сессии, при автоматической регенерации идентификатора сессии. При значении FALSE данные будут удалены позже сборщиком мусора. |
Примечание
В качестве последнего средства, библиотека сессий будет пытаться получить настройки INI PHP, связанные с сессией, а также устаревшие настройки CI, такие как «sess_expire_on_close», если ни один из вышеперечисленных параметров не настроен. Однако вы никогда не должны полагаться на такое поведение, так как оно может привести к непредсказуемым результатам или быть изменено в будущем. Пожалуйста, правильно настройте всё.
В дополнение к вышеперечисленным значениям, для драйверов cookie и native применяются следующие значения конфигурации, общие для классов Ввода и Безопасности:
| Настройка | Значение по умолчанию | Описание |
|---|---|---|
| cookie_domain | ‘’ | Домен, для которого применима сессия |
| cookie_path | / | Путь, для которого применима сессия |
| cookie_secure | FALSE | Указывает, нужно ли создавать cookie сессии только для зашифрованных (HTTPS) соединений |
Примечание
Настройка «cookie_httponly» не влияет на сессии. Вместо этого параметр HttpOnly всегда включен по соображениям безопасности. Кроме того, настройка «cookie_prefix» полностью игнорируется.
Драйверы сессий
Как уже упоминалось, библиотека сессий поставляется с 4 драйверами или движками хранения, которые вы можете использовать:
- files
- database
- redis
- memcached
По умолчанию при инициализации сессии будет использоваться драйвер Files Driver, потому что он является наиболее безопасным выбором и должен работать везде (практически в любой среде есть файловая система).
Однако любой другой драйвер может быть выбран с помощью строки $config['sess_driver'] в файле application/config/config.php, если вы решите это сделать. Однако имейте в виду, что каждый драйвер имеет свои особенности, поэтому обязательно ознакомьтесь с ними (ниже), прежде чем принимать такое решение.
Кроме того, вы также можете создавать и использовать Custom Drivers, если стандартные драйверы не удовлетворяют ваши потребности.
Примечание
В предыдущих версиях CodeIgniter единственным вариантом был другой драйвер «cookie», и мы получили негативные отзывы за то, что не предлагали этот вариант. Хотя мы и прислушиваемся к отзывам сообщества, мы хотим предупредить вас, что он был удалён, потому что является **небезопасным**, и мы советуем вам НЕ пытаться воспроизвести его с помощью пользовательского драйвера.
Драйвер файлов
Драйвер «files» использует вашу файловую систему для хранения данных сессии.
Можно с уверенностью сказать, что он работает точно так же, как и собственная реализация сессий PHP, но если это важная деталь для вас, помните, что это не тот же код, и у него есть некоторые ограничения (и преимущества).
Точнее, он не поддерживает форматы уровней и режимов каталогов 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 (предупреждение: внешний ресурс), что может значительно ускорить ваши сессии.
Драйвер базы данных
Драйвер «database» использует реляционную базу данных, такую как MySQL или PostgreSQL, для хранения сессий. Это популярный выбор среди многих пользователей, потому что он позволяет разработчику легко получить доступ к данным сессии в приложении — это просто еще одна таблица в вашей базе данных.
Однако необходимо соблюдать некоторые условия:
- Можно использовать только ваше стандартное подключение к базе данных (или то, к которому вы обращаетесь как
$this->dbиз ваших контроллеров). - Вы должны иметь включенный Построитель запросов.
- Вы не можете использовать постоянное подключение.
- Вы не можете использовать подключение с включенным параметром cache_on.
Для использования драйвера сессий «database» вам также необходимо создать упомянутую таблицу и установить ее в качестве значения $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(128) 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(128) 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");
Вам также потребуется добавить первичный ключ, в зависимости от вашего параметра «sess_match_ip». Приведённые ниже примеры работают как в MySQL, так и в PostgreSQL:
// When sess_match_ip = TRUE ALTER TABLE ci_sessions ADD PRIMARY KEY (id, ip_address); // When sess_match_ip = FALSE ALTER TABLE ci_sessions ADD PRIMARY KEY (id); // To drop a previously created primary key (use when changing the setting) ALTER TABLE ci_sessions DROP PRIMARY KEY;
Важно
Официально поддерживаются только базы данных MySQL и PostgreSQL из-за отсутствия механизмов консультационных блокировок на других платформах. Использование сессий без блокировок может вызвать различные проблемы, особенно при интенсивном использовании AJAX, и мы не будем поддерживать такие случаи. Используйте session_write_close() после обработки данных сессий, если у вас возникают проблемы с производительностью.
Драйвер Redis
Примечание
Поскольку Redis не имеет открытого механизма блокировки, блокировки для этого драйвера эмулируются с помощью отдельного значения, которое хранится до 300 секунд.
Redis — это движок хранения, обычно используемый для кэширования, и он популярен благодаря высокой производительности, которая, вероятно, и является причиной использования вами драйвера сессий «redis».
Недостатком является то, что он не так распространён, как реляционные базы данных, и требует установки PHP-расширения phpredis на вашей системе, а оно не входит в стандартный PHP. Вероятнее всего, вы будете использовать драйвер «redis» только в том случае, если вы уже знакомы с Redis и используете его для других целей.
Как и в случае с драйверами «files» и «database», вы также должны настроить местоположение хранения сессий с помощью параметра $config['sess_save_path']. Здесь формат немного другой и одновременно сложный. Лучше всего его объяснить в файле README расширения phpredis, поэтому мы просто дадим вам ссылку:
Предупреждение
Библиотека сессий CodeIgniter НЕ использует фактический «redis» session.save_handler. Обратите внимание только на формат пути в ссылке выше.
Однако в большинстве случаев достаточно простой пары host:port.
$config['sess_driver'] = 'redis'; $config['sess_save_path'] = 'tcp://localhost:6379';
Драйвер Memcached
Примечание
Поскольку Memcache не предоставляет открытого механизма блокировки, блокировки для этого драйвера эмулируются с помощью отдельного значения, которое хранится до 300 секунд.
Драйвер «memcached» очень похож на драйвер «redis» по всем свойствам, за исключением, пожалуй, доступности, поскольку расширение Memcached 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 will be given higher priority (5) here, // compared to 192.0.2.1 with a weight of 1. $config['sess_save_path'] = 'localhost:11211:5,192.0.2.1:11211:1';
Пользовательские драйверы
Вы также можете создать свои собственные пользовательские драйверы сессий. Однако имейте в виду, что это, как правило, нелёгкая задача, требующая глубоких знаний для надёжной реализации.
Вам нужно знать не только то, как работают сессии в целом, но и как они работают в PHP, как работает подлежащий механизм хранения, как обрабатывать параллельность, избегать тупиков (но НЕ из-за отсутствия блокировок) и, наконец, как обрабатывать потенциальные проблемы безопасности, что далеко не тривиально.
Короче говоря, если вы ещё не знаете, как это сделать на чистом PHP, то не стоит пытаться сделать это в CodeIgniter. Вас предупредили.
Если вы хотите лишь добавить некоторую дополнительную функциональность в сессии, просто расширьте базовый класс Session, что намного проще. Прочитайте статью Создание библиотек, чтобы узнать, как это сделать.
Итак, существуют три общих правила, которых нужно придерживаться при создании драйвера сессий для CodeIgniter:
-
Поместите файл вашего драйвера в папку application/libraries/Session/drivers/ и следуйте соглашениям об именовании, используемым классом Session.
Например, если вы создадите драйвер «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)
{
// DO NOT forget this
parent::__construct($params);
// Configuration & other initializations
}
public function open($save_path, $name)
{
// Initialize storage mechanism (connection)
}
public function read($session_id)
{
// Read session data (if exists), acquire locks
}
public function write($session_id, $session_data)
{
// Create / update session data (it might not exist!)
}
public function close()
{
// Free locks, close connections / streams / etc.
}
public function destroy($session_id)
{
// Call close() method & destroy data for current session (order may differ)
}
public function gc($maxlifetime)
{
// Erase data for expired sessions
}
}
Если вы всё сделали правильно, теперь вы можете установить значение конфигурации sess_driver в «dummy» и использовать свой собственный драйвер. Поздравляем!
Список классов
-
class CI_Session -
-
userdata([$key = NULL]) -
Параметры: - $key (mixed) – Ключ элемента сессии или NULL
Возвращает: Значение указанного ключа элемента, или массив всех элементов пользовательских данных
Тип возвращаемого значения: mixed
Получает значение для определенного элемента
$_SESSION, или массив всех элементов «пользовательских данных», если ключ не был указан.Примечание
Этот метод является устаревшим и сохранен только для обратной совместимости со старыми приложениями. Вы должны напрямую обратиться к
$_SESSIONвместо этого.
-
all_userdata() -
Возвращает: Массив всех элементов пользовательских данных Тип возвращаемого значения: array Возвращает массив, содержащий все элементы «пользовательских данных».
Примечание
Этот метод устарел. Используйте
userdata()без параметров вместо этого.
-
&get_userdata() -
Возвращает: Ссылка на $_SESSIONТип возвращаемого значения: array Возвращает ссылку на массив
$_SESSION.Примечание
Этот метод является устаревшим и сохранен только для обратной совместимости со старыми приложениями.
-
has_userdata($key) -
Параметры: - $key (string) – Ключ элемента сессии
Возвращает: TRUE, если указанный ключ существует, FALSE — если нет
Тип возвращаемого значения: bool
Проверяет, существует ли элемент в
$_SESSION.Примечание
Этот метод является устаревшим и сохранен только для обратной совместимости со старыми приложениями. Это просто псевдоним для
isset($_SESSION[$key])— используйте его вместо этого.
-
set_userdata($data[, $value = NULL]) -
Параметры: - $data (mixed) – Массив пар «ключ/значение» для установки данных сессии или ключ для одного элемента
- $value (mixed) – Значение для установки определенного элемента сессии, если $data является ключом
Тип возвращаемого значения: void
Присваивает данные глобальному
$_SESSION.Примечание
Этот метод является устаревшим и сохранен только для обратной совместимости со старыми приложениями.
-
unset_userdata($key) -
Параметры: - $key (mixed) – Ключ элемента данных сессии для удаления или массив нескольких ключей
Тип возвращаемого значения: void
Удаляет указанный(ые) ключ(и) из глобального
$_SESSION.Примечание
Этот метод является устаревшим и сохранен только для обратной совместимости со старыми приложениями. Это просто псевдоним для
unset($_SESSION[$key])— используйте его вместо этого.
-
mark_as_flash($key) -
Параметры: - $key (mixed) – Ключ для маркировки как flashdata или массив нескольких ключей
Возвращает: TRUE при успехе, FALSE при ошибке
Тип возвращаемого значения: bool
Помечает ключ элемента
$_SESSION(или несколько) как «flashdata».
-
get_flash_keys() -
Возвращает: Массив, содержащий ключи всех элементов «flashdata». Тип возвращаемого значения: array Получает список всех
$_SESSION, помеченных как «flashdata».
-
unmark_flash($key) -
Параметры: - $key (mixed) – Ключ, который нужно размечать как flashdata или массив нескольких ключей
Тип возвращаемого значения: void
Снимает метку «flashdata» с ключа элемента
$_SESSION(или нескольких).
-
flashdata([$key = NULL]) -
Параметры: - $key (mixed) – Ключ элемента flashdata или NULL
Возвращает: Значение указанного ключа элемента, или массив всех элементов flashdata
Тип возвращаемого значения: mixed
Получает значение для определенного элемента
$_SESSION, помеченного как «flashdata», или массив всех элементов «flashdata», если ключ не был указан.Примечание
Этот метод является устаревшим и сохранен только для обратной совместимости со старыми приложениями. Вы должны напрямую обратиться к
$_SESSIONвместо этого.
-
keep_flashdata($key) -
Параметры: - $key (mixed) – Ключ flashdata для сохранения или массив нескольких ключей
Возвращает: TRUE при успехе, FALSE при ошибке
Тип возвращаемого значения: bool
Сохраняет указанный ключ(и) данных сессии как «flashdata» в течение следующего запроса.
Примечание
Этот метод является устаревшим и сохранен только для обратной совместимости со старыми приложениями. Он является просто псевдонимом для метода
mark_as_flash().
-
set_flashdata($data[, $value = NULL]) -
Параметры: - $data (mixed) – Массив пар «ключ/значение» для установки как flashdata или ключ для одного элемента
- $value (mixed) – Значение для установки определенного элемента сессии, если $data является ключом
Тип возвращаемого значения: void
Присваивает данные глобальному
$_SESSIONи помечает их как «flashdata».Примечание
Этот метод является устаревшим и сохранен только для обратной совместимости со старыми приложениями.
-
mark_as_temp($key[, $ttl = 300]) -
Параметры: - $key (mixed) – Ключ для маркировки как tempdata или массив нескольких ключей
- $ttl (int) – Время жизни tempdata в секундах
Возвращает: TRUE при успехе, FALSE при ошибке
Тип возвращаемого значения: bool
Помечает ключ элемента
$_SESSION(или несколько) как «tempdata».
-
get_temp_keys() -
Возвращает: Массив, содержащий ключи всех элементов «tempdata». Тип возвращаемого значения: array Получает список всех
$_SESSION, помеченных как «tempdata».
-
-
unmark_temp($key) -
Параметры: - $key (mixed) – Ключ, который нужно разметки как временные данные, или массив нескольких ключей
Тип возвращаемого значения: void
Удаляет метку временных данных
$_SESSIONдля ключа (или нескольких ключей).
-
tempdata([$key = NULL]) -
Параметры: - $key (mixed) – Ключ элемента временных данных или NULL
Возвращает: Значение указанного ключа элемента, или массив всех временных данных
Тип возвращаемого значения: mixed
Получает значение для определенного элемента
$_SESSION, помеченного как «временные данные», или массив всех элементов «временных данных», если ключ не указан.Примечание
Этот метод является устаревшим и оставлен только для обратной совместимости со старыми приложениями. Вам следует напрямую обращаться к
$_SESSION.
-
set_tempdata($data[, $value = NULL]) -
Параметры: - $data (mixed) – Массив пар ключ/значение для установки в качестве временных данных, или ключ для одного элемента
- $value (mixed) – Значение для установки для определенного элемента сессии, если $data — это ключ
- $ttl (int) – Время жизни элемента(ов) временных данных в секундах
Тип возвращаемого значения: void
Присваивает данные суперглобальному
$_SESSIONи отмечает их как «временные данные».Примечание
Этот метод является устаревшим и оставлен только для обратной совместимости со старыми приложениями.
-
sess_regenerate([$destroy = FALSE]) -
Параметры: - $destroy (bool) – Нужно ли уничтожить данные сессии
Тип возвращаемого значения: void
Перегенерировать идентификатор сессии, необязательно уничтожая данные текущей сессии.
Примечание
Этот метод — просто псевдоним для встроенной в PHP функции session_regenerate_id().
-
sess_destroy() -
Тип возвращаемого значения: void Уничтожает текущую сессию.
Примечание
Этот метод должен быть последним вызовом, связанным с сессией. Все данные сессии будут потеряны после этого.
Примечание
Этот метод — просто псевдоним для встроенной в PHP функции session_destroy().
-
__get($key) -
Параметры: - $key (string) – Ключ элемента сессии
Возвращает: Запрашиваемый элемент данных сессии или NULL, если он не существует
Тип возвращаемого значения: mixed
Магический метод, который позволяет вам использовать
$this->session->itemвместо$_SESSION['item'], если вы предпочитаете это.Он также вернет идентификатор сессии, вызвав
session_id(), если вы попытаетесь получить доступ к$this->session->session_id.
-
__set($key, $value) -
Параметры: - $key (string) – Ключ элемента сессии
- $value (mixed) – Значение, которое нужно присвоить элементу сессии с заданным ключом
Возвращает: void
Магический метод, который позволяет вам назначать элементы
$_SESSIONпутем доступа к ним как к свойствам$this->session.$this->session->foo = 'bar'; // Results in: // $_SESSION['foo'] = 'bar';
-
© 2014–2020 British Columbia Institute of Technology
Licensed under the MIT License.
https://codeigniter.com/userguide3/libraries/sessions.html