代码版本:3.2.0-dev (不建议使用DEV版本)
问题现象:同一套代码,在服务器上可以正常使用。在本地开发环境中无法正常登陆。
环境配置:
windows 10 / php 7.1.4 / Codeigniter 3.2.0
问题概述
在碰到这个问题的时候,仔细核查了所有代码。首先确定代码没有明显的错误(因为线上可以正常使用)。
中间的曲折就不多说了,后面跟进分析HTTP请求。发现每次请求的session_name都会被更新。意味着服务器每次都会重新生产一个SID给客户端。至此发现问题症状
问题处理
Setup 1.
检查php 配置相关。主要是 save_path ,以及 timezone 区段。验证无果
Setup 2.
追踪代码
验证单文件请求session_id是不会变动的。因此确定问题就是处在代码上。二话不说,直接搜到session_start(); 位置,增加断点,输出SID ;
SID 还是变动 。。。 不断追。最后发现问题处在
if (isset ( $_COOKIE [$this->_config ['cookie_name']] ) && (! is_string ( $_COOKIE [$this->_config ['cookie_name']] ) or ! preg_match ( '/^[0-9a-f]{40}$/', $_COOKIE [$this->_config ['cookie_name']] ))) {
unset ( $_COOKIE [$this->_config ['cookie_name']] );
}
对判断数据进行验证,以及对服务器的请求也进行验证。发现问题症结(我以`session_name`替代$this->_config['cookie_name'])
$_COOKIE[`session_name`]
这个数据,在WIN下取值长度为 32位,在linux下生成的是40位。至此就没继续追究为什么长度不一致的问题了。
直接杀到官方项目代码库(github)。发现主干代码已经变动,且变动算是不小吧。放弃提交issue,进入本地进行代码修正。
懒人处理方式:直接把判断长度判断给干掉了
if (isset ( $_COOKIE [$this->_config ['cookie_name']] ) && (! is_string ( $_COOKIE [$this->_config ['cookie_name']] ))) {
unset ( $_COOKIE [$this->_config ['cookie_name']] );
}
至此SESSION问题解决。一切正常
后话:
从代码中可以看到,CI的主旨目的是为了进行过滤下COOKIE的数据,按照规范进行数据清洗。如果不符合规范则直接删除COOKIE,就是因为这个清洗规则。。导致每次提交的时候本地的COOKIE其实是已经被删除了的。因此后续提交的时候SID就没有了,每次请求都是一次全新的请求。
虽然说处理的方式不够严谨,但从未来不可预测角度来说。这么具体的限制了长度。个人觉得未来还会给自己送到坑里。所以果断的给删除长度判断。
很久没写这类文章了。还是习惯性的在我自己的文章中增加我的属性~ sports98<sports98@gmail.com>欢迎各位有兴趣的一起讨论。可以加扣扣群:47217700(PHP策进会-PEA北京)很老的一个群了,原本康盛没被收之前做的一个社区活动群。目前仅为技术讨论交流。进群请告诉我: 1+2+3=? 这个暗号记好了哈~:)