我的脚本通过慢速连接获取大量JPEG文件。我将下载的文件存储在本地缓存中,并重复使用它们,直到它们被更改。
问题是:我如何确保这个缓存永远不会大于16Mb(说)?
我可以随时清理:
- 计算缓存中所有文件的总大小
- 删除一些文件,直到它低于16Mb减去我需要的。
但是如果脚本的两个实例都这样做呢?两者都确保1Mb是空闲的,然后各自使用1Mb,现在缓存是17Mb。
我知道我可以使成为"延迟缓存":只是不时地清理它。但是恶意用户可以触发大量缓存并耗尽磁盘空间。这是一个共享主机,所以没有办法。
我想到的唯一解决方案(坏):
在存储任何东西之前,锁定整个缓存,清理所需的空间,存储文件,解锁缓存。不好的原因:我缓存了很多文件,所以需要很多锁和清理工作。缓慢。
也许我误解你了——这看起来太简单了。如果你没有数据库可用-读取数据库=一些文件与一些数据格式。
在数据库中创建一个表,列为:filename, filesize,如果文件仍在下载(true/false),则标记。
当你收到一个新的文件下载请求时,锁住这个表。计算总和(文件大小)。- 如果小于16MB减去新文件大小,则向表中添加新条目。文件下载后更改标志(当然要在文件下载前/后设置lock/unlock)
- 如果是更多:看看如果你有一些下载的文件,你可以删除和删除他们,而你没有足够的空闲空间,然后添加条目表。
- 如果你不能释放足够的内存-拒绝这个请求/等待一些文件下载
在每个case之后立即解锁表-每次应该只锁定几毫秒,所以不需要等待任何人。
我不会像你那样严格遵守规则,但你可以使用以下规则:
file_put_contents -
LOCK_EX -在执行命令时获取文件的排他锁写作。
在某个地方创建一个。txt文件,让脚本尝试获取内容。如果有一个脚本已经在运行,那么它将对该文件具有锁,因此新脚本将无法访问该文件。如果不能访问该文件,就不要执行用于缓存的代码。
你可以用一个漏水的桶。您需要存储lasttime(unix时间戳)和bucket(整数)。每次存储内容时,您都会计算自上次保存到缓存以来的时间间隔,从bucket中以秒为单位递减,然后将bucket添加x个字节。如果bucket大于您的容量减去jpeg文件大小,则删除最旧的对象以释放所需的空间。