Php 刷新时,Codeigniter会话重置
经过一个月的努力解决这个问题,并尝试了相关问题的各种答案,我决定自己问 这个问题发生在我们最近购买的一台新服务器上,与它在本地主机和上一台服务器上正常工作的代码相同。但它可能与代码有关 会话被正确创建,令牌被设置,var_转储显示。但是,当用户尝试登录时,在重定向到访问功能后,会话令牌未设置,因此不会发生登录 即使在同一页上,如果刷新,_ci_last_regenerate(获取上次重新生成会话的时间)也是当前时间,并且在每次刷新后都会更改 在var/lib/php/session中,每次刷新后都会创建两个不同的文件,不知道为什么。图为: 19秒的一个拥有正确的数据(时间和令牌),最后一个只有时间 此外,我们最近向站点添加了一个新子域,因此在同一台服务器上有两个不同的子域。 这是会话配置:Php 刷新时,Codeigniter会话重置,php,session,codeigniter-3,Php,Session,Codeigniter 3,经过一个月的努力解决这个问题,并尝试了相关问题的各种答案,我决定自己问 这个问题发生在我们最近购买的一台新服务器上,与它在本地主机和上一台服务器上正常工作的代码相同。但它可能与代码有关 会话被正确创建,令牌被设置,var_转储显示。但是,当用户尝试登录时,在重定向到访问功能后,会话令牌未设置,因此不会发生登录 即使在同一页上,如果刷新,_ci_last_regenerate(获取上次重新生成会话的时间)也是当前时间,并且在每次刷新后都会更改 在var/lib/php/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、时间戳、数据):
数据总是相同的,一种情况下最后一次重新生成包含时间和令牌,另一种情况下仅最后一次重新生成(每次刷新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_会话的输出(或您为该表指定的任何名称)?谢谢