2010-02-19 19 views
0

我在长时间保存会话状态时遇到了麻烦。我使用会话来保存登录状态。在任何其他代码之前,我需要在每个页面顶部的下面的代码片段。首先,有没有我错过的设置?php如何保存会话状态很长一段时间?麻烦

session_cache_expire(2880); //set session to expire in 48 hours 
session_start(); 

有些人在48小时过期前注销。什么类型的东西可能导致这种情况?我知道关闭浏览器杀死会话,情况并非如此。

据我所知,当用户闲置几个小时或更长时间时会发生这种情况。

用户在主动浏览网站时从未注销。

什么给?

+0

我还以为那写会话数据进行某种永久存储(即数据库),然后重装它当用户返回到该网站会比滥用这样的会议一个更好的解决方案。 – Ant 2010-02-19 14:47:27

+0

我不知道有关滥用情况...使用单个会话变量来跟踪用户登录..是好..好吧。 – payling 2010-02-19 15:01:28

+0

我同意Ant,长时间的会话寿命增加了黑客可以访问会话的窗口。我个人倾向于使用30分钟的超时时间。如果用户与会话交互,则30分钟再次开始。您是否会在开机,登录和解锁2天后让您的电脑无人值守? – 2010-02-19 15:06:35

回答

1

这只影响浏览器缓存会话页面的时间。

尝试设置gc_maxlifetime变量(值是以秒):

ini_set("session.gc_maxlifetime", "172800"); 
+0

这是PHP 5.3正确吗?我提到我在使用5.2.5吗?哎呀.. – payling 2010-02-19 14:58:54

+0

自PHP4以来,ini_set和session.gc_maxlifetime都在PHP中,因此它们将在5.1,5.2,5.3 ...上工作。 – 2010-02-19 15:04:29

+0

哦,我看了手册,它说PHP5> = 5.3。起初我没有正确阅读。谢谢! – payling 2010-02-19 15:13:39

1

session_cache_expire仅影响HTTP缓存过期时间。你想要做的是使用cookie来设置你的会话数据。

以下是我用于登录/注销会话的示例。

<?php 

session_start(); 

if ($action == "logout") { 
    setcookie('sId', '', time()-60*60*24*365); //set sId cookie to expire 

    session_destroy(); 
} else if (empty($_SESSION['sId'])) { //if cannot get sId from session 
    if (isset($_COOKIE['sId'])) { //check if sId is in cookie 
    $sId = $_COOKIE['sId']; 
    } else { //get a new sId and set to cookie 
    $sId = session_id(); 
    setcookie('sId', $sId, time()+60*60*24*365); 
    } 

    $_SESSION['sId'] = $sId; 
} else { //get sId from session 
    $sId = $_SESSION['sId']; 
} 

?> 
+0

我存储的会话变量是用户登录ID,将它存储在cookie中是一个好主意吗? – payling 2010-02-19 15:19:53

+0

Cookie并不是存储会话数据的绝佳方式 - 尤其是在敏感的情况下,因为每次请求都会传递到服务器以及从服务器传出。这是您希望存储在PHP中作为标准的cookie中的会话ID,然后使用php.ini来自定义会话处理(例如超时)或编写自己的会话。 – 2010-02-22 13:02:52