上次我查看了源代码,每次调用session_start()“掷骰子”,可以这么说,使用除数和概率。如果命中,则会从目录中删除早于 的所有文件。我忘记了它是否使用了文件的修改或访问时间,尽管这在正常的curcumstance中并不重要,因为php在脚本执行结束时默认会覆盖会话文件,因此mod和访问时间几乎总是应该非常接近。session.save_path
session.gc_maxlifetime
// Rough psuedo code of how php's session_start() function works regarding garbage collection.
function session_start() {
$percentChanceToGC = 100 * ini_get('session.gc_probability') / ini_get('session.session.gc_divisor');
$shouldDoGarbageCollection = rand(1, 100) < $percentChanceToGC;
if ($shouldDoGarbageCollection) {
$expiredCutoffTime = time() - ini_get('session.gc_maxlifetime');
foreach (scandir(ini_get('session.save_path')) as $sessionFile) {
if (filemtime($sessionFile) < $expiredCutoffTime) {
unlink($sessionFile);
}
}
}
// ... rest of code ....
}
我不知道如果你想让他们至少存活6个月,你最终会有多少会话文件。考虑到php可能需要一段时间才能统计数千个文件以确定它们的年龄。也许可以考虑使用此数据进行持久存储的其他选项。或者,您可以禁用php gc,然后运行cron作业来删除过时的会话文件。否则,1%的请求将触发gc并必须等待php;换句话说,它可能会滞后。