所以我有 SessionHandler 类,以及我的另一个文件,它像这样 ( cfg_session.php ):
use \Classes\MySessionHandler as Sessao;
$sessao = new Sessao();
// PHP < 5.4
session_set_save_handler(
array($sessao, 'open'),
array($sessao, 'close'),
array($sessao, 'read'),
array($sessao, 'write'),
array($sessao, 'destroy'),
array($sessao, 'gc')
);
register_shutdown_function('session_write_close');
session_start();
好吧,小的区别是在我的 localweb 中我使用:
session_set_save_handler($sessao)
因为,在我的本地网络中,它实际上是 PHP > 5.5。
它在我的本地网络上运行良好,我确实刷新页面,注销,登录,关闭选项卡,打开选项卡,再次登录,一切正常,我浏览器中的 PHPSESSID 等于在会话文件上创建的那个,所以在。
编辑:我有一个 PHP < 5.4 的服务器,事实上,我使用上面的代码,意味着 PHP < 5.4,但它仍然表现得很奇怪。刷新浏览器,它会创建另一个会话文件,但不会更改 PHPSESSID。第一次尝试登录时,过程如下:它创建会话文件,我将用户重定向到某个页面,该页面在服务器上执行另一个请求,它只是创建另一个与 PHPSESSID 完全不同的会话文件,当然,该应用程序将我注销。这就是奇怪的部分。
但是后来,我尝试再次正常登录,它让我登录,就好了。每个请求都具有相同的 ID,session_regenerate_id() 工作正常,一切正常,PHPSESSID 与创建的会话文件匹配。
但是,如果我注销,关闭该选项卡,打开一个新选项卡并尝试登录(或者只是关闭选项卡而不注销),它只会做同样的事情:让我登录,创建一个会话文件,但随后,它会改变de session_id 再次将我踢出去。
我真的坚持这一点。不能确定这是因为 PHP < 5.4 还是其他原因。
注意: - session_regenerate_id() 用于登录、检查是否有会话(然后更新时间和 regenerateId)和注销。
- 在需要使用会话变量的每个页面上都需要一次 cfg_session.php 。
我需要对此有所了解。我已经看到了很多主题,但没有一个非常有用或接近解决这种奇怪的行为。提前致谢。