
# Memorizzazione nella cache

storh include backend di cache leggeri e non richiede dipendenze a runtime:

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

Livelli di cache:

- record DocStore decodificati
- ricerche negative di record mancanti
- manifest di SegmentedLog
- indici sparsi dei segmenti

Modalità di validazione:

- `CacheValidation::STAT`: verifica esistenza, mtime e dimensione.
- `CacheValidation::HASH`: verifica esistenza, mtime, dimensione e hash del contenuto.
- `CacheValidation::TRUST`: salta la validazione del file system sugli accessi alla cache e si affida
  all'istanza storh corrente o a un backend di cache condiviso per pubblicare esplicitamente le scritture storh.

`STAT` è la modalità di validazione rapida predefinita. Usate `HASH` quando ogni accesso alla cache deve
verificare anche il contenuto dei file, comprese le scritture della stessa dimensione che mantengono l'mtime.
`STAT` non rileva una modifica esterna del contenuto che mantenga invariati mtime e
dimensione. `TRUST` è la modalità più veloce per processi singoli o carichi con cache condivisa;
intenzionalmente non rileva i file modificati al di fuori di storh.

`Cache::memory()` ha limiti sia per numero di voci sia per byte. Se `maxBytes` non viene
fornito, ricava il budget da `memory_limit` di PHP.

`Cache::apcu()` è opzionale. Se APCu non è disponibile o è disabilitato per il SAPI corrente,
si comporta come un backend inattivo.

## Quando collegarne uno

`DocStore` mantiene sempre piccole cache per istanza dei record già letti
o scritti, validati secondo la modalità configurata. Collegare un backend aggiunge
una cache che sopravvive all'istanza: `Cache::memory()` è utile per i processi di lunga durata
che riaprono gli archivi, mentre `Cache::apcu()` condivide i record decodificati tra le richieste di PHP-FPM. I [benchmark](https://storh.inline0.dev/it/docs/benchmarks) misurano circa 83 µs per una lettura a freddo con il backend in memoria e 6 µs per un accesso a caldo con validazione STAT.
