26

如何在 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 秒后重置。

4

7 回答 7

41

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

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

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

例如,3600 秒是一小时,对于 2 小时 3600*2 = 7200。

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

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

  • session_id 整数
  • 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

如果用户返回:

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
    }
}

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

于 2011-06-15T15:39:37.693 回答
23

在几秒钟内将以下 php 参数设置为相同的值:

session.cookie_lifetime
session.gc_maxlifetime

在 php.ini、.htaccess 或例如

ini_set('session.cookie_lifetime', 86400);
ini_set('session.gc_maxlifetime', 86400);

一天。

链接:

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

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

于 2014-06-22T11:47:17.257 回答
17

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

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

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

于 2018-11-26T16:15:54.117 回答
4

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

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

于 2011-06-15T15:24:00.123 回答
1

由于大多数会话都存储在 COOKIE 中(根据上述评论和解决方案),因此确保将 COOKIE 标记为 SECURE 非常重要(前面的 C#):

myHttpOnlyCookie.HttpOnly = true;

和/或 vie php.ini(自 php 5.3 起默认为 TRUE):

session.cookie_httponly = True
于 2019-09-03T08:02:18.380 回答
0

我没有在任何地方看到这一点,但是如果文件具有较低的值并且服务器托管多个域/虚拟主机ini_set('session.gc_maxlifetime', $max_lifetime);,则 PHP 文件本身的设置通常不会产生预期的影响。php.ini如果您在 X 网站上有用户,并且在 PHP 文件中将 maxlifetime 设置为 10 秒(不是实际值,这只是示例),然后在 php.ini 中将 maxlifetime 设置为 5,那么将会发生一些有趣/意外的事情如果您有多个域/虚拟主机。

当第二个用户访问一个ini_set('session.gc_maxlifetime', $max_lifetime);在其 PHP 文件中设置的 HASNT 站点并且它默认为任何php.ini具有的站点时,这将导致 PHP 的垃圾收集使用 5 秒而不是 10 秒作为 maxlifetime 触发,从而删除应该持续的用户会话至少 10 秒。

因此,如果您的设置具有此功能并属于此类场景,则此设置几乎不应该进入 PHP 文件本身,并且实际上应该在 vhost 条目中。唯一的例外是,如果您的服务器仅托管 1 个网站/虚拟主机,其 PHP 文件将始终覆盖 php.ini 的任何内容。

发生这种情况是因为所有站点都使用相同的 tmp 目录来存储会话数据。另一个缓解解决方案是为每个虚拟主机设置会话 tmp 目录。另一个(不推荐)解决方案是通过将其设置为session.cookie_lifetime完全禁用。php.ini0

于 2021-12-11T18:00:18.357 回答
-3

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

于 2011-06-15T15:22:45.273 回答