即使未加载 codeigniter 会话库,也会在数据库中创建新的会话条目。为什么?

New session entries are being created in database even when codeigniter session library is not loaded. Why?

我在使用 Chris Kacerguis 的 CodeIgniter REST 服务器时遇到了一个相当奇怪的问题。

问题:

1) 我没有加载 CodeIgniter 会话库,即使在 ci_sessions 数据库 table 中创建新条目,每次我向我的 REST [=45] 发出 HTTP 请求=].

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 的客户端 'version' 正在更新,而服务器 'version' 正在重新生成。

第一部分问题:

正如@JamesLalor 在评论中指出的那样,

  1. 您必须自动加载会话

  2. 您正在使用一些外部库,而这些库又会加载会话库。

对于问题的第二部分:

以下解决方案可能不是最好的,但对我有用。

创建多个会话时出现问题:

  1. 您在同一个 CodeIgniter 应用程序目录中同时拥有 REST 服务器和客户端

  2. 会话库自动加载

对于Client来说,用户就是消费者。为用户创建一个会话,具有该用户的 IP 地址。在用户的浏览器上设置了一个 cookie,用于根据验证验证和更新(或新创建)会话。

对于REST Server来说,Client就是消费者。这里也创建了一个session(如果上面的条件1和2都满足),但是这次是给Client的,这个session有Client所在服务器的IP地址(如果上面的条件1都满足) ,则它是您的应用程序所在的同一服务器的 IP 地址)。但是这次无法设置 cookie,因为消费者不是浏览器。因此,会话验证失败,每次加载页面时都会创建一个新会话。

解法:

REST 是无状态的,每个请求都应该包含完成请求所需的所有信息。因此,在 REST 服务器上使用会话(其唯一工作是维护用户状态)被认为是一种不好的做法。客户端的工作是维护用户会话并在每次请求时将所需信息传递给 REST 服务器。

因此,假设您不需要 REST 服务器内的会话,解决方案是 autoload[‘libraries’] 列表中删除 session,在 autoload.php 文件中,并在客户端构造函数中加载库(或在需要时).

抱歉语法错误and/or英语不好。这不是我的母语。