Библиотека сеансов Code Igniter: как настроить?

Я все еще новичок в PHP и Code Igniter и разрабатываю проект на основе тройного хранилища + небольшой базы данных SQLite.

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

Я использую зажигатель кода 3.1.5 + библиотеку сеансов + небольшую базу данных SQLite для данных сеанса (следовал документу CI для библиотеки сеансов с драйвером базы данных: https://www.codeigniter.com/user_guide/libraries/sessions.html#database-driver и этот пост для настроек SQLite: Как я могу создать CRUD с помощью Codeigniter с помощью SQLite?).

Я не нашел решения для восстановления закрытого сеанса (может быть, это возможно?), поэтому обнаружил, что могу либо (а) изменить системную библиотеку сеанса CI, либо (б) создать собственный класс, реализующий SessionHandlerInterface (см. здесь: https://secure.php.net/manual/en/function.session-set-save-handler.php и здесь: Как сохранить данные сеанса в базе данных, а не в файловой системе?). Оба решения заключаются в добавлении пользовательского кода в функцию close() или destroy().

Я хотел бы сохранить библиотеку сеансов Code Igniter, потому что она очень проста в использовании и уже написала для нее некоторый код, но я не знаю, как ее правильно расширить или изменить.

Итак, вот что я пробовал, не могли бы вы сказать мне, все ли в порядке?

1) создайте файл Session_custom_driver.php в system/libraries/Session/drivers, куда я копирую код CI_Session_database_driver и изменяю функцию close() (или destroy())

2) отредактируйте application/config/config.php: $config['sess_driver'] = 'custom';

И следующим шагом будет загрузка пользовательской библиотеки или модели из этой модифицированной функции close():

$CI =& get_instance();
$this->CI_Instance =& $CI;  <--- add this in __construct()

и

public function close() {
    $this->CI_Instance->load->model("MyModelForSessions");
    ...
}

Заранее спасибо.


РЕДАКТИРОВАТЬ: с помощью этого решения я могу сохранить данные сеанса в другом месте и использовать их, когда срок действия сеанса истек, НО функция вызывается каждый раз, когда я изменяю данные, хранящиеся в $_SESSION.

Как я могу сохранить данные только один раз, т.е. когда сеанс истекает?

Другая идея: я могу сохранить идентификатор сеанса с постоянными данными пользователя, а затем получить данные сеанса, соответствующие этому идентификатору, при открытии нового сеанса.


person vvffl    schedule 08.03.2018    source источник
comment
Не противоречит ли предложенная вами идея самой цели сеансов? Если вы просто пытаетесь сохранить некоторые пользовательские настройки, вам не нужно сохранять или восстанавливать сеанс, просто сохраните/восстановите настройки. Зачем заботиться о самой сессии?   -  person Sparky    schedule 10.03.2018
comment
Спасибо, Спарки, за это замечание. Вот что я подумал: сеансы (1) просты в использовании, можно хранить и загружать данные в одну строку; (2) даже если HTTP является протоколом без сохранения состояния, сеансы позволяют хранить объекты; (3) поскольку можно установить время жизни, я мог бы использовать такие функции, как session_destroy() или session_regenerate_id(), чтобы вызвать некоторую функцию "автосохранения"; (4) хранение данных в сеансе более эффективно, чем использование пользовательского кода, поскольку это встроенная функция, а данные уже загружены.   -  person vvffl    schedule 12.03.2018
comment
И о № 4: Я думал, что данные хранятся «в памяти», в каком-то кеше или в другом месте. НО при попытке изменить session_save_path() я обнаружил, что в /var/lib/php/sessions есть файлы... Так что я думаю, что это не более эффективно, чем использование другой постоянной системы хранения.   -  person vvffl    schedule 12.03.2018