如何设置会话的生命周期

bri*_*ian 24 php session lifetime

如何在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']));
?>
Run Code Online (Sandbox Code Playgroud)

和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

});
Run Code Online (Sandbox Code Playgroud)

会话总是在300秒后重置.

Exo*_*xos 34

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

要在php中设置时间生命,可以在session_start之前使用session_set_cookie_params 函数:

session_set_cookie_params(3600,"/");
session_start();
Run Code Online (Sandbox Code Playgroud)

例如,3600秒是1小时,2小时3600*2 = 7200.

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

你可以有一个表"会话":

  • session_id int
  • session_hash varchar(20)
  • session_data文本

并验证Cookie,在客户端保存"会话ID"和"哈希"(用于安全性),您可以在服务器端保存会话数据,例如:

登录时:

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
Run Code Online (Sandbox Code Playgroud)

如果用户返回:

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
    }
}
Run Code Online (Sandbox Code Playgroud)

显然,在发送数据之前保存所有会话/ cookie调用.

  • 对于一个简单的问题,这似乎是一个过于复杂的解决方案.在配置或.htaccess文件中设置session.cookie_lifetime的值有什么问题?您建议的方式需要在需要会话的每个PHP文件中添加其他代码. (2认同)
  • 示例中的“ 604800”到期时间应为:“ time()+ 604800”是绝对引用。 (2认同)
  • @Hanoncs错误,`session.cookie_lifetime`在php.ini中默认为0,这意味着它是一个会话cookie,而不是它永远持续. (2认同)

小智 15

将以下php参数设置为相同的值,以秒为单位:

session.cookie_lifetime
session.gc_maxlifetime
Run Code Online (Sandbox Code Playgroud)

在php.ini,.htaccess或例如

ini_set('session.cookie_lifetime', 86400);
ini_set('session.gc_maxlifetime', 86400);
Run Code Online (Sandbox Code Playgroud)

一天.

链接:

http://www.php.net/manual/en/session.configuration.php

http://www.php.net/manual/en/function.ini-set.php


小智 6

在PHP 7之前,session_start()函数不直接接受任何配置选项。现在你可以这样

<?php
// This sends a persistent cookie that lasts a day.
session_start([
    'cookie_lifetime' => 86400,
]);
?>
Run Code Online (Sandbox Code Playgroud)

参考:https : //php.net/manual/zh/function.session-start.php#example-5976


Fra*_*nes 5

会话可以在 php.ini 文件或 .htaccess 文件中配置。查看PHP 会话文档

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