很多人在PHP的开发中会出现SESSION跨页面丢失的问题,我曾经也遇到过,但是他自己好了 ^_^.
今天特别看了下,这种情况一般是用header跳转后才发生的,结合了PHP手册和网上的一些文章,做一下总结:
1.第一种情况是因为COOKIE丢失, COOKIE不可用的导致的。由于sessionId是保存到客户端的,跳转到页面的时候COOKIE取不到, sessionId丢失,SESSION也就丢失了。这种情况国内文章流行的解决办法是在跳转前后的两个页面的session_start()后面都加上session_id(SID);为什么加这个会有用呢?查看官方手册,对函数session_id()的描述是获取或者设置当前SESSION的ID。SID是一个常量,文档的描述是:The constant SID
can also be used to retrieve the current name and session id as a string suitable for adding to URLs。不太明白这是什么意思,我们姑且把他当成一个唯一的字符串。在跳转之前的页面使用session_id(SID);就是把当前的sessionId设置为常量SID。跳转后页面再次使用session_id(SID), sessionId就存在了,而且和之前页面的SID一样,有了sessionId,就可以获取到session。
对于这种情况,还有一种做法,就是在跳转的URL里面把sessionId加上去。在一些网站上能看到类似 ?PHPSESSID=xxxxxxx的URL,这就是手动加sessionId。代码应该是:
sesstion_start();
$sessionId = session_id();
$url = '1.php?PHPSESSID='.$sessionId;
header('Location:' . $url);
这种做法没试过,原理知道了,解法可以有多种。
2.如果上面的你都试过了,session还是丢失,国内的文章基本都是让你加session_id(SID)。这个时候改用google搜搜国外的文章了。PHP SESSION有一个函数:session_write_close();不看这个函数还不知道一些东西。这个函数的作用是:写入session数据保、存并且结束session。在该函数的描述中说到:Session data is usually stored after your script terminated without the need to call session_write_close()。session数据“通常”是在脚本结束才保存数据,除非你调用了session_write_close(),有点坑爹。如果上面的方法没有解决,很可能是在你跳转之前SESSION没有保存,那么就需要在header之前调用session_write_close();并且在header之后加上一个exit(0);以保证脚本结束。这样有了双重保障,因为看到有人使用了session_write_close();以后还是丢失了,最后在header()后面加了exit(0)才解决问题的。
但是有时候我们没有加session_write_close();也没有exit(0);为什么session是正常的呢?这个地方很疑惑,不知道是不是除了 “session数据‘通常’是在脚本结束才保存数据”当中所说的通常以外的情况,希望有人高人能帮忙看看。
PS:以上纯属个人观点!