PHP $_SESSION 引发的Bug
PHP $_SESSION 引发的Bug
刚处理了一个 公司老系统的 BUG, 记录一下。
BUG: 老系统之前登录的时候正常, 昨天突然 登录不上去了
分析查找:
尝试错误的账号 和 密码, 跳转正常, 弹出了账号密码错误
使用正确的账号密码,登录不给任何提示直接跳回
翻看源码 发现登录 代码如下:
1 |
|
- 查看 index.php 中的代码:
1 |
|
乍一看 上面的代码 没有任何的问题, 因为之前的代码 也是这种逻辑,是正常的在用,于是 在本地 测试了一下. 主要怀疑 $_SESSIO 写入的时候的问题
本地新建了一个 test.php, 代码如下:
1 |
|
新建了一个 index.php, 代码如下:
1 | @session_start(); |
运行以后跳转到 index.php 发现 获取到的 $_SESSION 是空的, 证明了猜想 $_SESSION 写入的时候没有写进去 或者 为空,于是 修改了一下 本地的测试代码:
1 | $_SESSION['user'] = [1,2,3,4]; |
然后:
1 | var_dump($_SESSION['user']); |
这样一修改,就能正常写入,并且输出.
问题:
因为老系统 很多个 地方 $_SESSION 是直接赋值 并且获取 使用的 没法修改, 之前能用. 突然不能用了.怎么快速的解决呢?
万能大法, 凡事不会找 谷歌, 搜了半天 告诉的是 上面的那种写法 $_SESSION 直接赋值会出现不稳定或者是 数据覆盖的可能, 建议直接使用 $_SESSION
Chatgpt 上搜一下 也是 $_SESSION 直接赋值会出现不稳定或者是 数据覆盖的可能
解决:
如上,在不大规模的修改 代码的时候 怎么解决 这个问题, 于是一点点的翻, 最后想到的是 session 一般来说是存储的文件, 是不是 $data 太大,导致文件目录满了,于是 查看了一下 php.ini 中 session.save_path 的路径 /tmp/session 然后 查看了一下 /tmp 的大小.没满.
最后 迫不得已, 尝试把 /tmp/session 目录给删除,然后 新建了 session目录, 于是 就神奇的 $_SESSION=$data 存储可用了.于是这个 奇妙的 问题就解决了.
最后的最后
$_SESSION是一个特殊的超全局数组,用于在会话之间存储数据。直接给$_SESSION赋值可能会导致不稳定的行为和不一致性,因为它会覆盖会话中已有的数据。