PHP 两个站点造成的SESSION混乱

前言

在做某个需求时,将 token 存在了 SESSION 里,然而呢,SESSION 是存在 Redis 里的。在检查这个 token 是否正确时,却发现,时而正确,时而错误。

检查了从 SESSION 里取出的值,发现里面的内容会有几率的不同。

于是,查看了 Redis 里的值,发现是存在,并且正确的。查看了 /var/lib/php/sessions 里的值,发现是存在,并且错误的。与之前打出的值一样,这,我懵逼了。

于是漫长的 BUG 之路开始了。

原因

检查了很久,还是不知原因,便请来了华仔(技术牛人)。

一开始,我们的方向是:因为配置的问题,导致 Redis 读的库混乱了。检查之后发现,配置没有任何问题。

然后想到了,我的所有站点都在一个系统里,是不是因为其他站点引起的。试验之后发现,果不其然。

当访问了另外一个从文件读取 SESSION 的站点之后,主站点就会取到两种 Redis

于是我就怀疑,是 PHP-FPM 的问题,请求结束后,SESSION 并没有被销毁。

验证

在主站点的入口文件里,写了一段代码,主要是测试 SESSION 是否有被关闭。

<?php
// ...
$status = session_status();
switch ($status) {
    case PHP_SESSION_ACTIVE:
        echo 'session is active';
        break;

    case PHP_SESSION_NONE:
    case PHP_SESSION_DISABLED:
        echo 'session is not active';
        break;
}
exit();
// ...

检测发现,有几率出现 'session is active' 的情况。这说明了,次站点的请求结束后,并没有关闭 SESSION 。 华仔看了一下源码,也证实了这件事情。

最终在 PHP 的官网上看到了这个:

既然问题已经出现,那么,如何解决呢。

解决

次站点在响应给出之前,先关闭 SESSION,使用 session_write_close() 方法。

同时,主站点在初始化 SESSION 时,可以先关闭 SESSION 再开启,实现如下。

<?php
// ...
$status = session_status();
switch ($status) {
    case PHP_SESSION_ACTIVE:
        session_write_close();
        session_start();
        break;

    case PHP_SESSION_NONE:
    case PHP_SESSION_DISABLED:
        session_start();
        break;
}
exit();
// ...

这个时候,就可以去自定义会话管理了,无论是存在 RedisMemcache 或者 database 里都可以。

总结

很多问题,在多数情况下,是不会出现的。只有做多,才会错多。

然而,错并不可怕,发现并将其改正就好。

-- EOF --
本文转载自IMJCW
原文链接:PHP 两个站点造成的SESSION混乱

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • PHP Session 本文由以下两篇博客整理而成, 传送门如下:Cookie和Session的作用,区别和各自的...
    其实我很dou阅读 5,022评论 0 1
  • Session机制 除了使用Cookie,Web应用程序中还经常使用Session来记录客户端状态。Session...
    薛晨阅读 11,879评论 4 34
  • 《互联网金融风险专项整治工作实施方案》(下称《方案》)的发布,业内外人士都明显的可以察觉到政策环境日益趋紧,特别是...
    吉盟财富公司阅读 1,288评论 0 0
  • 标签选择器(元素选择器) 标签选择器是指用HTML标签名称作为选择器,按标签名称分类,为页面中某一类标签指定统一的...
    王玉伟的伟阅读 3,258评论 0 1
  • 读一篇小说,一般来说,我们要先了解一下小说里有哪些人物,然后想一想他们之间发生了什么事,用简单的情节图,就可以把这...
    笑笑8阅读 1,058评论 0 0

友情链接更多精彩内容