即使未加载 codeigniter 会话库,也会在数据库中创建新的会话条目。为啥?
Posted
技术标签:
【中文标题】即使未加载 codeigniter 会话库,也会在数据库中创建新的会话条目。为啥?【英文标题】:New session entries are being created in database even when codeigniter session library is not loaded. Why?即使未加载 codeigniter 会话库,也会在数据库中创建新的会话条目。为什么? 【发布时间】:2017-12-31 16:55:49 【问题描述】:我在使用 Chris Kacerguis 的 CodeIgniter REST 服务器时遇到了一个相当奇怪的问题。
问题:
1) 我没有加载 CodeIgniter 会话库,即使这样,每次我向我的 REST Api 发出 HTTP 请求时,都会在 ci_sessions
数据库表中创建新条目。
2) 在每次 HTTP 请求时,都会在数据库中创建一个全新的条目(并且不会更新旧条目),即使 IP 地址保持不变也是如此。
这是我的 config.php 文件:
$config['sess_driver'] = 'database';
$config['sess_cookie_name'] = 'ci_session';
$config['sess_expiration'] = 0;
$config['sess_save_path'] = 'ci_sessions';
$config['sess_match_ip'] = TRUE;
$config['sess_time_to_update'] = 300;
$config['sess_regenerate_destroy'] = TRUE;
$config['cookie_prefix'] = '';
$config['cookie_domain'] = '';
$config['cookie_path'] = '/';
$config['cookie_secure'] = FALSE;
$config['cookie_httponly'] = FALSE;
我尝试了以下几种方法:
$config['sess_match_ip'] = FALSE;
$config['sess_time_to_update'] = 0;
$config['sess_regenerate_destroy'] = FALSE;
和
$config['cookie_domain'] = '.mydomain.com';
但没有任何效果。
这是正常现象还是某种错误?我究竟做错了什么?其他人有同样的问题吗?
另一件事是,我在 vanilla CodeIgniter 中没有遇到这个问题。在那里,一切正常,如预期的那样。
更新
我在解决问题的第二部分时发现了一些东西。
在发出第一个 HTTP 请求时,在数据库中创建了两个会话条目 - 一个用于客户端,另一个用于 REST 服务器。从第二个请求开始,cookie 的客户端“版本”正在更新,而服务器“版本”正在重新生成。
【问题讨论】:
检查自动加载? 已经检查并再次检查。会话不存在。 您用于执行 REST API 的任何库都可能正在使用会话。 好点。我正在检查那个并回复你。 感谢我的朋友。我完全错过了你提到的图书馆部分。是的,这就是问题所在。我正在使用@BenEdmunds 的 Ion Auth 库,Ion_auth.php 库文件在其中加载 CI 会话。 【参考方案1】:对于问题的第一部分:
正如@JamesLalor 在 cmets 中指出的那样,
您必须自动加载会话
或
您正在使用一些外部库,而该库又会加载会话库。
对于第二部分的问题:
以下解决方案可能不是最好的,但它对我有用。
在以下情况下会出现多个会话创建问题:
您在同一个 CodeIgniter 应用程序目录中同时拥有 REST 服务器和客户端
与
自动加载会话库
对于客户来说,用户就是消费者。为用户创建一个会话,具有该用户的 IP 地址。在用户的浏览器上设置一个 cookie,用于验证会话并根据验证更新(或新创建)。
对于 REST 服务器,客户端是消费者。这里还创建了一个会话(如果满足上述条件 1 和 2),但这次是针对 Client 的,并且该会话具有 Client 所在服务器的 IP 地址(如果满足上述条件 1 ,那么它就是您的应用所在服务器的 IP 地址)。但这一次无法设置 cookie,因为消费者不是浏览器。因此,会话验证失败,并且每次页面加载时都会创建一个新会话。
解决方案:
REST 是无状态的,每个请求都应包含完成请求所需的所有信息。因此,在 REST 服务器上使用会话(其唯一工作是维护用户状态)被认为是一种不好的做法。客户端的工作是维护用户的会话并将所需的信息传递给每个请求的 REST 服务器。
因此,假设您不需要 REST 服务器中的会话,解决方案是 从 autoload[‘libraries’]
列表中删除 session
,在 autoload.php
文件中,并在客户端构造函数中加载库(或当您需要时)。
对于语法错误和/或英语不好,我们深表歉意。这不是我的母语。
【讨论】:
以上是关于即使未加载 codeigniter 会话库,也会在数据库中创建新的会话条目。为啥?的主要内容,如果未能解决你的问题,请参考以下文章