我现在正在学习/usr/lib/php/sessionclean。有一件事我不完全明白。在清理之前触摸所有打开的会话文件的目的是什么?我知道这会阻止删除当前打开但尚未写入的过期会话。但这不是竞争条件吗?如果 PHP 进程在 touch 和 delete 命令之间打开一个过期的会话文件怎么办?
在find命令评估它们时,超过最大生命周期的会话文件将被删除。
最迟在 PHP 脚本执行完毕后更新文件。然而,也许在会话执行时杀死一个空闲的会话并不公平。因此,touch更新当前正在执行 php 进程的会话文件的修改时间。
是的,在 之后开始的 php 进程存在竞争条件touch,恢复一个太旧的会话,并因为它在find垃圾收集之前没有完成而被删除。会话已经存在整个生命周期,可能几分钟。在几分之一秒的时间里错过一个扩展并不是什么大不了的事。
另一种选择,PHP 的内置实现,有 1% 左右的机会在执行时运行垃圾收集。对于低容量站点,它可能无法可靠地触发。
另外,外部脚本允许锁定会话目录的安全性,这就是 Debian 维护者这样做的原因。
| 归档时间: |
|
| 查看次数: |
3394 次 |
| 最近记录: |