php - 刷新时 Codeigniter session 重置

标签 php session codeigniter-3

经过一个月的尝试解决这个问题,并尝试了相关问题的各种答案后,我决定自己问。

这个问题发生在我们最近购买的新服务器上,同样的代码在本地主机和上一个服务器上运行良好。但这可能与代码有关。

session 已正确创建并设置了 token ,var_dump 显示了这一点。但是,当用户尝试登录时,在重定向到访问功能后,未设置 session token ,因此不会发生登录。

即使是同一个页面,如果刷新,__ci_last_regenerate(获取上次重新生成Session的时间)就是当前时间,每次刷新后都会变化。

在 var/lib/php/session 中,每次刷新后都会创建两个不同的文件,不知道为什么。这里的图片:

enter image description here

19 秒的那个有正确的数据(时间和 token ),最后一个只有时间。

此外,我们最近向网站添加了一个新的子域,因此我们在同一台服务器上有两个不同的子域。

这是 session 配置:

$config['sess_driver'] = 'files';
$config['sess_cookie_name'] = 'ci_session';
$config['sess_expiration'] = 7200;
$config['sess_save_path'] = NULL;
$config['sess_match_ip'] = FALSE;
$config['sess_time_to_update'] = 300;
$config['sess_regenerate_destroy'] = FALSE;

也尝试使用 DB 驱动程序,它在表上生成了 2(或有时是 3 行)。配置是:

$config['sess_driver']= 'database';
$config['sess_cookie_name']= 'ci_session';
$config['sess_expiration']= 0;
$config['sess_save_path']= 'ci_sessions';
$config['sess_match_ip']= FALSE;
$config['sess_time_to_update']= 300;
$config['sess_regenerate_destroy']= FALSE;
$config['sess_use_database']= TRUE;
$config['sess_expire_on_close']= TRUE;
$config['sess_table_name']= 'ci_sessions';

数据库的输出是它的列(id、ip、时间戳、数据):

enter image description here

数据始终相同,在一种情况下最后一次重新生成包含时间和 token ,而在另一种情况下仅最后一次重新生成(每次刷新 2 行)。

PHP 是 7.2.7 。 CodeIgniter 是 3.1.5。

如果需要,将提供任何进一步的代码或服务器信息。

编辑 4/9: 根据一些用户的要求,还添加了这些 cookie 数据。

$config['cookie_domain']    = '.my-domain.com';
$config['cookie_path']      = '/';
$config['cookie_secure']    = FALSE;
$config['cookie_httponly']  = FALSE;

最佳答案

看起来你没有在任何地方存储 session 数据,而是在用户的 cookie 中,因为你的配置似乎读取了

$config['sess_save_path'] = NULL;

由于您使用的是files 驱动程序,因此您应该为 session 数据指定一个存储在服务器中的位置。默认情况下(开箱即用),CodeIgniter 是这样设置的:

$config['sess_save_path'] = APPPATH . 'ci_session/';

您需要指定 CodeIgniter 可以写入的目录。否则,如果 session 数据未存储在服务器中,无论何时您尝试执行任何操作,cookie 中的 session 都不会与任何内容匹配。

请记住,CI session 与原生 PHP session 并不完全相同。

此外,正如 CI 本身在配置中所述:

|   'sess_save_path'
|
|   The location to save sessions to, driver dependent.
|
|   For the 'files' driver, it's a path to a writable directory.
|   WARNING: Only absolute paths are supported!
|
|   For the 'database' driver, it's a table name.
|   Please read up the manual for the format with other session drivers.
|
|   IMPORTANT: You are REQUIRED to set a valid save path!

更新(2018 年 8 月 31 日)基于您对原始问题所做的更新:

使用数据库时, session 配置中有几个不需要/冗余的设置。这些就是您所需要的,您设置中的任何额外内容都应该消失:

$config['sess_driver'] = 'database';
$config['sess_cookie_name'] = 'ci_session';
$config['sess_expiration'] = 0;
$config['sess_save_path'] = 'ci_sessions';
$config['sess_match_ip'] = FALSE;
$config['sess_time_to_update'] = 300;
$config['sess_regenerate_destroy'] = FALSE;

我不认为是这种情况,但请检查您的代码,了解您可能调用 native session_start() 函数的任何地方。这样做会使 CI session 管理行为不可预测,其中一个症状是 session 不会持续存在(我很难学到这一点,花了大约一个月的调试时间,直到我发现一个 session_start 调用把一切都搞砸了)

你能检查一下 session 表中的data列是否真的被写入了吗? (上述的另一个症状)。尝试运行它,如果所有内容都返回为“空”,我们可能会更接近:

select
case
when cast(data as char(1000)) = '' then "empty"
else "something"
end as content, count(*)
from ci_sessions group by content;

此外,请记住,实际创建 session 表是不够的。您是否根据您的 sess_match_ip 设置运行了所需的 ALTER

关于php - 刷新时 Codeigniter session 重置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52061469/

相关文章:

php - 无法从数据库中回显用户数据 - 表示 "Property [id] does not exist"

javascript - Require_Once 不链接服务器上的 PHP 文件

java - 使用 Java 进行安全的 Web 应用程序开发

c# - Session_Start 在 Chrome 中被调用得太频繁

java - 身份验证过滤器无法正确识别身份验证

php - 我想获取一个 id 的所有父 id 的数组

php - mysql中使用多个where条件

php - 连接两个表并获取最新的 slug

php - 我如何将表与第二个表的最新记录连接起来

php - 如何使用 RegEx 删除 html 元素及其内容