问题描述:
Thinkphp5.1 启用session生效时间为1天。偶发性session没有到一天就失效了。
解决过程:
session不设置失效时间是。正常。
继续查找发现session设置生效时间,cookie级联设置了生效时间为1小时。(用谷歌浏览查看cookie)
图
分析可能是是cookie到期后失效,导致cookie里sessionId没有了。导致session失效。
尝试解决:
- 1.修改tp的源代码去掉这一样,问题消失。
if (isset($config['expire'])) {
ini_set('session.gc_maxlifetime', $config['expire']);
// ini_set('session.cookie_lifetime', $config['expire']);
}
分析这里设置了cookie的有效时间。
-
2.由于不能直接改tp源码。尝试ini_set(‘session.cookie_lifetime’,0) 放到开始的方法里; 结果,cookie一样会设置失效时间。
-
3.继续查找没有setcookie的地方,猜测PHPsessionId的cookie是自动生成的。 尝试在每次请求后手动更新下cookie的生效时间。 seccokie(session_name(),session_id(),0);
依然失败。 -
4.查询百度和查看php手册后,猜测cookie里的PHPsessionId可能是session_start()的时候生成sessionId时同时种下的。
继续查找tp源码。 配置里 自动启用session。 所有 之前重新设置cookie
有效期的配置失败。继续研究。发现可以改成手动启用seession。
// 原来的
//‘auto_start’=>true;
//$this->start();
//配置改成
‘auto_start’=>false;
//登录入口改成
ini_set('session.cookie_lifetime',0);
Session::start();
问题解决。cookie的有效期设置为浏览器关闭。
-
5.总结
-每次刷新浏览器session的有效期会重新计时,cookie的 phpsessonid不会。所以第一次设置的时候最好长一点或者岁浏览器关闭。
设置的太长,每次关闭浏览器,cookie依然存在,不用重新登录。如百度的。session和cookie是协作生效的。cookie 失效后,session也就失效了。
ps:
// session和cookie 的使用:
$_SESSION['name']
$_SESSION['name']='value';
$_COOKIE['name']
setcookie('name','value',3600);
//下载
header('','');
redfile($path);
参考:
PHP手册