
# Ukladanie do vyrovnávacej pamäte

storh obsahuje malé implementácie cache a nemá žiadnu závislosť za behu:

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

Vrstvy cache:

- dekódované záznamy DocStore
- negatívne vyhľadávania chýbajúcich záznamov
- manifesty segmentovaného logu
- riedke indexy segmentov

Režimy overovania:

- `CacheValidation::STAT`: overuje existenciu, čas poslednej zmeny a veľkosť.
- `CacheValidation::HASH`: overuje existenciu, čas poslednej zmeny, veľkosť a hash obsahu.
- `CacheValidation::TRUST`: pri zásahu preskočí overovanie súborového systému a dôveruje
  aktuálnej inštancii storh alebo zdieľanému backendu cache, ktorý zverejňuje explicitné zápisy storh.

`STAT` je predvolený rýchly režim overovania. Použite `HASH`, keď sa pri každom zásahu do cache musí overiť aj obsah súboru vrátane zápisov rovnakej veľkosti, ktoré zachovajú čas poslednej zmeny.
`STAT` nedokáže zistiť zmenu obsahu vykonanú mimo systému, ak sa nezmení čas poslednej zmeny ani veľkosť. `TRUST` je najrýchlejší režim pre procesy s jedným procesom alebo zdieľanou cache; zámerne nezisťuje zmeny súborov vykonané mimo storh.

`Cache::memory()` je obmedzená počtom položiek aj počtom bajtov. Ak sa nezadá `maxBytes`, rozpočet sa odvodí z PHP `memory_limit`.

`Cache::apcu()` je voliteľné. Ak APCu nie je dostupné alebo je pre aktuálne SAPI vypnuté, funguje ako prázdny backend.

## Kedy pripojiť backend

`DocStore` vždy uchováva malé cache pre každú inštanciu pre záznamy, ktoré už prečítala alebo zapísala, pričom ich overuje podľa nakonfigurovaného režimu. Pripojením backendu sa pridá cache, ktorá pretrvá aj po zániku inštancie: `Cache::memory()` pomáha dlho bežiacim procesom, ktoré opätovne otvárajú úložiská, a `Cache::apcu()` zdieľa dekódované záznamy medzi požiadavkami PHP-FPM. [testy výkonu](https://storh.inline0.dev/sk/docs/benchmarks) ukazujú pri backende v pamäti približne 83 µs na studené čítanie oproti 6 µs na teplý zásah overený pomocou STAT.
