2

我创建了一个拥有超过 20,000 个页面的动态站点,一旦创建了一个页面,至少一个月甚至一年都不需要更新它。所以我在第一次创建页面时缓存每个页面,然后从静态html页面传递它

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

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

我看到了一些这样的 Q/A 它说我可以存储在目录中的文件数量应该没有问题ext2 or ext3(我猜我的服务器有 ext3)文件系统,但是创建新文件的速度会在之后迅速下降有超过 20-30,000 个文件。

目前我在一个共享主机上,我必须缓存文件。我在整个盒子中托管了 100,000 个文件的软限制,到目前为止这已经足够了。

有人可以给我任何关于如何缓存网站的更好的想法。

4

2 回答 2

4

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

将它们划分为目录(例如按字母),以便您访问:

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

等等

这将允许您以更少的文件系统限制放置更多文件,从而提高速度。(由于 FS 不需要找出您的文件在目录中的位置以及其他 20k 文件,它需要查找大约一百个)

于 2012-09-14T18:23:15.850 回答
0

我可以使用 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; 
}

然而,解决问题的真正方法是使用正确的标头提供内容,并在网络服务器前面运行缓存反向代理(尽管这对于容量非常小的站点实际上并不实用)。

于 2012-09-14T19:20:14.117 回答