【问题标题】:How to set lifetime of session如何设置会话的生命周期
【发布时间】:2011-09-15 15:34:42
【问题描述】:

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

【问题讨论】:

    标签: php session lifetime


    【解决方案1】:

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

    如果用户返回:

    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 调用。

    【讨论】:

    • 这似乎是一个简单问题的过于复杂的解决方案。在配置或 .htaccess 文件中设置 session.cookie_lifetime 的值有什么问题?您建议的方式需要在每个需要会话的 PHP 文件中添加额外的代码。
    • 是的,但是我写了简单的解决方案(在“但是,它...”之前),其余的或响应是“我想将它设置为永远”,呵呵,session.cookie_fifetime , 是服务器端配置,但浏览器将其管理为“会话 cookie”。对于简单的解决方案,也可以使用 session_set_cookie_params。
    • 显然,我使用的会话是保存大数据,只要存在 ajax 请求,每 10 秒就会更改一次。这就是我需要将其设置为永远的方式。顺便说一句,很好的答案谢谢
    • 你的例子中的过期时间“604800”,应该是:“time()+604800”,是一个绝对参考。
    • @Hanoncs 错误,session.cookie_lifetime 在 php.ini 中默认为 0,这意味着它是一个会话 cookie,而不是永远存在。
    【解决方案2】:

    在几秒钟内将以下 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

    【讨论】:

      【解决方案3】:

      在 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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

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

          myHttpOnlyCookie.HttpOnly = true;
          

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

          session.cookie_httponly = True
          

          【讨论】:

            【解决方案6】:

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

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

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

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

            【讨论】:

              【解决方案7】:

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

              【讨论】:

              • 不是真的!一点也不。服务器端的会话 cookie 都会过期。
              • 对不起,这是不正确的。会话变量将过期
              猜你喜欢
              • 1970-01-01
              • 2015-07-09
              • 2017-11-08
              • 1970-01-01
              • 2012-04-07
              • 1970-01-01
              • 1970-01-01
              • 2015-07-03
              • 2013-12-29
              相关资源
              最近更新 更多