0

所以我有 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 。

我需要对此有所了解。我已经看到了很多主题,但没有一个非常有用或接近解决这种奇怪的行为。提前致谢。

4

3 回答 3

1

SessionHandlerInterface类仅适用于 5.4.0 或更高版本。您的代码适用于 PHP 5.4.0 及更高版本。它肯定会给出奇怪的东西

于 2015-12-17T12:35:00.250 回答
0

如何以编程方式记录 coockie 会话时间可能是 set_lifetime 会话?也许您需要设置会话 cookie 选项

session_set_cookie_params(3600);

http://php.net/manual/en/function.session-set-cookie-params.php

于 2015-12-17T12:39:13.893 回答
0

刚刚添加:

ini_set('session.use_cookies', 1);

问题是:我没有在本地网络上使用它,但我读到默认值为 1(真),并且可能在我的实时服务器上设置为 0。现在它可以正常工作了。谢谢。

于 2015-12-17T14:28:44.337 回答