php单机session消失_PHP跨页面SESSION丢失问题

很多人在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:以上纯属个人观点!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值