PHP跨页面SESSION丢失问题

不少人在PHP的开发中会出现SESSION跨页面丢失的问题,我曾经也遇到过,可是他本身好了 ^_^. php

今天特别看了下,这种状况通常是用header跳转后才发生的,结合了PHP手册和网上的一些文章,作一下总结: session

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(); ui

$sessionId = session_id(); google

$url = '1.php?PHPSESSID='.$sessionId; url

header('Location:' . $url); ip

这种作法没试过,原理知道了,解法能够有多种。 开发

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数据‘一般’是在脚本结束才保存数据”当中所说的一般之外的状况,但愿有人高人能帮忙看看。

相关文章
相关标签/搜索