我创建了一个拥有超过20,000页的动态网站,一旦创建了一个页面,就不需要至少一个月甚至一年更新它。所以我在第一次创建页面时缓存每个页面,然后从静态html
页面提交它
我正在运行一个PHP脚本(整个CMS在PHP上)if (file_exists($filename))
首先从缓存文件目录中的网址搜索文件名,如果匹配则传递给它否则生成页面并将其缓存以供后者使用。虽然它是动态的,但我的网址仍然不包含?&=
,我是通过-
执行此操作并将其分解为数组。
我想知道的是,从这个巨大的目录中搜索文件会产生任何问题吗?
我看到了一些类似this的Q / A,其中说我可以在ext2 or ext3
目录(我猜我的服务器有ext3)文件系统上存储的文件数量不应该存在问题但是,当文件超过20-30,000时,创建新文件的速度会迅速下降。
目前我在共享主机上,我必须缓存文件。我的主机在我的整个盒子中软限制为100,000个文件,到目前为止还不错。
有人可以让我更好地了解如何缓存网站。
答案 0 :(得分:4)
您不应将所有20K文件放在一个目录中。
将它们分成目录(例如,通过字母),以便访问:
a/apple-pie-recipe
j/john-doe-for-presidency
等
这将允许您在文件系统上放置更多具有较少约束的文件,这将提高速度。 (因为FS不需要弄清楚你的文件在目录中的位置以及其他20k文件,它需要查看大约一百个)
答案 1 :(得分:0)
我可以使用ext2或ext3
存储在目录中的文件数量不存在问题
这是一个旧文档 - ext2和ext3之间有两个很大的区别 - 日志是一个,另一个是目录的H-TREE索引(这减少了在同一目录中存储大量文件的影响)。虽然将日志记录添加到ext2文件系统并将其挂载为ext3是微不足道的,但这并不能提供dir_index的好处 - 这需要一个完整的fsck。
无论文件系统如何,使用嵌套目录结构都可以使系统更易于管理和扩展,并避免旧文件系统出现性能问题。
(自从我开始写这篇文章以来,我正在做其他3件事,看到其他人提出了类似的建议 - 但是Madara的方法并没有给出一个均匀平衡的树,OTOH有一个语义路径可能更合适)
e.g。
define('GEN_BASE_PATH','/var/data/cache-failes');
define('GEN_LEVELS', 2);
function gen_file_path($id)
{
$key=md5($id);
$fname='';
for ($x=0; $x<=GEN_LEVELS; $x++) {
$fname=substr($key, 0, 1) . "/";
$key=substr($key,1);
}
return GEN_BASE_PATH . "/" . $fname . $key;
}
然而,解决问题的真正方法是使用正确的标头提供内容并在网络服务器前运行缓存反向代理(尽管这对于非常大的网站来说并不实用)。