我还是PHP和Code Igniter的新手,并开发了基于三重存储+一个小型SQLite数据库的项目。
我希望在会话过期时将一些会话数据保存在持久存储中,以便用户可以自定义页面并保留新会话的设置和历史记录。这似乎比为每个用户操作使用我的三重存储或数据库更实用。
我使用代码点火器3.1.5 +会话库+一个用于会话数据的小型SQLite数据库(遵循带有数据库驱动程序的会话库的CI文档:https://www.codeigniter.com/user_guide/libraries/sessions.html#database-driver以及此帖子的SQLite设置:How can I create a CRUD with Codeigniter using SQLite?) 。
我没有找到任何解决闭门会话的解决方案(可能是可能的?),因此发现我可以(a)修改CI Session系统库或(b)创建一个实现SessionHandlerInterface的自定义类(参见在这里:https://secure.php.net/manual/en/function.session-set-save-handler.php;
在这里:How do I save session data to a database instead of in the file system?)。这两种解决方案都包括在close()
或destroy()
函数中添加自定义代码。
我想保留Code Igniter会话库,因为它使用起来非常简单并且已经为它编写了一些代码,但我不知道如何正确地扩展或修改它。
所以这就是我试过的,你能告诉我它是否合适?
1)在system / libraries / Session / drivers中创建一个文件Session_custom_driver.php,我在其中复制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
中存储的数据时都会调用该函数。
如何只保存一次数据,即会话何时到期?
另一个想法:我可以使用用户的持久数据保存会话ID,然后在打开新会话时检索与此id对应的会话数据。