Files
crm.clientright.ru/cleanup_disk.php
Fedor 840acca51a feat(documents): дедупликация documents_meta и исправление field_label
- Исправлен N8N_CODE_PROCESS_UPLOADED_FILES_FIXED.js: использовать uploads_field_labels[0] вместо [grp]
- Создан SQL_CLAIMSAVE_FIXED_NEW_FLOW_DEDUP.sql с дедупликацией documents_meta
- Создан SQL_CLEANUP_DOCUMENTS_META_DUPLICATES.sql для очистки существующих дубликатов
- Создан полный уникальный индекс idx_document_texts_hash_unique на document_texts(file_hash)
- Добавлен SESSION_LOG_2025-11-28_documents_dedup.md с описанием всех изменений

Fixes:
- field_label теперь корректно отображает 'Переписка' вместо 'group-2'
- documents_meta не накапливает дубликаты при повторных сохранениях
- ON CONFLICT (file_hash) теперь работает для document_texts
2025-11-28 18:16:53 +03:00

192 lines
7.1 KiB
PHP
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
/**
* Скрипт для безопасной очистки диска
*
* Удаляет:
* 1. Старые бэкапы SQL (оставляет последние N)
* 2. Большие логи (очищает или удаляет старые)
*/
error_reporting(E_ALL);
ini_set('display_errors', 1);
$dryRun = !isset($argv[1]) || $argv[1] !== '--execute';
$keepBackups = isset($argv[2]) ? (int)$argv[2] : (isset($argv[1]) && is_numeric($argv[1]) ? (int)$argv[1] : 5); // Сколько бэкапов оставить
echo "Очистка диска\n";
echo str_repeat("=", 80) . "\n\n";
if (!$dryRun) {
echo "⚠️ РЕЖИМ ПРОВЕРКИ (dry-run)\n";
echo " Для реального удаления запустите: php cleanup_disk.php --execute [количество_бэкапов]\n";
echo " Пример: php cleanup_disk.php --execute 5\n\n";
} else {
echo "⚠️ РЕЖИМ УДАЛЕНИЯ - файлы будут удалены!\n\n";
}
$stats = [
'backups_found' => 0,
'backups_to_delete' => 0,
'backups_size' => 0,
'logs_found' => 0,
'logs_to_clean' => 0,
'logs_size' => 0,
'total_freed' => 0
];
// 1. Обработка бэкапов SQL
echo "1. ОБРАБОТКА БЭКАПОВ SQL\n";
echo str_repeat("-", 80) . "\n";
$backupDir = __DIR__;
$backups = glob($backupDir . '/backup_before_migration_*.sql');
if (empty($backups)) {
echo " Бэкапы не найдены\n\n";
} else {
$stats['backups_found'] = count($backups);
// Сортируем по дате изменения (новые первыми)
usort($backups, function($a, $b) {
return filemtime($b) - filemtime($a);
});
echo " Найдено бэкапов: {$stats['backups_found']}\n";
echo " Оставим последних: {$keepBackups}\n";
echo " Будет удалено: " . max(0, $stats['backups_found'] - $keepBackups) . "\n\n";
$toDelete = array_slice($backups, $keepBackups);
$stats['backups_to_delete'] = count($toDelete);
if (!empty($toDelete)) {
echo " Файлы для удаления:\n";
foreach ($toDelete as $backup) {
$size = filesize($backup);
$stats['backups_size'] += $size;
$sizeMB = round($size / 1024 / 1024, 2);
$date = date('Y-m-d H:i:s', filemtime($backup));
echo " - " . basename($backup) . " ({$sizeMB}MB, {$date})\n";
}
if ($dryRun && !empty($toDelete)) {
echo "\n Удаление файлов...\n";
foreach ($toDelete as $backup) {
if (unlink($backup)) {
echo "" . basename($backup) . " - удален\n";
} else {
echo "" . basename($backup) . " - ошибка удаления\n";
}
}
}
echo "\n";
} else {
echo " Нет файлов для удаления\n\n";
}
}
// 2. Обработка больших логов
echo "2. ОБРАБОТКА ЛОГОВ\n";
echo str_repeat("-", 80) . "\n";
$largeLogs = [
__DIR__ . '/wdall.log',
__DIR__ . '/wdall2.log',
__DIR__ . '/wa_inbound.log',
__DIR__ . '/wa_outbound.log',
];
foreach ($largeLogs as $logFile) {
if (file_exists($logFile)) {
$size = filesize($logFile);
$sizeMB = round($size / 1024 / 1024, 2);
if ($size > 10 * 1024 * 1024) { // Больше 10MB
$stats['logs_found']++;
$stats['logs_size'] += $size;
echo " Найден большой лог: " . basename($logFile) . " ({$sizeMB}MB)\n";
if ($dryRun) {
// Очищаем лог (оставляем последние 1000 строк)
$lines = file($logFile);
if (count($lines) > 1000) {
$keepLines = array_slice($lines, -1000);
if (file_put_contents($logFile, implode('', $keepLines))) {
$newSize = filesize($logFile);
$freedMB = round(($size - $newSize) / 1024 / 1024, 2);
echo " ✅ Очищен (освобождено {$freedMB}MB)\n";
$stats['logs_to_clean']++;
} else {
echo " ❌ Ошибка очистки\n";
}
} else {
echo " Лог небольшой, пропущен\n";
}
} else {
echo " ⏸️ Будет очищен (dry-run)\n";
$stats['logs_to_clean']++;
}
}
}
}
// Обработка логов в папке logs/
$logsDir = __DIR__ . '/logs';
if (is_dir($logsDir)) {
$logFiles = glob($logsDir . '/*.log*');
foreach ($logFiles as $logFile) {
$size = filesize($logFile);
if ($size > 20 * 1024 * 1024) { // Больше 20MB
$sizeMB = round($size / 1024 / 1024, 2);
$mtime = filemtime($logFile);
$daysOld = (time() - $mtime) / 86400;
if ($daysOld > 7) {
$stats['logs_found']++;
$stats['logs_size'] += $size;
echo " Старый большой лог: " . basename($logFile) . " ({$sizeMB}MB, " . round($daysOld) . " дней)\n";
if ($dryRun) {
if (unlink($logFile)) {
echo " ✅ Удален\n";
$stats['logs_to_clean']++;
} else {
echo " ❌ Ошибка удаления\n";
}
} else {
echo " ⏸️ Будет удален (dry-run)\n";
$stats['logs_to_clean']++;
}
}
}
}
}
echo "\n";
// Итоговая статистика
$stats['total_freed'] = $stats['backups_size'] + $stats['logs_size'];
$totalFreedMB = round($stats['total_freed'] / 1024 / 1024, 2);
$totalFreedGB = round($stats['total_freed'] / 1024 / 1024 / 1024, 2);
echo str_repeat("=", 80) . "\n";
echo "ИТОГОВАЯ СТАТИСТИКА:\n\n";
echo "Бэкапы:\n";
echo " - Найдено: {$stats['backups_found']}\n";
echo " - Будет удалено: {$stats['backups_to_delete']}\n";
echo " - Размер: " . round($stats['backups_size'] / 1024 / 1024 / 1024, 2) . "GB\n\n";
echo "Логи:\n";
echo " - Найдено больших: {$stats['logs_found']}\n";
echo " - Будет обработано: {$stats['logs_to_clean']}\n";
echo " - Размер: " . round($stats['logs_size'] / 1024 / 1024, 2) . "MB\n\n";
echo "ОБЩЕЕ ОСВОБОЖДЕНИЕ: {$totalFreedGB}GB ({$totalFreedMB}MB)\n\n";
if (!$dryRun) {
echo "⚠️ Это был режим проверки. Для реального удаления запустите:\n";
echo " php cleanup_disk.php --execute {$keepBackups}\n\n";
} else {
echo "✅ Очистка завершена!\n\n";
}