我的脚本通过慢速连接获取大量JPEG文件。我将下载的文件存储在本地缓存中并重新使用它们直到它们被更改。
问题是:如何确保此缓存永远不会超过16Mb(比方说)?
我可以随时清理它:
但是,如果脚本的两个实例执行此操作会怎么样?两者都确保1Mb是空闲的,然后每个都使用1Mb,缓存现在是17Mb。 16Mb规则被打破。
我知道我可以使“懒惰缓存”:只是不时清理它。但恶意用户可能会触发大量缓存并耗尽磁盘空间。这是一个共享主机,所以没有办法。
我提出的唯一解决方案(糟糕):
在存储任何内容之前,请锁定整个缓存,清理所需空间,存储文件,解锁缓存。为什么不好:我正在缓存很多文件,因此需要大量锁定和大量清理工作。慢。 (另外你如何锁定/等待PHP中的锁?)
答案 0 :(得分:1)
Maby我误解了你 - 这看起来太容易了。如果您没有数据库可用 - 读取数据库=某些数据格式的文件。
在数据库中创建一个包含列的表:filename,filesize,flag如果文件仍在下载(true / false)。
当您收到下载文件的新请求时 - 锁定此表。计算SUM(文件大小)。
每个案例后立即解锁表 - 每次只能锁定几毫秒,所以不用等待任何人。
答案 1 :(得分:0)
我不会遵守规则,但您可以使用以下内容:
LOCK_EX - 在继续执行时获取文件的独占锁定 写入。
在某处创建.txt文件,让脚本尝试获取内容。如果脚本已经运行,它将锁定文件,因此新脚本将无法访问该文件。如果您无法访问该文件,请不要执行缓存代码。
答案 2 :(得分:0)
您可以使用漏桶。您需要存储lasttime(unix时间戳)和bucket(整数)。每次存储某些内容时,您都会计算自上次保存到缓存以来的时间间隔,从存储桶中以秒为单位递减,然后按字节数x计算。如果存储桶超过您的容量减去jpeg文件大小,则删除最旧的对象以释放所需空间。