2010-08-10 85 views
4

我是新来的PHP和我试图建立一个网站。如果他闲置一段时间,我想注销用户会话。我搜索了网页,但找不到合适的代码。你如何检查用户是否闲置或不在PHP?任何人都可以帮助我。如何注销会话,如果用户空闲在PHP

回答

12

有几个方法可以做到这一点。这里有一对夫妇...

  • 设置会话终止时间,以便在一段时间后,会话过期并且不再有效。

  • 设置一个“时间”标志作为会话数据,并检查他们的会话仍然是“足够新”,让他们在每个页面加载登录。

我会选择第二个选择,因为它可能很难设置PHP正确的价值观,使得安全会话过期,你希望它的方式。对于第二个选项,所有你需要做的就是确保会议将过期,你希望它之前,哪一个更容易。

代码示例选项2:

//on pageload 
session_start(); 

$idletime=60;//after 60 seconds the user gets logged out 

if (time()-$_SESSION['timestamp']>$idletime){ 
    session_destroy(); 
    session_unset(); 
}else{ 
    $_SESSION['timestamp']=time(); 
} 

//on session creation 
$_SESSION['timestamp']=time(); 

编辑:

你的意见解释说,你实际上是想保持在客户端跟踪鼠标事件和其他的东西来确定如果用户闲置。这更复杂。我会给出一个通用的解决方案,然后提供一些有关优化和改进的建议。

要完成你所描述的东西,你必须跟踪客户方活动(鼠标移动,键盘敲击等)和过程在服务器端信息。

跟踪客户方活动需要JavaScript事件处理程序。你应该为每一个你想要算作“不闲置”的动作创建一个事件处理程序,并且保持它们最后一次闲置的时间(在一个javascript变量中)。

处理是在服务器端信息将要求您使用AJAX送他们最后一次一直闲置到服务器。因此,每隔几秒钟,您应该向服务器发送更新(使用JavaScript),该更新指定用户闲置的时间。

一对额外的建议:

  1. 你不应该依赖于这个Ajax解决方案作为唯一的方法来追踪用户活动,因为有些用户将无法启用JS。所以,你也应该跟踪页面载入的用户活动。因此,您可能不应该将空闲时间设置得太低(至少对于非JS用户),因为在发生页面加载之前,非JS用户不会向服务器发送任何数据。

  2. 你应该通过AJAX尽可能少地更新发送到服务器关于用户活动的减少服务器上的需求。要做到这一点,只需让javascript跟踪用户何时超时。如果它达到用户即将超时的时间点(比如大约一分钟左右),则然后只有才能ping服务器。

+1

你也可以使用一个计时器在JavaScript中,将带你到此后的登录页面已启用。 – jtbandes 2010-08-10 22:06:01

+0

incrediman 感谢您的答复。但不检查用户是否闲置,如我们需要检查鼠标事件等。它只是让用户在指定时间后注销。 – sudh 2010-08-10 22:10:37

+0

@sudh:要做到这一点更复杂,并需要JavaScript。我会更新我的答案。 – Cam 2010-08-10 22:13:39

1

您可以配置PHP的配置为session.cookie_lifetime,这会在空闲时间量后自动销毁会话。
更多信息可以在这里找到http://www.php.net/manual/en/session.configuration.php#ini.session.cookie-lifetime

+0

+1谢谢。我需要将其设置为最大值,然后确保我更频繁地进行轮询。我更新了这个问题,因为我忘记指出我的PHP需要知道超时以更新数据库。 – Mawg 2011-04-30 04:29:31

1

您可以使用session_cache_expire,我给你这个例子:

<?php 

/* set the cache limiter to 'private' */ 

session_cache_limiter('private'); 

$cache_limiter = session_cache_limiter(); 

/* set the cache expire to 30 minutes */ 

session_cache_expire(30); 

$cache_expire = session_cache_expire(); 

/* start the session */ 

session_start(); 

echo "The cache limiter is now set to $cache_limiter<br />"; 

echo "The cached session pages expire after $cache_expire minutes"; 

?> 

来源:php.net

+0

+1谢谢。我需要将其设置为最大值,然后确保我更频繁地进行轮询。我更新了这个问题,因为我忘记指出我的PHP需要知道超时以更新数据库。 – Mawg 2011-04-30 04:29:58