2011-06-15 120 views
19

如何设置PHP的会话生存期?我希望只要请求存在就将其设置为永久。请求是AJAX。该处理AJAX请求我的PHP代码:如何设置会话的生存期

// AJAX.php 
<?php  
session_start(); 

$_SESSION['counter'] = $_SESSION['counter'] + 1; 

header('Content-type: application/json');  
echo json_encode(array('tick' => $_SESSION['counter'])); 
?> 

和JavaScript:

$(document).ready(function() {    
function check() { 
    getJSON('ajax.php');   
} 

function getJSON(url) {         
    return $.getJSON(
       url, 
       function(data) { 
        $("#ticker").html(data.tick); 
       } 
      ); 
} 

setInterval(function() { 
    check(); 
}, 10000); // Tick every 10 seconds 

}); 

会议总是后经过300秒重置。

回答

31

PHP上的会话使用Cookie类型会话,而在服务器端,会话信息会不断删除。

对于设置在PHP中的时间的生活,你可以使用函数session_set_cookie_params中,在session_start前:

session_set_cookie_params(3600,"/"); 
session_start(); 

对于离3600秒为一个小时,2小时3600 * 2 = 7200

但是它是会话cookie,浏览器可以自行过期,如果你想节省大量的时间会话(如记住登录),你需要将数据保存在服务器和客户端的标准cookie。

你可以有一个表 “会话”:

  • SESSION_ID INT
  • session_hash VARCHAR(20)
  • session_data是文本

和验证一个Cookie,你救了“会议ID“和”hash“(用于安全),并且可以将会话的数据保存在服务器端,例如:

在登录:

setcookie('sessid', $sessionid, 604800);  // One week or seven days 
setcookie('sesshash', $sessionhash, 604800); // One week or seven days 
// And save the session data: 
saveSessionData($sessionid, $sessionhash, serialize($_SESSION)); // saveSessionData is your function 

如果用户返回:

if (isset($_COOKIE['sessid'])) { 
    if (valide_session($_COOKIE['sessid'], $_COOKIE['sesshash'])) { 
     $_SESSION = unserialize(get_session_data($_COOKIE['sessid'])); 
    } else { 
     // Dont validate the hash, possible session falsification 
    } 
} 

显然,保存所有会话/饼干电话,发送数据之前。

+2

这似乎是一个简单问题的过于复杂的解决方案。在配置或.htaccess文件中设置session.cookie_lifetime的值有什么问题?您建议的方式在每个需要会话的PHP文件中都需要额外的代码。 – 2011-06-15 17:45:30

+0

是的,但我写了简单的解决方案(之前“但它......”),其余或响应是“我想永久设置它”,嘿,session.cookie_fifetime,是服务器端配置,但浏览器将其作为“会话cookie”进行管理。对于简单的解决方案也可以使用session_set_cookie_params。 – Exos 2011-06-15 19:29:47

+0

很明显,我使用的会话是保存每10秒更改一次的大数据,只要存在ajax请求即可。这是我需要永久设置它的方式。顺便说一句,很好的回答谢谢 – brian 2011-06-16 06:09:52

-2

只要用户不删除他们的cookies或关闭他们的浏览器,会话应该保持存在。

+5

事实并非如此!一点也不。服务器端**和** cookie的会话都将过期。 – bytecode77 2016-03-26 08:21:13

2

会话可以在您的php.ini文件或您的.htaccess文件中配置。看看PHP session documentation

你基本上想要做的是在php.ini中寻找session.cookie_lifetime行,并使其值为0,这样会话cookie在浏览器关闭之前是有效的。如果您无法编辑该文件,则可以将php_value session.cookie_lifetime 0添加到.htaccess文件中。