我有一个简单的PHP脚本,可以计算给定字符串输入的一些内容。它将结果缓存到数据库,我们偶尔会删除超过特定天数的条目。
我们的程序员将此数据库实现为:
function cachedCalculateThing($input) {
$cacheFile = 'cache/' . sha1($input) . '.dat';
if (file_exists($cacheFile) {
return json_decode(file_get_contents($cacheFile));
}
$retval = ...
file_put_contents(json_encode($retval));
}
function cleanCache() {
$stale = time() - 7*24*3600;
foreach (new DirectoryIterator('cache/') as $fileInfo) {
if ($fileInfo->isFile() && $fileInfo->getCTime() < $stale) {
unlink($fileInfo->getRealPath());
}
}
我们使用Ubuntu LAMP和ext3。缓存查找变为非常数或违反硬限制的条目数是多少?
答案 0 :(得分:1)
虽然这个特定的代码根本不具备可扩展性,但是有很多东西可以改进它:
iostat -x 4
并查找当前的磁盘利用率。如果它已经高于25%,那么启用磁盘缓存将使其随机时间达到100%并减慢所有Web服务的速度。 (因为对磁盘的请求必须按顺序排队和服务(通常)(不总是,但不要在其上存放)。)&#39; *对于可伸缩性,它通常根据线性请求速度或并行服务器资源来定义。那段代码:
find ./cache -type f -mtime +7 -exec rm -f "{}" \;
主要的要点是,为了在缓存系统之外实现真正的可扩展性和良好性能,必须比短代码块显示更多的考虑因素。可能存在比我所枚举的限制更多的限制,但即使是那些也受诸如大小,条目数,请求数/秒,当前磁盘负载,文件系统类型等变量的影响 - 在代码外部。这是可以预料到的,因为缓存在代码之外仍然存在。列出的代码可以执行一系列小型精品缓存,请求数量较少,但可能不适用于需要缓存的较大尺寸。
另外,您是在线程还是prefork模式下运行Apache?它将影响php如何阻止其读写。
- 嗯,我可能应该补充一点,你想要跟踪你的对象和key / hash ..如果$ input已经是一个字符串,那么它的基本形式/已经被计算出来,如果$ input是键,则file_put_contents()需要输入其他内容(实际变量/内容)。如果$ input是要查找的对象(可能就像一个长字符串,甚至是一个短字符串),那么它需要一个查找键,否则不会绕过/保存任何计算。