PHP会话在40分钟后到期

时间:2015-02-14 02:25:42

标签: php session

我编写了此代码来管理会话,以便在浏览器关闭或用户在指定时间(2小时)内处于非活动状态时它们会过期。然而,似乎会议在40分钟不活动后到期,我真的不明白这是怎么回事。如果我的代码失败,我预计它们应该持续1440秒(24分钟)。

define("MY_SESSION", "mysession");
define("SESSION_DURATION", 7200);
function my_session_start() {
    if (session_status() != PHP_SESSION_NONE)
        return;
    ini_set('session.gc_maxlifetime', SESSION_DURATION);
    ini_set('session.cookie_lifetime', 0);
    session_set_cookie_params(0);
    session_name(MY_SESSION);
    session_start();
    if ((!isset($_SESSION['EXPIRES'])) || ($_SESSION['EXPIRES'] < time())) {
        $_SESSION = array();
        session_unset();
        session_destroy();
        session_start();
    }
    $_SESSION['EXPIRES'] = time() + SESSION_DURATION;
    if (isset($_SESSION['REGENERATE'])) {
        $_SESSION['REGENERATE']++;
        if ($_SESSION['REGENERATE'] >= mt_rand(90,100)) {
            $_SESSION['REGENERATE'] = 0;
            session_regenerate_id(true);
        }
    }
    else {
        $_SESSION['REGENERATE'] = 0;
        session_regenerate_id(true);
    }
}

我在每个PHP文件中放置了my_session_start()。 我在共享服务器上但未阻止ini_set(),并且在phpinfo()之后启动my_session_start()我可以看到session.gc_maxlifetime本地值设置为7200 (主值为1440)。 session.gc_probabilitysession.gc_divisor保留默认值(分别为1和100)。 我也在90-100页面加载/ AJAX调用的随机基础上重新生成会话ID,但这并不重要,因为我还试图注释掉那部分并且它没有解决问题。

那么,我的代码做错了吗?那个分钟数量来自哪里,我的意思是为什么40分钟?

1 个答案:

答案 0 :(得分:1)

所以我终于想出了如何解决这个问题。 解决方案是更改会话文件保存文件夹:

ini_set('session.save_path', "/the/new/path/to/sessions/"); //DEFAULT: /var/lib/php5

这样做意味着可能会查看会话文件,因此我添加了包含以下内容的.htaccess文件:

deny from all

inside&#34; / / new / path / to / sessions /&#34;夹。因此,无法从服务器外部查看任何内容。

另外,我必须添加一个新的会话垃圾收集功能:

function clear_old_sessions() {
    $folder = "/the/new/path/to/sessions/";
    $files = scandir($folder);
    for ($i = 0; $i < count($files); $i++) {
        $file = $folder . $files[$i];
        if (is_file($file))
            if (substr($files[$i], 0, 5) == "sess_")
                if ((filemtime($file) + SESSION_DURATION) < time()) // SESSION_DURATION previosuly defined as 7200 (seconds)
                            unlink($file);
    }
}