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

时间:2011-05-11 10:19:25

标签: php session session-timeout

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

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

但它在我的服务器上无效,我的服务器是否可能阻止ini_set()功能?

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

由于

5 个答案:

答案 0 :(得分:38)

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

答案 1 :(得分:30)

这是一个通过使用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 );

在refreshSession.php中,您可以执行类似 session_start()

的操作

答案 2 :(得分:5)

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

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

只是为了安全衡量我的.htaccess文件中的这一行

php_value session.gc_maxlifetime 86400

答案 3 :(得分:3)

只要在调用ini_set之前更改选项,

使用session_start更改 session.gc_maxlifetime 即可。所以做以下工作应该有效:

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

您还可以在其他环境中更改该选项(请参阅ChazUK’s answer)。

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

还要考虑PHP’s session expiration model is a little quirky,因为生命周期计算是基于会话数据的最后修改日期。

答案 4 :(得分:0)

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

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