From 33bc2d05e0f226d81f5096b3bc64425d96e3286c Mon Sep 17 00:00:00 2001 From: brusnitsyn Date: Mon, 13 Jul 2026 14:01:36 +0900 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=BA=D0=BE=D0=BC=D0=B0=D0=BD=D0=B4=D0=B0=20?= =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20=D0=BE=D1=87=D0=B8=D1=81=D1=82=D0=BA=D0=B8?= =?UTF-8?q?=20=D0=BA=D1=8D=D1=88=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Console/Commands/ClearCacheByPattern.php | 88 ++++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 app/Console/Commands/ClearCacheByPattern.php diff --git a/app/Console/Commands/ClearCacheByPattern.php b/app/Console/Commands/ClearCacheByPattern.php new file mode 100644 index 0000000..afea946 --- /dev/null +++ b/app/Console/Commands/ClearCacheByPattern.php @@ -0,0 +1,88 @@ +argument('pattern'); + $usePrefix = !$this->option('no-prefix'); + + // Получаем префикс кеша + $prefix = $this->getCachePrefix(); + + // Если префикс не пуст и мы его используем, добавляем к шаблону (если его там ещё нет) + if ($usePrefix && $prefix !== '' && strpos($pattern, $prefix) !== 0) { + $pattern = $prefix . $pattern; + $this->line("Добавлен префикс конфига: '{$prefix}'"); + } + + $this->line("Итоговый шаблон: {$pattern}"); + + // Проверка на отсутствие * (только если это не точный ключ) + if (strpos($pattern, '*') === false) { + if (!$this->confirm("Шаблон не содержит '*', будет удалён только один конкретный ключ. Продолжить?")) { + return 0; + } + } + + if (!$this->option('force') && !$this->confirm("Удалить все ключи по шаблону '{$pattern}'?")) { + return 0; + } + + $deleted = 0; + $cursor = 0; + + $this->info("Начинаю поиск..."); + + do { + $result = Redis::scan($cursor, ['match' => $pattern, 'count' => 200]); + + if ($result === false) { + $this->info("Ключи по шаблону '{$pattern}' не найдены!"); + return 0; + } + + $cursor = $result[0]; + $keys = $result[1]; + + if (!empty($keys)) { + Redis::del($keys); + $deleted += count($keys); + $this->line("Удалено {$deleted} ключей..."); + } + } while ($cursor != 0); + + $this->info("Готово! Удалено ключей: {$deleted}"); + return 0; + } + + /** + * Получает префикс кеша из конфигурации Laravel. + * + * @return string + */ + private function getCachePrefix(): string + { + // Сначала пытаемся взять префикс для хранилища redis + $prefix = config('cache.stores.redis.prefix'); + + // Если не задан, берём глобальный префикс (если есть) + if ($prefix === null) { + $prefix = config('cache.prefix', ''); + } + + // Приводим к строке и обрезаем лишние пробелы + return trim((string) $prefix); + } +}