Бывает так что в системах под управлением Bitrix папка «upload/iblock» разрастается до больших размеров, при этом рост этой папки может быть вызван разными причинами. К счастью сама CMS Bitrix содержит таблицу где ведёт учёт файлов.
Решение опубликованное ниже, является одним из способов очистки папки от не учтенных файлов.
Для того что бы воспользоваться решением, создайте php файл на вашем сайте, можно в корневом каталоге, скопируйте код из примера ниже.
Задайте в коде значение переменных
$deleteFiles = ‘no’;
$saveBackup = ‘yes’;
Далее запустите созданную страницу у себя на сайте, т.е перейдите по адресу «ваш сайт/имя страницы .php»
При этом если вы укажите в нужные значения соответствующие переменные, код создаст папку с бэкапов файлов, если вы что то не обнаружите после работы «скрипта» — то всегда сможете вернуть изображения назад.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 |
<?php require($_SERVER["DOCUMENT_ROOT"] . "/bitrix/header.php"); ?> <?php global $USER; if (!$USER->IsAdmin()) { echo "Одумайся или авторизуйся..."; return; } $time_start = microtime(true); echo '<br>'; /////////////////////////////////////////////////////////////////// define("NO_KEEP_STATISTIC", true); define("NOT_CHECK_PERMISSIONS", true); $deleteFiles = 'no'; //Удалять ли найденые файлы yes/no $saveBackup = 'yes'; //Создаст бэкап файла yes/no //Папка для бэкапа $patchBackup = $_SERVER['DOCUMENT_ROOT'] . "/upload/zixnru_Backup/"; //Целевая папка для поиска файлов $rootDirPath = $_SERVER['DOCUMENT_ROOT'] . "/upload/iblock"; //Создание папки для бэкапа if (!file_exists($patchBackup)) { CheckDirPath($patchBackup); } // Получаем записи из таблицы b_file $arFilesCache = array(); $result = $DB->Query('SELECT FILE_NAME, SUBDIR FROM b_file WHERE MODULE_ID = "iblock"'); while ($row = $result->Fetch()) { $arFilesCache[$row['FILE_NAME']] = $row['SUBDIR']; } $hRootDir = opendir($rootDirPath); $count = 0; $contDir = 0; $countFile = 0; $i = 1; $removeFile=0; while (false !== ($subDirName = readdir($hRootDir))) { if ($subDirName == '.' || $subDirName == '..') { continue; } //Счётчик пройденых файлов $filesCount = 0; $subDirPath = "$rootDirPath/$subDirName"; //Путь до подкатегорий с файлами $hSubDir = opendir($subDirPath); while (false !== ($fileName = readdir($hSubDir))) { if ($fileName == '.' || $fileName == '..') { continue; } $countFile++; if (array_key_exists($fileName, $arFilesCache)) { //Файл с диска есть в списке файлов базы - пропуск $filesCount++; continue; } $fullPath = "$subDirPath/$fileName"; // полный путь до файла $backTrue = false; //для создание бэкапа if ($deleteFiles === 'yes') { if (!file_exists($patchBackup . $subDirName)) { if (CheckDirPath($patchBackup . $subDirName . '/')) { //создал поддиректорию $backTrue = true; } } else { $backTrue = true; } if ($backTrue) { if ($saveBackup === 'yes') { CopyDirFiles($fullPath, $patchBackup . $subDirName . '/' . $fileName); //копия в бэкап } } //Удаление файла if (unlink($fullPath)) { $removeFile++; echo "Удалил: " . $fullPath . '<br>'; } } else { $filesCount++; echo 'Кандидат на удаление - ' . $i . ') ' . $fullPath . '<br>'; } $i++; $count++; unset($fileName, $backTrue); } closedir($hSubDir); //Удалить поддиректорию, если удаление активно и счётчик файлов пустой - т.е каталог пуст if ($deleteFiles && !$filesCount) { rmdir($subDirPath); } $contDir++; } if ($count < 1) { echo 'Не нашёл данных для удаления<br>'; } if ($saveBackup === 'yes') { echo 'Бэкап файлов поместил в: <strong>' . $patchBackup . '</strong><br>'; } echo 'Всего файлов удалил: <strong>' . $removeFile . '</strong><br>'; echo 'Всего файлов в ' . $rootDirPath . ': <strong>' . $countFile . '</strong><br>'; echo 'Всего подкаталогов в ' . $rootDirPath . ': <strong>' . $contDir . '</strong><br>'; echo 'Всего записей в b_file: <strong>' . count($arFilesCache) . '</strong><br>'; closedir($hRootDir); //////////////////////////////////////////////////////////////////// echo '<br>'; $time_end = microtime(true); $time = $time_end - $time_start; echo "Время выполнения $time секунд\n"; require($_SERVER["DOCUMENT_ROOT"] . "/bitrix/footer.php"); ?> |
Решение протестировал на тестовой копии сайта — работает.
На основном сайте применить не получилось. Слишком много файлов в папке «/upload/iblock» и скрипт не справляется (зависает).
Хорошо бы добавить возможно обработки данных по частям.
Спасибо, работает. Модифицировал скрипт, только для отображения кандидатов. Так сказать для проверки сайта.
Магомеду рекомендую увеличить время выполнения скриптов php. Что-то типа max_execution_time в php.ini.
к сожалению, не удалил ни единого файла. все равно спасибо.
Добрый день!
Добавьте, пожалуйста, в код 2 параметра: по дате изменения файла (чтобы была возможность удалять только старые файлы до определенной даты) и по размеру файла.
Безусловно полезная вещь!
Вопрос только такой, а если файлы хранятся в облачном хранилище?
А какая структура облачного хранилища и принцип хранения файлов?
Знал бы сам — не спрашивал