CLI · Winter Console

Команда cache

cache показывает кеши, объявленные в CacheConfigurer, и очищает те из них, что живут вне памяти сервера: file и redis. Нужна, чтобы проверить, что лежит в кеше, и сбросить его при деплое или после ручной правки данных.

Действия show · clearВидит записи file · redisСбой код выхода 1

Зачем

Кеш, которого не видно, трудно отлаживать: непонятно, лежит ли значение, когда оно истечёт и почему метод отдаёт старое. А после деплоя или ручной правки в базе кеш бывает нужно сбросить, не перезапуская сервер.

call cache отвечает на оба вопроса — для тех кешей, до которых может дотянуться отдельный процесс. Подробно о самих кешах — на странице Кеширование методов.

Действия

Действие Что делает
show Все объявленные кеши: хранилище, настройки, число записей
show <имя> Записи кеша file или redis: ключ, размер, сколько осталось жить
show <имя> --all Все записи, а не первые 100
clear <имя> Очистить один кеш file или redis
clear --all Очистить все кеши file и redis
bash
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

text
 | [ 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 <имя>

text
 |	 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

text
 |	 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 переживают деплой — вместе с записями, сохранёнными старым кодом. Если классы значений менялись, очистите их перед запуском:

sh
php call di build || exit 1
php call cache clear --all || exit 1
exec php call run

Команда завершается с кодом 1, если что-то не получилось: неизвестное имя кеша, недоступный Redis, попытка очистить table или memory. Без #[EnableCaching] у приложения она тоже завершается с 1 и говорит, что кеширование не включено.

Альтернатива очистке — поменять version у кеша: старые записи просто перестанут находиться. Подробнее — в разделе Деплой и старые данные.

Дальше