Команда очистки кеша для статистики
This commit is contained in:
196
app/Console/Commands/ClearStatisticsCache.php
Normal file
196
app/Console/Commands/ClearStatisticsCache.php
Normal file
@@ -0,0 +1,196 @@
|
||||
<?php
|
||||
|
||||
namespace App\Console\Commands;
|
||||
|
||||
use Illuminate\Console\Command;
|
||||
use Illuminate\Support\Facades\Cache;
|
||||
|
||||
class ClearStatisticsCache extends Command
|
||||
{
|
||||
/**
|
||||
* The name and signature of the console command.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $signature = 'statistics:clear-cache
|
||||
{--department= : ID отделения}
|
||||
{--date= : Дата в формате YYYY-MM-DD}
|
||||
{--all : Очистить весь кэш статистики}';
|
||||
|
||||
/**
|
||||
* The description of the console command.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $description = 'Очистить кэш статистики';
|
||||
|
||||
/**
|
||||
* Execute the console command.
|
||||
*/
|
||||
public function handle()
|
||||
{
|
||||
if ($this->option('all')) {
|
||||
// Очищаем весь кэш статистики
|
||||
$this->clearAllStatisticsCache();
|
||||
$this->info('✅ Весь кэш статистики очищен');
|
||||
return 0;
|
||||
}
|
||||
|
||||
if ($departmentId = $this->option('department')) {
|
||||
// Очищаем кэш для конкретного отделения
|
||||
$this->clearDepartmentCache($departmentId);
|
||||
$this->info("✅ Кэш статистики для отдела {$departmentId} очищен");
|
||||
return 0;
|
||||
}
|
||||
|
||||
if ($date = $this->option('date')) {
|
||||
// Очищаем кэш за конкретную дату
|
||||
$this->clearDateCache($date);
|
||||
$this->info("✅ Кэш статистики за {$date} очищен");
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Если опции не указаны, показываем помощь
|
||||
$this->showHelp();
|
||||
return 1;
|
||||
}
|
||||
|
||||
/**
|
||||
* Очистить весь кэш статистики
|
||||
*/
|
||||
private function clearAllStatisticsCache(): void
|
||||
{
|
||||
// Способ 1: Если используем теги
|
||||
if (method_exists(Cache::store(), 'tags')) {
|
||||
Cache::tags(['statistics'])->flush();
|
||||
}
|
||||
// Способ 2: Очищаем все ключи со статистикой
|
||||
else {
|
||||
$this->clearStatisticsKeys();
|
||||
}
|
||||
|
||||
$this->info("Очищено: весь кэш статистики");
|
||||
}
|
||||
|
||||
/**
|
||||
* Очистить кэш для отделения
|
||||
*/
|
||||
private function clearDepartmentCache(int $departmentId): void
|
||||
{
|
||||
if (method_exists(Cache::store(), 'tags')) {
|
||||
Cache::tags(['statistics', 'department_' . $departmentId])->flush();
|
||||
} else {
|
||||
// Ищем и удаляем ключи для отдела
|
||||
$keys = Cache::get('statistics_keys_' . $departmentId, []);
|
||||
foreach ($keys as $key) {
|
||||
Cache::forget($key);
|
||||
}
|
||||
Cache::forget('statistics_keys_' . $departmentId);
|
||||
}
|
||||
|
||||
$this->info("Очищено: кэш для отдела {$departmentId}");
|
||||
}
|
||||
|
||||
/**
|
||||
* Очистить кэш за дату
|
||||
*/
|
||||
private function clearDateCache(string $date): void
|
||||
{
|
||||
if (method_exists(Cache::store(), 'tags')) {
|
||||
Cache::tags(['statistics', 'date_' . $date])->flush();
|
||||
} else {
|
||||
// Ищем ключи с этой датой
|
||||
$prefix = config('cache.prefix', 'laravel');
|
||||
$pattern = "{$prefix}:statistics:*{$date}*";
|
||||
$this->clearKeysByPattern($pattern);
|
||||
}
|
||||
|
||||
$this->info("Очищено: кэш за дату {$date}");
|
||||
}
|
||||
|
||||
/**
|
||||
* Очистить ключи по шаблону (для Redis)
|
||||
*/
|
||||
private function clearKeysByPattern(string $pattern): void
|
||||
{
|
||||
$store = Cache::getStore();
|
||||
|
||||
if ($store instanceof \Illuminate\Cache\RedisStore) {
|
||||
$redis = $store->getRedis();
|
||||
$keys = $redis->keys($pattern);
|
||||
|
||||
if (!empty($keys)) {
|
||||
$redis->del($keys);
|
||||
$this->info("Удалено ключей: " . count($keys));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Очистить все ключи статистики
|
||||
*/
|
||||
private function clearStatisticsKeys(): void
|
||||
{
|
||||
$prefix = config('cache.prefix', 'laravel');
|
||||
|
||||
// Для Redis
|
||||
$store = Cache::getStore();
|
||||
if ($store instanceof \Illuminate\Cache\RedisStore) {
|
||||
$redis = $store->getRedis();
|
||||
$keys = $redis->keys("{$prefix}:statistics:*");
|
||||
|
||||
if (!empty($keys)) {
|
||||
$redis->del($keys);
|
||||
$this->info("Удалено ключей статистики: " . count($keys));
|
||||
}
|
||||
}
|
||||
// Для файлового кэша
|
||||
elseif ($store instanceof \Illuminate\Cache\FileStore) {
|
||||
$directory = storage_path('framework/cache/data');
|
||||
$this->clearFileCache($directory, 'statistics');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Очистить файловый кэш
|
||||
*/
|
||||
private function clearFileCache(string $directory, string $pattern): void
|
||||
{
|
||||
if (!is_dir($directory)) {
|
||||
return;
|
||||
}
|
||||
|
||||
$files = glob($directory . '/*');
|
||||
$deleted = 0;
|
||||
|
||||
foreach ($files as $file) {
|
||||
if (is_file($file)) {
|
||||
$content = file_get_contents($file);
|
||||
if (strpos($content, $pattern) !== false) {
|
||||
unlink($file);
|
||||
$deleted++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$this->info("Удалено файлов кэша: " . $deleted);
|
||||
}
|
||||
|
||||
/**
|
||||
* Показать справку
|
||||
*/
|
||||
private function showHelp(): void
|
||||
{
|
||||
$this->error('❌ Не указаны параметры команды');
|
||||
$this->line('');
|
||||
$this->line('📋 Доступные опции:');
|
||||
$this->line(' --all Очистить весь кэш статистики');
|
||||
$this->line(' --department=ID Очистить кэш для конкретного отдела');
|
||||
$this->line(' --date=YYYY-MM-DD Очистить кэш за конкретную дату');
|
||||
$this->line('');
|
||||
$this->line('📝 Примеры использования:');
|
||||
$this->line(' php artisan statistics:clear-cache --all');
|
||||
$this->line(' php artisan statistics:clear-cache --department=1');
|
||||
$this->line(' php artisan statistics:clear-cache --date=2024-01-15');
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user