Я все еще новичок в 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
.
Как я могу сохранить данные только один раз, т.е. когда сеанс истекает?
Другая идея: я могу сохранить идентификатор сеанса с постоянными данными пользователя, а затем получить данные сеанса, соответствующие этому идентификатору, при открытии нового сеанса.
session_destroy()
илиsession_regenerate_id()
, чтобы вызвать некоторую функцию "автосохранения"; (4) хранение данных в сеансе более эффективно, чем использование пользовательского кода, поскольку это встроенная функция, а данные уже загружены. - person vvffl   schedule 12.03.2018session_save_path()
я обнаружил, что в /var/lib/php/sessions есть файлы... Так что я думаю, что это не более эффективно, чем использование другой постоянной системы хранения. - person vvffl   schedule 12.03.2018