Php I';我正在尝试增加会话超时时间

Php I';我正在尝试增加会话超时时间,php,session-timeout,Php,Session Timeout,我正在尝试增加会话时间,以便用户不会在12小时内超时。这是一个仅供员工使用的私有站点,超时很烦人,会导致部分填写的数据丢失。根据我阅读的内容,以下代码应该可以工作: ini_set('session.gc_maxlifetime',12*60*60); ini_set('session.gc_probability',1); ini_set('session.gc_divisor',1); session_start(); 但它没有效果。有什么想法吗 谢谢,会话cookie

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

ini_set('session.gc_maxlifetime',12*60*60); 
ini_set('session.gc_probability',1); 
ini_set('session.gc_divisor',1);        
session_start();
但它没有效果。有什么想法吗


谢谢,会话cookie可能也将过期:

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

从php.net/ini\u集合:

string ini\u集(string$varname,string$newvalue)

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

我不确定“私有站点”是否指专用服务器上的单独站点,但如果不是:

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

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()
}
如果(random()<(gc\u概率/gc\u除数))那么
运行会话垃圾收集器()
}
现在你有1/1,所以垃圾收集器运行的概率是100%。虽然延长超时时间很好,但您也希望减少收集器运行的机会。否则,您将强制PHP对所有会话文件进行完整扫描,并对每个文件进行解析,以查找可能已过期的奇数文件

尝试将gc_概率设置为0以完全禁用垃圾收集器

另外,请注意,在使用ini_set()的脚本中更改设置不会更改其他脚本使用的超时/默认值。这个脚本可能有更长的超时时间和更改的概率,但如果其他脚本有默认超时时间(10分钟或更多),那么它们将很高兴地取消任何“过时”会话

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

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


所以你做的是1/1-我不确定它到底会起什么作用,但这可能是一种奇怪的行为

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

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