Cha*_*had 35 php security cookies session-timeout
session.gc_maxlifetime和之间的实际区别是session_cache_expire()什么?
假设我希望用户会话在非活动15分钟后无效(在首次打开后不是15).哪一个会帮助我?
我也知道我可以做的session_set_cookie_params(),可以设置用户的cookie在一段时间内到期.但是,cookie到期以及服务器端的实际会话到期时间并不相同; 这也会在cookie过期时删除会话吗?
我所拥有的另一个解决方案是$_SESSION['last_time'] = time()
每个请求都很简单
,并将会话与当前时间进行比较,基于此删除会话.我希望有一个更"内置"的机制来处理这个问题.
谢谢.
小智 56
我花了一些时间寻找一个很好的答案,了解php.ini服务器设置如何使会话过期.我发现了很多信息,但是花了一些时间来弄清楚为什么这些设置按照他们的方式工作.如果您像我一样,这可能对您有所帮助:
会话作为cookie(客户端的PC上的文件)或服务器端存储为服务器上的文件.两种方法都有优点和缺点.
对于存储在服务器上的会话,使用三个变量.
session.gc_probability session.gc_divisor session.gc_maxlifetime
(session.gc_probability/session.gc_divisor)生成垃圾收集例程运行的概率.当垃圾收集器运行时,它会检查至少session.gc_maxlifetime尚未访问的会话文件并删除它们.
这个在论坛帖子中都很好地解释了(特别是这个!) - 但是出现了以下问题:
1.)该概率如何应用?服务器什么时候掷骰子?
答:每次在服务器上的任何活动会话期间调用session_start()时,服务器都会掷骰子.所以这意味着如果你有默认的session.gc_probability = 1和session.gc_divisor = 100,你应该看到垃圾收集器大约每100次调用一次session_start().
2.)低容量服务器会发生什么?
答:当调用session_start()时,它会刷新会话并使会话值可用.这会更新服务器上会话文件的时间.它然后滚动骰子,如果它赢了(百分之一的机会),它会调用垃圾收集器.垃圾收集器然后检查所有会话ID文件,并查看是否有任何符合删除条件的文件.
因此,这意味着如果您是服务器上的唯一人员,则您的会话将永远不会处于非活动状态,并且看起来好像更改设置无效.假设您将session.gc_maxlifetime更改为10并将session.gc_probability更改为100.这意味着垃圾收集器将有100%的可能性运行,它将清除在过去10秒内未访问过的任何会话文件.
如果您是服务器上唯一的一个,则不会删除您的会话.您需要至少运行1个其他活动会话才能使其处于非活动状态.
所以基本上,在低容量服务器上或在低容量时间 - 在垃圾收集器实际运行并且会话实际被删除之前,它可能比session.gc_maxlifetime长很多.如果不知道它是如何工作的,它可能看起来完全随机.
3.)他们为什么使用概率?
一场表演.在更高容量的服务器上,您不希望垃圾收集器在session_start()的每个请求上运行.它将不必要地减慢服务器的速度.因此,根据您的服务器容量,您可能希望增加或减少垃圾收集器运行的概率.
我希望这能为你们联系起来.如果你像我一样,你尝试了session.gc_maxlifetime并且它似乎没有用(因为你在开发服务器上尝试过以免打扰任何人),那么这篇帖子希望能让你有些头疼.
祝好运!
Gla*_*bot 40
每次调用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;
}
Run Code Online (Sandbox Code Playgroud)
session.gc_maxlifetime基于上次修改会话文件的时间.因此,每次修改会话文件或在单独的页面中调用session_start()时,gc_maxlifetime的倒计时将重新开始,用户将保持"登录"状态.这是您正在寻找的价值.您可以通过php文件中的ini_set()修改它,或者如果您有权访问它,可以编辑php.ini
session_cache_expire()仅控制HTTP"Expires"标头.此标头控制下载的页面内容保留在用户浏览器缓存中的时间.
| 归档时间: |
|
| 查看次数: |
26339 次 |
| 最近记录: |