防止非活动用户的 PHP 会话中的会话过期


Prevent session expired in PHP Session for inactive user

我的应用程序有问题:我的应用程序有很多表单,大约需要 1 小时才能完成此表单,因为表单是动态的(可以添加其他表单)。问题是:我的 Web 服务器的会话是 24 分钟。当用户填写表单时,他们花费了很长时间,并且会话超时,因为服务器识别出用户处于非活动状态。提交表单时非常烦人,大多数数据丢失,用户返回到登录页面。我试图使用以下代码使我的会话在 10 小时内过期:

ini_set('session.gc_maxlifetime', '36000');

但是它在我的服务器中不起作用,我的服务器是否有可能阻止ini_set()功能?

那么,我应该怎么做才能解决这个问题呢?是否可以防止会话超时,以便将会话扩展到 10 小时?或者我可以禁用会话过期吗?

谢谢

不要将 ini 中的时间设置为固定长度,而是提醒会话超时在重新加载时重置。因此,创建一些 ajax 代码,每 5 分钟左右对文件(图像或 smth)执行一次请求。这样,计时器每 5 分钟重置一次,用户可以花一天时间填写表单。

下面是一个通过使用jQuery Ajax调用来防止会话超时的示例:

var refreshTime = 600000; // every 10 minutes in milliseconds
window.setInterval( function() {
    $.ajax({
        cache: false,
        type: "GET",
        url: "refreshSession.php",
        success: function(data) {
        }
    });
}, refreshTime );

在刷新会话中.php您可以执行类似 session_start() 的操作

我过去也遇到过同样的问题。为了解决这个问题,我所做的是将这两个函数放在一个配置文件中,该文件包含在每个文件中。

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

只是为了安全起见,在我的.htaccess文件中测量这一行

php_value session.gc_maxlifetime 86400
只要

在调用session_start之前更改选项,使用ini_set更改session.gc_maxlifetime就应该有效。因此,执行以下操作应该有效:

ini_set('session.gc_maxlifetime', 36000);
session_start();

您也可以在其他上下文中更改该选项(请参阅ChazUK的答案)。

但我不会将 cookie 的生命周期设置为固定值,而是使会话的 cookie 成为真正的会话 cookie,持续到浏览器会话结束(即浏览器关闭时)。您可以通过将session.cookie_lifetime设置为 0 来执行此操作。

还要考虑到 PHP 的会话过期模型有点古怪,因为生命周期计算基于会话数据的上次修改日期。

会话 Cookie

的持续时间是在创建会话 Cookie 时设置的。 如果您使用 setcookie 方法,则该方法的参数是您希望 cookie 持续存在的长度。

有关其他信息,请参阅 PHP 手册中有关该方法的信息:http://php.net/manual/en/function.setcookie.php

<script>
    var refreshTime = 180000; // every 3 minutes in milliseconds
    $(document).ready(function(){
 setInterval(sessionCheck,refreshTime);
});
function sessionCheck() {
    $.ajax({
        cache: false,
        type: "GET",
        url: "refreshSession.php",// <?php session_start(); ?>
        success: function(data) {
        }
    });
    }
</script>