Команда cache
cache показывает кеши, объявленные в CacheConfigurer, и
очищает те из них, что живут вне памяти сервера: file и
redis. Нужна, чтобы проверить, что лежит в кеше, и сбросить его при
деплое или после ручной правки данных.
Зачем
Кеш, которого не видно, трудно отлаживать: непонятно, лежит ли значение, когда оно истечёт и почему метод отдаёт старое. А после деплоя или ручной правки в базе кеш бывает нужно сбросить, не перезапуская сервер.
call cache отвечает на оба вопроса — для тех кешей, до которых может дотянуться
отдельный процесс. Подробно о самих кешах — на странице
Кеширование методов.
Действия
| Действие | Что делает |
|---|---|
show |
Все объявленные кеши: хранилище, настройки, число записей |
show <имя> |
Записи кеша file или redis: ключ, размер, сколько осталось жить |
show <имя> --all |
Все записи, а не первые 100 |
clear <имя> |
Очистить один кеш file или redis |
clear --all |
Очистить все кеши file и redis |
php call cache show
php call cache show api-token
php call cache clear products
php call cache clear --allЧто видно из консоли
Команда — отдельный процесс. Поэтому она видит только то, что лежит вне памяти сервера:
| Хранилище | show |
clear |
|---|---|---|
table |
настройки и резерв памяти, без записей | нет — очищается перезапуском |
memory |
настройки, без записей | нет — очищается перезапуском |
file |
настройки и записи | да |
redis |
настройки и записи | да |
Записи table и memory живут в памяти работающего сервера: у консольного процесса
своя, пустая копия. Команда честно говорит об этом, а не показывает пустой список.
show
| [ Caches (4) ]
| products ............................. [table · 10000 rows · 1 KB · ≈26.8 MB · ttl 300 s]
| stock ................................ [memory · 100 items per worker · ttl 30 s]
| api-token ............................ [file · ttl 3300 s · 1 entry]
| shared ............................... [redis · ttl 120 s · version v1 · 2 entries]
| [ Caches (4) ]Если Redis недоступен, у его кеша вместо числа записей будет UNAVAILABLE, а
команда завершится с кодом 1.
show <имя>
| shared ............................... [redis · ttl 120 s · version v1]
| [i] cache:shared:v1:* on Main\Config\MainRedisConfig
| [ Entries (2) ]
| user:1 ............................... [74 B · 119 s left]
| user:2 ............................... [74 B · 119 s left]
| [ Entries (2) ]Ключи показаны такими, какими их строит атрибут. Ключ, собранный из нескольких
аргументов, выводится через запятую, а null — словом null. Строка с [i]
говорит, где лежат записи: каталог для file, префикс и класс подключения для
redis.
По умолчанию выводятся первые 100 записей и их общее число; --all выводит все.
clear
| products ............................. [SKIPPED (table, server memory)]
| stock ................................ [SKIPPED (memory, server memory)]
| api-token ............................ [CLEARED (1 entries)]
| shared ............................... [CLEARED (2 entries)]clear --all очищает все кеши file и redis, а table и memory пропускает.
Очистка redis удаляет только ключи с префиксом этого кеша — остальная база не
трогается.
`clear` для `table` и `memory` — ошибка
call cache clear products для кеша table не выполняется: команда объясняет, что
он живёт в памяти сервера и очищается перезапуском, и завершается с кодом 1. Так
скрипт, который рассчитывал на очистку, узнает, что её не было.
В скрипте деплоя
Кеши file и redis переживают деплой — вместе с записями, сохранёнными старым
кодом. Если классы значений менялись, очистите их перед запуском:
php call di build || exit 1
php call cache clear --all || exit 1
exec php call runКоманда завершается с кодом 1, если что-то не получилось: неизвестное имя кеша,
недоступный Redis, попытка очистить table или memory. Без #[EnableCaching] у
приложения она тоже завершается с 1 и говорит, что кеширование не включено.
Альтернатива очистке — поменять version у кеша: старые записи просто перестанут
находиться. Подробнее — в разделе
Деплой и старые данные.
Дальше
- Кеширование методов — атрибуты, хранилища и их настройки
- Команда di — сборка прокси и проверка имён кешей
- Команда storage — служебные каталоги, где лежат кеши
file - Консоль — обзор — все команды