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

时间:2011-08-25 12:52:58

标签: php caching design-patterns

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

问题是:如何确保此缓存永远不会超过16Mb(比方说)?

我可以随时清理它:

  1. 计算缓存中所有文件的总大小。
  2. 删除一些文件,直到它低于16Mb减去我需要的数量。
  3. 但是,如果脚本的两个实例执行此操作会怎么样?两者都确保1Mb是空闲的,然后每个都使用1Mb,缓存现在是17Mb。 16Mb规则被打破。

    我知道我可以使“懒惰缓存”:只是不时清理它。但恶意用户可能会触发大量缓存并耗尽磁盘空间。这是一个共享主机,所以没有办法。

    我提出的唯一解决方案(糟糕):

    在存储任何内容之前,请锁定整个缓存,清理所需空间,存储文件,解锁缓存。为什么不好:我正在缓存很多文件,因此需要大量锁定和大量清理工作。慢。 (另外你如何锁定/等待PHP中的锁?)

3 个答案:

答案 0 :(得分:1)

Maby我误解了你 - 这看起来太容易了。如果您没有数据库可用 - 读取数据库=某些数据格式的文件。

在数据库中创建一个包含列的表:filename,filesize,flag如果文件仍在下载(true / false)。

当您收到下载文件的新请求时 - 锁定此表。计算SUM(文件大小)。

  1. 如果它小于16MB减去新文件大小,则向表中添加新条目。下载文件后更改标志(具有锁定/解锁前后的cource)。
  2. 如果还有更多:看看你是否有一些下载的文件,你可以在没有足够的可用空间时删除和删除它们,然后在表格中添加条目。
  3. 如果您无法释放足够的内存 - 请拒绝此请求/等待下载某些文件。
  4. 每个案例后立即解锁表 - 每次只能锁定几毫秒,所以不用等待任何人。

答案 1 :(得分:0)

我不会遵守规则,但您可以使用以下内容:

file_put_contents -

  

LOCK_EX - 在继续执行时获取文件的独占锁定   写入。

在某处创建.txt文件,让脚本尝试获取内容。如果脚本已经运行,它将锁定文件,因此新脚本将无法访问该文件。如果您无法访问该文件,请不要执行缓存代码。

答案 2 :(得分:0)

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