
# Caching

storh wird mit kleinen Cache-Backends und ohne Laufzeitabhängigkeiten ausgeliefert:

```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
);
```

Cache-Ebenen:

- Decodierte DocStore-Datensätze
- Negative Suchergebnisse für fehlende Datensätze
- Manifeste segmentierter Logs
- Sparse-Indizes für Segmente

Validierungsmodi:

- `CacheValidation::STAT`: Existenz, Änderungszeit und Größe validieren.
- `CacheValidation::HASH`: Existenz, Änderungszeit, Größe und Inhalts-Hash validieren.
- `CacheValidation::TRUST`: Bei Treffern die Dateisystemvalidierung überspringen und darauf vertrauen, dass die aktuelle storh-Instanz oder ein gemeinsam genutztes Cache-Backend explizite storh-Schreibvorgänge veröffentlicht.

`STAT` ist der schnelle Standardmodus für die Validierung. Verwende `HASH`, wenn bei jedem Cache-Treffer auch der Dateiinhalt geprüft werden muss, einschließlich gleich großer Schreibvorgänge bei unveränderter Änderungszeit. `STAT` erkennt keine externe Inhaltsänderung, bei der sowohl Änderungszeit als auch Größe gleich bleiben. `TRUST` ist der schnellste Modus für Einzelprozesse oder gemeinsam genutzte Cache-Workloads. Er erkennt absichtlich keine Änderungen an Dateien außerhalb von storh.

`Cache::memory()` ist durch die Anzahl der Einträge und die Bytezahl begrenzt. Wenn `maxBytes` nicht angegeben ist, wird ein Budget aus PHP's `memory_limit` abgeleitet.

`Cache::apcu()` ist optional. Wenn APCu für die aktuelle SAPI nicht verfügbar oder deaktiviert ist, verhält es sich wie ein Backend ohne Funktion.

## Wann du ein Backend anbinden solltest

`DocStore` hält immer kleine Instanz-Caches für bereits gelesene oder geschriebene Datensätze vor, die entsprechend dem konfigurierten Modus validiert werden. Wenn du ein Backend anbindest, kommt ein Cache hinzu, der die Instanz überdauert: `Cache::memory()` ist hilfreich für lange laufende Prozesse, die Stores erneut öffnen, und `Cache::apcu()` teilt decodierte Datensätze über PHP-FPM-Anfragen hinweg. Die [Benchmarks](https://storh.inline0.dev/de/docs/benchmarks) messen für den Memory-Cache etwa 83 µs pro kaltem Lesevorgang gegenüber 6 µs für einen warmen, STAT-validierten Treffer.
