2

20,000ページを超える動的サイトを作成しました。ページが作成されると、少なくとも1か月または1年は更新する必要がありません。したがって、最初に作成されたときにすべてのページをキャッシュしてから、静的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ファイルを1つのディレクトリに配置しないでください。

それらをディレクトリに分割して(たとえば、文字で)、次の場所にアクセスします。

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

これにより、ファイルシステムへの制約を少なくしてより多くのファイルを配置できるようになり、速度が向上します。(FSは、他の20kファイルと一緒にファイルがディレクトリ内のどこにあるかを把握する必要がないため、約100を調べる必要があります)

于 2012-09-14T18:23:15.850 に答える
0

ext2またはext3のディレクトリに保存できるファイルの数に問題はないはずです。

これはかなり古いドキュメントです。ext2とext3には2つの大きな違いがあります。ジャーナル化は1つで、もう1つはディレクトリのH-TREEインデックス作成です(同じディレクトリに大量のファイルを保存することによる影響を軽減します)。ジャーナルリングをext2ファイルシステムに追加してext3としてマウントするのは簡単ですが、これはdir_indexの利点を提供しません-これには完全なfsckが必要です。

ファイルシステムに関係なく、ネストされたディレクトリ構造を使用すると、システムの管理と拡張性が大幅に向上し、古いファイルシステムでのパフォーマンスの問題が回避されます。

(これを書き始めてから、他に3つのことを行っていますが、他の誰かが同様のことを提案しているのを確認しました。ただし、マダラのアプローチではバランスの取れたツリーが得られないため、セマンティックパスを持つ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サーバーの前でキャッシングリバースプロキシを実行することです(ただし、これは非常に少ないボリュームのサイトでは実際には実用的ではありません)。

于 2012-09-14T19:20:14.117 に答える