
# Кэширование

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` не задан, бюджет рассчитывается на основе `memory_limit` PHP.

`Cache::apcu()` необязателен. Если APCu недоступен или отключён для текущего SAPI, он работает как пустая серверная часть.

## Когда подключать кэш

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