为了账号安全,请及时绑定邮箱和手机立即绑定

php登录导致的session丢失

php登录导致的session丢失

PHP
弑天下 2019-03-11 23:26:25
描述: 简单的说就是在登录页面ajax调用php的api登录后前端跳转。 问题: 在chrome浏览器下,有时候登录session会丢失,但打了log发现每次调用api都能set到session。session是存储在memcache里面的,在多次登录后再次快速点击登录按钮就发现session没设置到,很奇怪。 在overflow很多人都提到facvicon.ico的问题,调试了发现也不是这个原因。 之前在js做了一个延时2秒跳转起到作用,但现在又不行,刚刚在php脚本set完session后return之前加了sleep延时2秒,又起到作用,真搞不懂是什么原因了。 环境是测试环境,就一台服务器,不是多服务器共享session,当然线上是,线上也有这个问题。 关于存储memcache的,每次点登录后session失效都去查过memcache,确实没有这些数据,正常登录后又有数据,如果是php存储到memcache的问题,又要怎么去调试和解决? 还有关于window.location.href这个的问题,也有人提到这个方法会重启一个httpcontext导致session丢失的问题,这里也很奇怪,我在调登录api后在ajax里打了断点,阻止window.location.href跳转,然后在另外的页面访问输出session,有时候有session,但跳转之后就没了,但有时候也没有。 问题描述大概就是以上,有的话再补充!!!
查看完整描述

4 回答

?
MMMHUHU

TA贡献1834条经验 获得超8个赞

可能是memcache的问题,你的memcache里数据丢失了,memcache分配的内存加大点试试?

分配给memcache的空间用满后需要删除旧的items来得到空间分配给新的items

查看完整回答
反对 回复 2019-03-18
?
慕少森

TA贡献2019条经验 获得超9个赞

因为你有页面跳转,估计浏览器没来的及写入session,就被刷掉了,时有时无,是因为请求的响应的时间不一致,刷新前留给浏览器的时间不一样,打断点,阻塞了进程是可以看到,跳转之后,当前会话结束了,自然是没了。

查看完整回答
反对 回复 2019-03-18
?
达令说

TA贡献1821条经验 获得超6个赞

其实如果你了解了session的机制,你就知道如何定位问题了。

首先,session的存储

session默认是文件形式存储,php默认session有效事件是1440秒,也就是说如果一个session过了1440秒没有刷新,那么再次访问的时候这个session就过期了,php会自动清理过期的session文件。

如果你选择用memcache存储session,因为是基于内存,有可能是外部因素导致数据丢失或者被清理,建议先切换回文件存储试试还有没有问题。

其次,客户端的sessionId

默认情况下,当php设置了一个session后,会告诉浏览器,创建一个cookie用来保存sessionId,下次请求的时候php会从$_COOKIE['PHPSESSID']中拿到sessionId再去读取对应的session文件。那你就得检查这个sessionID的cookie有没有被意外清理。

总结起来就是要么是服务端session数据没了,要么是sessionId没了。

查看完整回答
反对 回复 2019-03-18
?
人到中年有点甜

TA贡献1895条经验 获得超7个赞

访问session是需要一个session id 的,你丢了这个id,就等于丢了这个session. 一般情况下cookie存储这个id.

查看完整回答
反对 回复 2019-03-18
  • 4 回答
  • 0 关注
  • 584 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信