
# Кеширане

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`: проверява съществуването, mtime и размера.
- `CacheValidation::HASH`: проверява съществуването, mtime, размера и хеша на съдържанието.
- `CacheValidation::TRUST`: пропуска проверката на файловата система при кеш попадения и се доверява на текущата инстанция storh или на споделен кеш бекенд, който публикува изричните записи storh

`STAT` е бързият режим за валидиране по подразбиране. Използвайте `HASH`, когато всяко кеш попадение трябва да проверява и файловото съдържание, включително при записи със същия размер, които запазват mtime.
`STAT` не може да засече промяна извън системата, която запазва едновременно mtime и размера. `TRUST` е най-бързият режим за еднопроцесни или споделени кеш натоварвания; умишлено не засича файлове, променени извън storh.

`Cache::memory()` е ограничен по брой записи и по байтове. Когато `maxBytes` не е зададен, той извежда бюджет от PHP`memory_limit`.

`Cache::apcu()` не е задължителен. Ако APCu не е наличен или е изключен за текущия SAPI, той работи като бекенд без действие.

## Кога да добавите такъв

`DocStore` винаги поддържа малки кешове за всеки екземпляр на вече прочетените или записани от него записи, валидирани според зададения режим. Добавянето на бекенд осигурява кеш, който остава наличен и след унищожаването на екземпляра: `Cache::memory()` е полезен за дълго работещи процеси, които отварят отново хранилища, а `Cache::apcu()` споделя декодирани записи между заявки към PHP-FPM. [Бенчмарковете](https://storh.inline0.dev/bg/docs/benchmarks) показват около 83 µs за студено четене с кеш в паметта срещу 6 µs за топло попадение, валидирано със STAT.
