之间有什么实际差值session.gc_maxlifetime
和session_cache_expire()
假设我想非活动的15分钟后,用户会话是无效的(而不是15日这是第一次打开后)。 其中哪一个会帮助我吗?
我也知道我可以做session_set_cookie_params()
可以设置用户的Cookie在一定时间到期。 但是,该cookie到期和即将到期的在服务器端的实际会话是不一样的; 这是否也删除会话时,该Cookie已经过期?
另一种解决方案我有虽然是简单$_SESSION['last_time'] = time()
在每次请求,并且会话比较当前时间,删除基于所述会话。 我希望有更多的“内置”的机制来处理这虽然。
谢谢。
每次在session_start被称为会话文件时间戳(如果存在的话)被更新,这是用来计算,如果的session.gc_maxlifetime已经被超过。
更重要的是,你不能依赖于一个会话的session.gc_maxlifetime时间已经超过后过期。
PHP运行在过期会话垃圾收集后当前会话被加载并使用session.gc_probability合和session.gc_divisor它计算出的垃圾收集运行的概率。 默认情况下,它的1%的概率。
如果你有访客数量较少存在是不活动的用户可以访问应该已经过期和被删除的会话的概率。 如果这是重要的,你需要存储一个时间戳的会话,并计算出如何注销用户一直无所作为。
这个例子取代的session_start和强制超时:
function my_session_start($timeout = 1440) {
ini_set('session.gc_maxlifetime', $timeout);
session_start();
if (isset($_SESSION['timeout_idle']) && $_SESSION['timeout_idle'] < time()) {
session_destroy();
session_start();
session_regenerate_id();
$_SESSION = array();
}
$_SESSION['timeout_idle'] = time() + $timeout;
}
我花了一些时间寻找一个很好的答案在php.ini服务器设置如何使会话过期。 我发现很多信息,但用了一段时间弄清楚为什么设置的工作他们的方式。 如果你像我一样,这可能会对你有所帮助:
会话存储饼干(客户端的PC文件)或服务器端的服务器上的文件。 这两种方法各有利弊。
对于存储在服务器上的会话,使用三个变量。
session.gc_probability合session.gc_divisor的session.gc_maxlifetime
(session.gc_probability合/ session.gc_divisor)产生的垃圾收集程序将运行的概率。 当垃圾收集器运行时,它会检查尚未至少访问的session.gc_maxlifetime,并删除他们的会话文件。
这是所有在论坛的帖子解释得很好(这其中尤其是!) - 但接下来的问题就上来:
1)如何应用这种可能性? 什么时候服务器的霸气?
一个:服务器滚动骰子每次在session_start()的服务器上的任何有效会话期间被调用。 因此,这意味着你应该看到垃圾收集器运行大约一次每100倍的session_start()被调用,如果你有session.gc_probability合默认= 1和session.gc_divisor = 100
2)低容量服务器会发生什么?
答:当在session_start()被调用它首先刷新会话,使现有的会话值给你。 这会更新服务器上的会话文件的时间。 然后,它滚动骰子并且如果获胜(1出100几率)它调用垃圾收集器。 垃圾收集器会检查所有的会话ID文件,并认为,如果有任何有资格为删除。
因此,这意味着,如果你是在服务器上的唯一的人,你会永远都不会不活跃,它就会出现,就像更改设置没有任何效果。 比方说,你的session.gc_maxlifetime更改为10和session.gc_probability合为100。这意味着有100%的几率将垃圾收集器将运行,它会清除那些没有在最后10秒被访问的任何会话文件。
如果你在服务器上只有一个,你会不会被删除。 你至少需要1等活动会话运行你变为无效。
因此,基本上,一个低容量的服务器上或在低容积时间 - 这可能比的session.gc_maxlifetime更长垃圾收集实际运行和会话实际删除之前。 而且不知道如何工作的,它可能会出现完全随机的给你。
3)为什么他们使用的概率是多少?
一场表演。 在较高的音量服务器,你不想让垃圾收集器上运行)在session_start的每一个请求(。 这将不必要地减慢服务器。 所以要根据您的服务器卷上,您可能需要增加或减少垃圾收集器运行的概率。
我希望这个事情捆绑在一起你。 如果你和我一样,你的session.gc_maxlifetime尝试,它似乎并没有工作(因为你尝试过了一个开发服务器上,从而不会打扰任何人),然后这个帖子希望保存你一些挠头。
祝好运!
的session.gc_maxlifetime是基于关闭的最后一次会话文件已被修改。 所以每一个会话文件被修改的时间或在session_start()被调用在一个单独的页面,倒计时gc_maxlifetime重新开始和用户停留“登录”。 这是你正在寻找的价值。 如果你有机会获得它,你可以中通过ini_set()在你的PHP文件,或编辑的php.ini修改此
session_cache_expire()只控制HTTP的“Expires”。 这个头控制多长时间下载的页面内容留在用户的浏览器缓存。
要检查当前值,该代码会有所帮助:
$gc_maxlifetime = ini_get('session.gc_maxlifetime');
$gc_probability = ini_get('session.gc_probability');
$gc_divisor = ini_get('session.gc_divisor');