Добавлена команда для очистки кэша
This commit is contained in:
88
app/Console/Commands/ClearCacheByPattern.php
Normal file
88
app/Console/Commands/ClearCacheByPattern.php
Normal file
@@ -0,0 +1,88 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Console\Commands;
|
||||||
|
|
||||||
|
use Illuminate\Console\Command;
|
||||||
|
use Illuminate\Support\Facades\Redis;
|
||||||
|
|
||||||
|
class ClearCacheByPattern extends Command
|
||||||
|
{
|
||||||
|
protected $signature = 'cache:clear-pattern {pattern : Шаблон ключей, например "doctors:duty:*" }
|
||||||
|
{--force : Удалять без подтверждения}
|
||||||
|
{--no-prefix : Не добавлять автоматически префикс из конфига}';
|
||||||
|
|
||||||
|
protected $description = 'Удаляет все ключи Redis, соответствующие шаблону (с автоподстановкой префикса)';
|
||||||
|
|
||||||
|
public function handle()
|
||||||
|
{
|
||||||
|
$pattern = $this->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);
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user