【发布时间】:2012-11-07 17:38:42
【问题描述】:
我有一个简单的缓存系统
if (file_exists($cache)) {
echo file_get_contents($cache);
// if coming here when $cache is deleting, then nothing to display
}
else {
// PHP process
}
我们会定期删除过期的缓存文件,例如1小时后删除所有缓存。虽然这个过程非常快,但我认为可以在if statement 和file_get_contents 进程之间删除缓存文件。
我的意思是当if statement检查缓存文件是否存在时,它存在;但是当file_get_contents 试图捕捉它时,它不再存在(被同步缓存删除过程删除)。
file_get_contents 锁定文件以避免在读取过程中进行删除过程。但是当if statement将PHP进程发送到第一个条件(file_get_contents开始之前)时,文件可以被删除。
有什么方法可以避免这种情况吗?缓存删除系统不一样吗?
注意:我没有遇到任何实际问题,因为捕获此事件的可能性不大,但从逻辑上讲这是可能的,并且应该在重负载时发生。
【问题讨论】:
-
看看php.net/manual/en/function.flock.php - 如果您的检查过程和删除过程都需要排他锁,那么它们不能同时运行。
-
@andrewsi
file_get_contents锁定文件以供读取,但if statement不会。文件锁保证读取时文件不会被删除,但是有没有保证在'if statement返回true之后文件不会被删除? -
经典比赛条件。谷歌互斥和信号量。要么按照 andrewsi 的建议锁定,要么悲观地重新生成缓存文件,而不是真正需要。
-
@All - 在你的 if 语句之前获得一个独占锁,然后释放它。如果您的删除过程也在寻找独占锁,则它必须等到现有的锁被释放后才能运行。
flock是一个非常有用的函数。 -
@andrewsi 这可能是一个实用的解决方案。它在缓存系统中很常见吗?我很好奇为什么没有关注这个可能的问题,而我错过了什么?
标签: php caching if-statement file-get-contents