PHP垃圾收集澄清

psp*_*ahn 38 php session garbage-collection

从PHP手册中,session.gc_probability和session.gc_divisor声明gc将基于此概率发生.我明白了.

我不清楚的是这个概率是基于会话还是整体.

因此,如果GC的概率是1%(1/100),那是否意味着如果一个会话不断扩展,每次有1%的更改,特定会话将被清除?或者这是否意味着所有现有会话(以及新会话)的1%将触发所有其他现有会话的GC?

我很确定这是后者,我只是想确定一下.

这个问题的目的是在我们的网站上,我希望用户有长期会议(6个月).如果所有会话中的1%触发GC,那么这有效地消除了具有该长期会话的目的,因为GC将每小时或每两小时结束.

rom*_*nsh 11

每次PHP脚本执行并启动会话时,它都有可能会扫描会话文件夹以消除旧会话.

清除只会删除在特定时间内未访问的会话.但是,PHP不保证会话将在该时间内被销毁.

您的长期会话策略应该可以正常工作,但您可能希望将1%减少到0.1%

需要注意的另一件事是操作系统可能会在重启期间清理/ tmp文件夹,即使PHP不会这样做.

  • 减少概率的副作用是你将用旧会话填满你的硬盘.并且会话将花费更长时间来查找和加载,并且在一天结束时,您仍然很少有机会擦除会话(即使它是远程小的).您可以查看其他选项,例如编写自己的会话处理程序以及确切地控制要删除的会话以及何时删除.这并不难.http://www.php.net/manual/en/function.session-set-save-handler.php (5认同)

goa*_*oat 7

上次我看到源每次调用session_start()"掷骰子"可以这么说,使用除数和概率.如果你点击,那么它将删除session.save_path目录中早于的所有文件session.gc_maxlifetime.我忘记了它是否使用了文件的修改或访问时间,虽然它在正常情况下无关紧要因为php在脚本执行结束时默认覆盖会话文件,因此mod和访问时间几乎总是非常接近.

// 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 ....
}
Run Code Online (Sandbox Code Playgroud)

我不知道如果你希望它们至少活6个月,你最终会有多少个会话文件.考虑到php可能需要一段时间来统计数千个文件来确定它们的年龄.也许考虑其他选项来持久存储这些数据.或者您可以禁用php gc并只运行一个cron作业来删除陈旧的会话文件.否则,1%的请求将触发gc并且必须等待php; 换句话说,它可能会滞后.