
# Кешування

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

`Cache::apcu()` необов’язковий. Якщо APCu недоступний або вимкнений для поточного
SAPI, він працює як порожній бекенд.

## Коли підключати кеш

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