【问题标题】:Prevent session expired in PHP Session for inactive user防止会话在非活动用户的 PHP 会话中过期
【发布时间】:2011-08-23 04:33:50
【问题描述】:

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

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

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

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

谢谢

【问题讨论】:

  • 您可以基于cookies和数据库或文件实现自己的会话系统。
  • 请选择一个答案作为您的主题的答案。
  • @jcubic -> 是的,先生,我已经实现了 cookie。因此,如果会话过期,cookie 仍然保存登录数据,但是当用户提交表单时,页面重定向到起始页面(登录成功时我们首先查看的页面)。重定向路由是form page (when submit, session expired) -> login page (if cookies true) -> starting page,所以数据丢失了
  • 我的意思是,不要使用 $_SESSION (session_start) 使用 cookie 并将变量保存在数据库或文件中。当用户登录时创建一个令牌并将其保存在 cookie 中并基于此令牌存储您的变量。

标签: php session session-timeout


【解决方案1】:

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

【讨论】:

  • 不敢相信迄今为止解决该问题的最佳解决方案之一已经获得了 0 个支持 -.- 只是增加会话寿命应该是最糟糕的解决方案 - 这是一个巨大的安全风险而且我从来没有见过 每个 用例必须有一个长期会话业务逻辑的 Web 应用程序......所以,对需要它的用例进行一些 ajax 调用,然后离开服务器端的会话超时时间 untouched !哎呀...
  • 能给个示例代码吗?我没有使用 ajax 的经验。
  • 那么现在 chrome 暂停后台标签会发生什么?
【解决方案2】:

这是一个使用 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()

的操作

【讨论】:

  • 最佳答案,instagram 和 facebook 使用这种方法
  • 这是一个不错的答案,但我不明白在该脚本上执行 session_start 的建议,因为例如在我的案例中 session_start 已经发生。有人可以向我澄清这一点吗?
  • 这个没有会话脚本。这是让您的用户从您的服务器加载某些内容的 javascript。 (刷新Sesson.php)。该代码是 Javascript 并且看起来正在使用 jQuery。假设您的 refreshSession.php 文件中有 session_start,用户(在本例中为 ajax 调用)点击刷新页面将重新启动会话。
【解决方案3】:

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

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

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

php_value session.gc_maxlifetime 86400

【讨论】:

  • 我有:session.cookie_lifetime = 200000; session.gc_maxlifetime = 600000。但是这无济于事,并且数据有时会在表单提交时丢失。请问有什么想法吗?
【解决方案4】:

使用ini_set 更改session.gc_maxlifetime 应该可以工作,只要您在调用session_start 之前更改选项。因此,执行以下操作应该可以:

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,因为生命周期计算是基于会话数据的最后修改日期。

【讨论】:

  • 1 在session_start(); 之前尝试过使用ini_set('session.gc_maxlifetime', 36000);,但它在我的服务器上不起作用。我在超过 24 分钟内忽略了我的网站,当我刷新它时,它会重定向到登录页面。我的服务器有可能阻止 ini_set() 函数吗?要不然是啥?谢谢楼主
  • 好吧,我明白了,ini_set('session.gc_maxlifetime', '36000'); 和 ini_set('session.gc_maxlifetime', 36000); 之间有什么不同吗?先生 ?看数字单引号:)
  • 我在数字中使用单引号:D
  • @dian:不,在这种情况下是否使用引号没有任何区别。但是你检查会话ID是否相同?
【解决方案5】:

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

更多信息请参考PHP手册中的方法: http://php.net/manual/en/function.setcookie.php

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-15
    • 1970-01-01
    • 2013-10-13
    • 2011-01-06
    • 2021-12-28
    • 2014-12-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多