【问题标题】:I'm trying to increase session timeout time我正在尝试增加会话超时时间
【发布时间】:2011-02-14 20:37:30
【问题描述】:

我正在尝试增加 SESSION 时间,以便用户不会在 12 小时内超时。这是一个仅供员工使用的私人网站,超时很烦人,它会导致部分填写的数据丢失。根据我阅读的内容,以下代码应该可以工作:

ini_set('session.gc_maxlifetime',12*60*60); 
ini_set('session.gc_probability',1); 
ini_set('session.gc_divisor',1);        
session_start();

但它没有效果。有什么想法吗?

谢谢

【问题讨论】:

    标签: php session-timeout


    【解决方案1】:
    ini_set('session.gc_probability',1); 
    ini_set('session.gc_divisor',1);
    

    这两个迫使 PHP 为您网站上的每一次点击运行会话清理脚本。 PHP 运行 gc 的公式是:

    if (random() < (gc_probability / gc_divisor)) then
          run_session_garbage_collector()
    }
    

    现在你有 1/1,所以垃圾收集器有 100% 的机会运行。虽然延长超时时间很好,但您还想减少收集器运行的机会。否则,您将强制 PHP 对所有会话文件进行全面扫描,并针对您网站上的每一次点击解析每个文件,以找到可能已过期的奇数一两个。

    尝试将 gc_probability 设置为 0 以完全禁用垃圾收集器。

    另外,请注意,在使用 ini_set() 的脚本中更改设置不会更改其他脚本使用的超时/默认值。此脚本可能有更长的超时时间和更改的概率,但如果其他脚本具有默认超时时间(10 分钟或其他时间),那么他们会很乐意对任何“陈旧”会话进行核对。

    设置会话超时/清理设置的正确位置是在 php.ini 级别,因此它适用于站点上的所有脚本,而不仅仅是您的单个脚本。

    【讨论】:

      【解决方案2】:

      您可以尝试在 php.ini 文件中设置 session.gc_maxlifetime = 12*60*60。 否则当你的脚本结束时 session.gc_maxlifetime 变量每次都会被重置。

      来自 php.net/ini_set:

      string ini_set ( string $varname , string $newvalue )

      设置给定配置选项的值。配置选项将在脚本执行期间保留此新值,并在脚本结束时恢复。

      【讨论】:

        【解决方案3】:

        会话 cookie 也可能会过期:session.cookie-lifetime

        【讨论】:

          【解决方案4】:

          我不确定“私人网站”是否意味着它单独位于专用服务器上,但如果不是:

          如果您的会话临时文件与其他网站的 tmp 文件存储在同一目录中,则可能是另一个网站上较低的会话生命周期触发垃圾收集,可能删除您的“私人网站的“会话。取决于服务器设置。就我个人而言,我为每个客户都有一个 tmp 文件夹以避免类似的事情发生。

          【讨论】:

            【解决方案5】:

            session.gc_divisor 加上 session.gc_probability 定义了 gc(垃圾收集)进程在每次会话初始化时启动的概率。概率是通过使用 gc_probability/gc_divisor 计算的,例如1/100 表示 GC 进程有 1% 的机会在每个请求上启动。 session.gc_divisor 默认为 100。

            所以你做的 1/1 - 我不确定这将如何实际运作,但它可能是奇怪的行为。

            【讨论】:

              【解决方案6】:

              希望这会对您有所帮助。只需将下面的代码复制并粘贴到 web.config 文件中

              <sessionState mode="InProc" stateNetworkTimeout="10" sqlCommandTimeout="30" cookieName="ASP.NET_SessionId" timeout="53200" regenerateExpiredSessionId="false">
                  <providers><clear/></providers>
              </sessionState>
              

              【讨论】:

                猜你喜欢
                • 2012-01-29
                • 2016-03-02
                • 1970-01-01
                • 2023-03-18
                • 2011-07-11
                • 2019-09-27
                • 2018-01-28
                • 2018-04-06
                • 2011-01-22
                相关资源
                最近更新 更多