我正在尝试增加会话超时时间

时间:2011-02-14 20:37:30

标签: php session-timeout

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

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

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

感谢

6 个答案:

答案 0 :(得分:4)

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()的脚本中更改设置不会更改OTHER脚本使用的超时/默认值。此脚本可能具有更长的超时和更改概率,但如果其他脚本具有默认超时(10分钟或更长时间),那么他们将很乐意核对任何“陈旧”会话。

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

答案 1 :(得分:2)

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

来自php.net/ini_set:

  

string ini_set ( string $varname , string $newvalue )

     

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

我不确定“私人网站”是否意味着它仅在专用服务器上,但如果没有:

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

答案 4 :(得分:1)

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

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

答案 5 :(得分:0)

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

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