【问题标题】:How does a server judge a session to be expired and how can the expiry time be changed?服务器如何判断会话过期,如何更改过期时间?
【发布时间】:2011-01-20 14:59:41
【问题描述】:

我了解可以为会话 cookie 赋予一个生命周期 (session.cookie_lifetime),并且在该生命周期之后,无论用户是否与网站交互,cookie 都会过期。

因此,我假设将其设置为 0 以表明它们应该保持活动状态,直到浏览器关闭。

我还认为我理解可以为 cookie 设置垃圾回收生命周期 (session.gc_maxlifetime),只要用户在点击之间不超过此时间,那么 cookie 将保持活动状态。

为了测试这一点,我一直在尝试让会话超时 10 秒。

我试过了:

ini_set('session.gc_maxlifetime',10);

但会话至少在 1 分钟后不会超时。

这是因为我只是对垃圾收集器说会话的生命周期为 10 秒,但我实际上并没有触发垃圾收集器吗?

您如何设置垃圾收集器,还是只在每次请求会话时运行?

【问题讨论】:

    标签: php session garbage-collection cookies


    【解决方案1】:

    首先,不要混淆 cookie 设置(客户端)和垃圾收集(服务器端)。 Cookie 设置只影响 session_id 的过期时间。即使浏览器删除了cookie,会话数据可能仍然存在于服务器上,相反,服务器可以在浏览器仍然记住session_id的情况下删除数据。

    cookie 可以设置为在您关闭浏览器时或在特定日期和时间过期(我相信默认选项是第一个选项,但我必须检查一下)。在这两种情况下,如果用户与网站交互,则 cookie 将保持有效,因为它会在每次响应时更新。

    启动垃圾回收时会删除会话数据,但您必须考虑到:

    1. 垃圾收集随机启动,由页面请求触发。

    2. 它会删除在 gc_maxlifetime 秒内未修改的会话数据。

    3. 默认情况下,会话数据存储在文件中,PHP 不会跟踪哪个站点拥有哪些文件。这意味着将会话存储在默认共享位置会使您失去对会话过期的控制:配置为将会话数据保留最短时间的站点很可能会从其他站点中删除更长时间的数据。

    总而言之,如果您想完全控制数据生命周期,您需要将会话数据存储在私有目录中,例如:

    session_save_path('/home/foo/sessions');
    ini_set('session.gc_maxlifetime', 3*60*60); // 3 hours
    ini_set('session.use_only_cookies', TRUE);
    session_start();
    

    【讨论】:

    • 感谢您的澄清,最有帮助,尤其是私有目录位,这是有道理的。但是,我尝试了 10 秒超时的代码,但它没有注销(至少一分钟后)。
    • 刚刚在规模的另一端尝试过,并将其设置为 3 小时,如您的代码中所示。我的应用程序有一个小时超时,我通过将时间存储在会话变量中来创建,但服务器在此之前清除了我的会话(可能是默认的 24 分钟)。但我使用了你的代码,它让我保持登录状态。也许 gc_maxlifetime 有一个最小设置。
    • 关于 10 秒超时:记住,垃圾收集器随机启动!如果它平均每 10 秒运行一次,那么您的服务器配置严重错误 ;-)
    【解决方案2】:

    服务器在它的 INI 文件中设置了默认超时,如果没有从脚本中覆盖的话。我相信在 apache 中它是从 PHP.ini 中设置的。还需要开启垃圾回收功能,相信在php.ini中也有设置。

    【讨论】:

      猜你喜欢
      • 2012-02-29
      • 1970-01-01
      • 2019-08-06
      • 1970-01-01
      • 1970-01-01
      • 2018-01-05
      • 2013-10-06
      • 2015-08-18
      • 2016-10-26
      相关资源
      最近更新 更多