
# キャッシュ

storhには、小規模なキャッシュバックエンドが同梱されており、実行時依存関係はありません。

```php
use Storh\Cache;
use Storh\CacheValidation;

$docs = new Storh\DocStore($root, 'pages', cache: Cache::memory(maxEntries: 10000));
$docs = new Storh\DocStore($root, 'pages', cache: Cache::apcu('storh.pages'));
$docs = new Storh\DocStore(
    $root,
    'pages',
    cache: Cache::memory(maxEntries: 100000, maxBytes: 96 * 1024 * 1024),
    cache_validation: CacheValidation::TRUST
);
```

キャッシュ層：

- デコード済みDocStoreレコード
- レコード不在時のネガティブルックアップ
- セグメント化ログのマニフェスト
- セグメントのスパースインデックス

検証モード：

- `CacheValidation::STAT`：存在、更新時刻、サイズを検証します。
- `CacheValidation::HASH`：存在、更新時刻、サイズ、コンテンツハッシュを検証します。
- `CacheValidation::TRUST`：キャッシュヒット時のファイルシステム検証を省略し、現在のstorhインスタンスまたは共有キャッシュバックエンドがstorhの書き込みを明示的に公開すると信頼します。

`STAT`はデフォルトの高速検証モードです。更新時刻を維持した同サイズの書き込みも含め、キャッシュヒットごとにファイルの内容を検証する必要がある場合は`HASH`を使ってください。`STAT`では、更新時刻とサイズの両方を維持した外部の内容変更を検出できません。`TRUST`は単一プロセスまたは共有キャッシュのワークロードで最も高速なモードです。storhの外部で変更されたファイルは意図的に検出しません。

`Cache::memory()`にはエントリー数とバイト数の上限があります。`maxBytes`が指定されていない場合、PHPの`memory_limit`から予算を算出します。

`Cache::apcu()`は任意です。現在のSAPIでAPCuが利用できない、または無効になっている場合、何もしないバックエンドとして動作します。

## バックエンドを追加する場合

`DocStore`は、読み取りまたは書き込み済みのレコードを、設定されたモードで検証しながら、常にインスタンスごとの小規模なキャッシュに保持します。バックエンドを追加すると、インスタンスより長く存続するキャッシュを利用できます。`Cache::memory()`はストアを再オープンする長時間稼働プロセスに役立ち、`Cache::apcu()`はPHP-FPMのリクエスト間でデコード済みレコードを共有します。[ベンチマーク](https://storh.inline0.dev/ja/docs/benchmarks)では、メモリバックエンドのコールド読み取りが約83 µs、STAT検証済みのウォームヒットが約6 µsと測定されています。
