PHP中磁盘缓存清理/大小限制的模式


Patterns for disk cache clearing/size limit in PHP?

我的脚本通过慢速连接获取大量JPEG文件。我将下载的文件存储在本地缓存中,并重复使用它们,直到它们被更改。

问题是:我如何确保这个缓存永远不会大于16Mb(说)?

我可以随时清理:

  1. 计算缓存中所有文件的总大小
  2. 删除一些文件,直到它低于16Mb减去我需要的。

但是如果脚本的两个实例都这样做呢?两者都确保1Mb是空闲的,然后各自使用1Mb,现在缓存是17Mb。

我知道我可以使成为"延迟缓存":只是不时地清理它。但是恶意用户可以触发大量缓存并耗尽磁盘空间。这是一个共享主机,所以没有办法。

我想到的唯一解决方案(坏):

在存储任何东西之前,锁定整个缓存,清理所需的空间,存储文件,解锁缓存。不好的原因:我缓存了很多文件,所以需要很多锁和清理工作。缓慢。

也许我误解你了——这看起来太简单了。如果你没有数据库可用-读取数据库=一些文件与一些数据格式。

在数据库中创建一个表,列为:filename, filesize,如果文件仍在下载(true/false),则标记。

当你收到一个新的文件下载请求时,锁住这个表。计算总和(文件大小)。
  1. 如果小于16MB减去新文件大小,则向表中添加新条目。文件下载后更改标志(当然要在文件下载前/后设置lock/unlock)
  2. 如果是更多:看看如果你有一些下载的文件,你可以删除和删除他们,而你没有足够的空闲空间,然后添加条目表。
  3. 如果你不能释放足够的内存-拒绝这个请求/等待一些文件下载

在每个case之后立即解锁表-每次应该只锁定几毫秒,所以不需要等待任何人。

我不会像你那样严格遵守规则,但你可以使用以下规则:

file_put_contents -

LOCK_EX -在执行命令时获取文件的排他锁写作。

在某个地方创建一个。txt文件,让脚本尝试获取内容。如果有一个脚本已经在运行,那么它将对该文件具有锁,因此新脚本将无法访问该文件。如果不能访问该文件,就不要执行用于缓存的代码。

你可以用一个漏水的桶。您需要存储lasttime(unix时间戳)和bucket(整数)。每次存储内容时,您都会计算自上次保存到缓存以来的时间间隔,从bucket中以秒为单位递减,然后将bucket添加x个字节。如果bucket大于您的容量减去jpeg文件大小,则删除最旧的对象以释放所需的空间。