我有一个提供 HTML 代码的服务,但在某些时候它不再更新。代码始终从包含 1000 万个条目的数据库中动态生成,因此每个 HTML 代码页面渲染都会在那里搜索其中的 60 或 70 个条目,然后渲染页面。
因此,对于那些过期的页面,我想使用一个非常简单的缓存系统(例如只需输入一个带有呈现的 HTML 的记录并(如果需要)将其删除)。
我尝试基于文件来完成此操作,但搜索文件的存在然后将它通过 php 传递以实际呈现它,这似乎对于我想要做的事情来说太多了。
我考虑在 mysql 上使用一个包含 MEDIUMBLOB 的表(每页大约 100k)来执行此操作。它将保存大约 150000 条这样的记录(至少目前如此)。
我的问题是:让 mysql 查找文件并传递给 php 会更快吗,或者基于文件的方法更快?
基于文件版本的查找代码如下所示:
$page = @file_get_contents(getCacheFilename($pageId));
if($page!=NULL) {
echo $page;
} else {
renderAndCachePage($pageId);
}
它会进行一次查找,无论是否找到该文件。
mysql 表只有一个 ID(页面 ID)和 blob 条目。
系统的磁盘是一个简单的 SATA raid 1,mysql 守护进程可以获取最多 2.5GB 的内存(我也有一个代理在运行,占用了机器剩余的 16GB 内存。)
总体来说,磁盘已经相当繁忙了。
我不使用 PEAR 缓存,是因为我认为(请随时纠正我)它增加了我不需要的开销,因为页面渲染代码每天被调用大约 2M 次,并且我不想每次都浏览整个代码(是的,我也有 eaccelerator 来缓存代码)。
任何关于我应该走什么方向的指示,都将受到热烈欢迎。
谢谢!
答案1
在您的特定情况下,我建议您使用 memcached,但前提是您有一些多余的 RAM。
答案2
在某些时候它不再更新
这才是关键——你如何确定某个文件何时被视为冻结?如果你不知道,那么一个简单的方法就是根据上次修改的时间设置缓存时间,例如
$minquiet=86400; // 1 day
$scale=1;
$ago=filemtime($file);
$cache=(time()-$ago - $minquiet)/$scale;
if ($cache<0) $cache=0;
header("Cache-control: max-age=$cache; must-revalidate");
mysql 数据库或文件系统哪个更快是一个更为复杂的问题。
哪个文件系统?
这些文件是位于目录层次结构中还是都位于同一个目录中?如果是后者,它们可以都位于一个目录中吗?
如果您完全绕过 PHP,您肯定会获得更好的性能 - 但这假设路径中存在可以解析以确定可缓存性的数据。
$page = @file_get_contents(getCacheFilename($pageId));
天哪——这会导致性能非常差。至少将其更改为 stat() + readfile()。
$page = @file_get_contents(getCacheFilename($pageId));
if($page!=NULL) {
这是否意味着您根据页面是否外泄来确定页面是否可缓存?如果是这样,则将其交换,以便 URL 指向文件所在的位置,并在 404 处理程序中实现 PHP 代码。