如果会话存在,则按ID检查,而不更新会话的生命周期

时间:2010-06-04 12:29:48

标签: php session lifetime

我在RIA工作。我们使用Memcached来存储会话,我已经安装了http://pecl.php.net/package/memcache,我的PHP会话处理程序如下所示:

$session_save_path = "tcp://$host:$port?persistent=1&weight=2&timeout=2&retry_interval=10,  ,tcp://$host:$port  ";
ini_set('session.save_handler', 'memcache');
ini_set('session.save_path', $session_save_path);

会话超时设置为30分钟。在我的RIA中,我希望通过AJAX定期调用服务器端脚本来检查访问者的会话是否仍然存在。如果ajax调用返回false,我会在屏幕上停电并显示一个漂亮的重新连接框以继续会话。

现在问题在于服务器端脚本。我需要确定会话是否存在而不延长会话的生命周期(如果它存在)。

我对会话处理程序的工作方式并不完全了解,但我很确定我是否会这样做:

<?
session_start();
if($_SESSION['loggedin'] == "yes")
    echo "true";
else 
    echo "false";
?>

我很确定这会更新会话的生命周期(在服务器端,但也可以在客户端通过向客户端发送新的cookie)。会议将无休止地存在。

我考虑过的一些选项,但排除在外:

  • 不要进行任何服务器端调用,而是在客户端上使用javascript计时器(例如,在30分钟后过期)。当用户在多个窗口中打开RIA时,这将不起作用
  • 尝试破解session_start()以防止它向客户端发送新的新cookie。这可能适用于客户端,但到期时间仍会在内部session_handling处刷新。

我想要一些想法,T.i.a。

2 个答案:

答案 0 :(得分:1)

您不必将会话超时与授权超时等同起来。我建议在会话中存储一个额外的变量,即用户登录时的时间戳。然后,如果会话不存在或时间戳太旧,您可以考虑用户注销。作为副作用,它还可以提供额外的精确度,因为会话不能保证在您设置时准确到期,但可能会延迟一段时间,直到垃圾收集运行。

事实上,我建议你将这个功能包装在一个简单的类中,并执行以下操作:

$acl->logIn($username); //set the user as logged in
$acl->isLoggedIn($username); //Is he still logged in?

等等

答案 1 :(得分:0)

不要仅使用Javascript验证您的用户。你只是要求一些严重的安全问题。

您使用Ajax检查$ _SESSION ['loggedin']的第一种方法是有效的 - 如果他们之前的会话已经过期,它会在继续之前生成一个新的会话ID,因此不会设置$ _SESSION ['loggedin']