缓存一个完全动态的网站


Caching a fully dynamic website

我制作了一个动态网站,它有20000多个页面,一旦创建了一个页面,就不需要更新至少一个月甚至一年。因此,我在第一次创建时缓存每个页面,然后从静态html页面传递它

我正在运行一个php脚本(整个CMS都在php上)if (file_exists($filename)),首先从缓存文件目录中的url中搜索文件名,如果匹配,则将其交付,否则将生成页面并缓存以备后用。虽然它是动态的,但我的url仍然不包含?&=,我通过-将其分解为数组来实现这一点。

我想知道的是,从那个巨大的目录中搜索文件会产生任何问题吗?

我看到了一些类似的问答,其中说我可以用ext2 or ext3(我想我的服务器有ext3)文件系统存储在目录上的文件数量应该没有问题,但当文件超过20-30000时,创建新文件的速度会迅速下降。

当前我在共享主机上,必须缓存文件。我的主机在我的整个盒子里有100000个文件的软限制,到目前为止已经足够了。

有人能给我一些关于如何缓存网站的更好的想法吗。

您不应该将所有的20K文件放在一个目录中。

将它们分为目录(例如,按字母),这样您就可以访问:

a/apple-pie-recipe
j/john-doe-for-presidency

等等。

这将允许您在文件系统上放置更多约束较少的文件,从而提高速度。(因为FS不需要知道你的文件和其他20k个文件在目录中的位置,所以它需要查找大约一百个)

我可以用ext2或ext3 存储在目录上的文件数量应该没有问题

这是一个相当古老的文档-ext2和ext3之间有两个很大的区别-日志记录是其中之一,另一个是目录的H-TREE索引(这减少了在同一目录中存储大量文件的影响)。虽然将日志记录添加到ext2文件系统并将其装载为ext3很简单,但这并不能提供dir_index的好处——这需要完整的fsck。

不管文件系统是什么,使用嵌套目录结构都会使系统更易于管理和扩展,并避免旧文件系统上的性能问题。

(自从我开始写这篇文章以来,我正在做另外3件事,看到其他人也提出了类似的建议——然而Madara的方法并没有给出一个均衡的树,具有语义路径的OTOH可能更可取)

例如

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; 
}

然而,解决这个问题的真正方法是用正确的标头提供内容,并在Web服务器前运行缓存反向代理(尽管这对于一个非常lwo卷的网站来说并不实用)。