Php 刷新时,Codeigniter会话重置

Php 刷新时,Codeigniter会话重置,php,session,codeigniter-3,Php,Session,Codeigniter 3,经过一个月的努力解决这个问题,并尝试了相关问题的各种答案,我决定自己问 这个问题发生在我们最近购买的一台新服务器上,与它在本地主机和上一台服务器上正常工作的代码相同。但它可能与代码有关 会话被正确创建,令牌被设置,var_转储显示。但是,当用户尝试登录时,在重定向到访问功能后,会话令牌未设置,因此不会发生登录 即使在同一页上,如果刷新,_ci_last_regenerate(获取上次重新生成会话的时间)也是当前时间,并且在每次刷新后都会更改 在var/lib/php/session中,每次刷新后

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

这个问题发生在我们最近购买的一台新服务器上,与它在本地主机和上一台服务器上正常工作的代码相同。但它可能与代码有关

会话被正确创建,令牌被设置,var_转储显示。但是,当用户尝试登录时,在重定向到访问功能后,会话令牌未设置,因此不会发生登录

即使在同一页上,如果刷新,_ci_last_regenerate(获取上次重新生成会话的时间)也是当前时间,并且在每次刷新后都会更改

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

19秒的一个拥有正确的数据(时间和令牌),最后一个只有时间

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

这是会话配置:

$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、时间戳、数据):

数据总是相同的,一种情况下最后一次重新生成包含时间和令牌,另一种情况下仅最后一次重新生成(每次刷新2行)

PHP是7.2.7。代码点火器为3.1.5

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

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

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

看起来您并没有将会话数据存储在任何地方,而是存储在用户的cookie中,因为您的配置似乎是读取的

$config['sess_save_path'] = NULL;
由于您使用的是
文件
驱动程序,因此应该指定会话数据存储在服务器中的位置。默认情况下(开箱即用),CodeIgniter的设置如下:

$config['sess_save_path'] = APPPATH . 'ci_session/';
您需要指定CodeIgniter可以写入的目录。否则,如果会话数据未存储在服务器中,则无论何时尝试执行任何操作,cookie中的会话都不会与任何内容匹配

请记住,CI会话与本机PHP会话并不完全相同

此外,正如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日)基于您对原始问题的更新:

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

$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;
我认为情况并非如此,但请检查您的代码,查看您调用本机
session\u start()
函数的任何地方。这样做会使CI会话管理行为不可预测,其中一个症状是会话不会持续(我通过艰苦的学习了解到这一点,花了大约一个月的时间进行调试,直到发现一个会话启动调用将一切都搞糟)

请检查会话表中的
数据
列是否正在实际写入,好吗?(上述情况的另一个症状)。尝试运行此操作,如果所有内容都返回为“空”,我们可能会更接近:

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

另外,请记住,仅仅创建会话表是不够的。您是否根据您的
sess\u match\u ip
设置运行了所需的
ALTER

确保只初始化了一次会话库

$this->load->library('session');
-确保它不是自动加载的

application/config/autoload.php
-如果您使用的是codeigniter版本3,则在不再需要处理会话变量时调用
session\u write\u close()

-确保既不
unset($\u会话)也没有销毁它

session_destroy();

// or

$this->session->sess_destroy();
-会话受这些cookie配置的影响
application/config/config.php

$config['cookie_domain']    = '.your-domain.com';
$config['cookie_path']      = '/';

如果您使用的是http服务器,请将config_secure设置为false,否则您的会话将在每次页面刷新时过期

检查下面

   $config['cookie_prefix'] = '';
   $config['cookie_domain'] = '';
   $config['cookie_path'] = '/';
   $config['cookie_secure'] = FALSE;
   $config['cookie_httponly']   = FALSE;

好的,问题是Centos 7中的Apache配置和两个子域

我们在同一个httpd conf文件中有两个VirtualHost数据。修复方法是为每个域创建不同的conf文件。比如:

域名1.com.conf

<VirtualHost *:80>
  ServerName domain1.com
  ServerAlias domain1
  DocumentRoot /var/www/html/domain1
  ErrorLog /var/log/httpd/domain1-error_log
  CustomLog /var/log/httpd/domain1-access_log combined
</VirtualHost>

ServerName域名1.com
服务器别名域1
DocumentRoot/var/www/html/domain1
ErrorLog/var/log/httpd/domain1-error\u日志
CustomLog/var/log/httpd/domain1-access\u日志组合
域2也是如此


希望这对任何人都有帮助。

Allready尝试过:Message:Session:Configured save path'/var/www/html/desarrolo.cice.vuce.gob.ar/application/ci_Session'不能由PHP进程写入。即使是0777,这也是另一个问题,但这并不意味着不应该设置保存路径。除了设置正确的权限(0777可能有助于调试,但请记住它不应该是长期的解决方案)之外,如果您没有使用正确的用户写入磁盘,您可能会遇到问题(codeigniter根据您的web用户权限运行,但写入磁盘是由apache或nginx完成的,因此整个目录及其内容必须由apache/nginx用户拥有)出于同样的原因,当我开始使用codeigniter时,我也遇到了类似的问题,将目录更改为www数据(nginx用户)瞧,如果你检查你的旧服务器,你会发现保存路径已设置,目录所有权不是默认的……也就是说,如果你设想在将来的任何时候,你可能需要有多个应用服务器和一个负载平衡器在它们前面,那么最好现在就证明自己,并使用另一个会话驱动程序(数据库、redis或memcached)。这将在将来为您节省很多痛苦更改为数据库驱动程序,因此数据已保存,问题仍然存在…您能否发布更新的会话配置和
显示创建表ci_会话的输出(或您为该表指定的任何名称)?谢谢