レンタルサーバではmemcachedなどを使用することが出来ないので、何らかのファイルキャッシュを使うことが多いと思うんですが、いくつかのサービスではPEAR::Cache_Liteを導入しています。

Cache_Lite

規模が大きくなるとI/Oがネックになるので、ファイルキャッシュはいずれ問題になってくるのですが、小規模なサービスであればこれで十分。

で、導入自体は極めて簡単なんですけど、気になったのはディレクトリ。UNIX系サーバでは1ディレクトリにおけるファイル数は10,000くらいなので、サービスを継続しているといずれキャッシュが作れなくなってしまう。でもCache_Liteの設定(インスタンス生成時にオプションを配列で渡す)ではディレクトリを渡すだけ。今は大丈夫だけど念のためディレクトリを構造化したいな...

と思ったら、ちゃんとその設定がありました。
マニュアルは細かく読まないとダメだね。

constructor Cache_Lite::Cache_Lite
PEARマニュアル:constructor Cache_Lite::Cache_Lite() - コンストラクタ - constructor Cache_Lite::Cache_Lite

hashedDirectoryLevel
Set the hashed directory structure level. 0 means "no hashed directory structure", 1 means "one level of directory", 2 means "two levels"... This option can speed up Cache_Lite only when you have many thousands of cache file. Only specific benchs can help you to choose the perfect value for you. Maybe, 1 or 2 is a good start.
ハッシュ化されたディレクトリ構造のレベルを設定します。 0 は "ハッシュ化されたディレクトリ構造を使用しない" という意味で、 1 は "1 レベルのディレクトリ"、 2 は "2 レベルのディレクトリ" を意味します。 このオプションは、何千ものキャッシュファイルがある場合にのみ Cache_Lite を高速化する事ができます。 明確なベンチマークのみ、完璧な値を選択する手助けになります。 1 あるいは 2が最初の値として良いでしょう。


設定例:

$cache = new Cache_Lite(array(
  'cacheDir' => '/cache',
  'lifeTime' => 60 * 60,
  'automaticSerialization' => true,
  'pearErrorMode' => CACHE_LITE_ERROR_DIE,
  'hashedDirectoryLevel' => 2
));

作成されるディレクトリ構造例:

  • cache_0
    • cache_00
    • cache_01
      • cache_c21f969b5f03d33d43e04f8f136e7682_926f196e812787272b45cd8710df151d
    • cache_02
    • cache_03
  • cache_1
  • cache_2
  • cache_3