Создание сайтов

любой сложности !

Битрикс - очистка папки Upload

10.01.2021
Здравствуйте! Очень часто при работе с 1С-Битрикс у нас возникает вопрос:

Как очистить папку upload и можно ли очистить папку upload

от лишних файлов и вообще проверить, есть ли они ?

Ответ – да! Можно!

1С-Битрикс при удалении элементов в штатном режиме через панель управления хорошо чистит все за собой, но очень часто при неправильной настройке синхронизации 1С-Битрикс и 1С8 или при других факторах, например восстановление из бэкапа возникает проблема, когда в папке upload остаются лишние файлы, которые не используются сайтом. 

Перед началом работы делаем полную резерную копию, на случай если что-то пойдет не так.


Задача на самом деле очень простая, т.к все используемые файлы сайтом хранятся в базе данных сайта в таблице b_file нам нужно скриптом пройтись по папке upload/iblock/ (Именно эта папка используется нашими инфоблоками) и удалить все лишнее, чего нет в базе данных в нашей таблице b_file. 

Нам поможет скрипт, найденный на GitHub:

Количество скачиваний:

Затем вам нужно распаковать архив и файлик clearupload.php залить на свой сайт в любую папку, где вы сможете его открыть в браузере.

Я например заливаю его в корень сайта и после авторизации на сайте в админке я открываю затем открываю:

https://ar-studio.by/clearupload.php

Результат выполнения скрипта: 

Хотя, у меня нет интеграции сайта с 1С, все равно каким-то образом появился мусор. 

Если вы не хотите скачивать скрипт, вы можете выполнить следующий код php в админке битрикс по пути:

Настройки > Настройки продукта > Инструменты > Командная PHP строка:

Вставляем код:

$deleteFiles = ‘yes’;
$saveBackup = ‘yes’;
global $USER;
if (!$USER->IsAdmin()) {
echo "Одумайся или авторизуйся...";
return;}
$time_start = microtime(true);
echo '';
define("NO_KEEP_STATISTIC", true);
define("NOT_CHECK_PERMISSIONS", true);
$deleteFiles = 'yes'; //Удалять ли найденые файлы yes/no
$saveBackup = 'no'; //Создаст бэкап файла 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 . '
';
}
} else {
$filesCount++;
echo 'Кандидат на удаление - ' . $i . ') ' . $fullPath . '
';
}
$i++;
$count++;
unset($fileName, $backTrue);
}
closedir($hSubDir);
//Удалить поддиректорию, если удаление активно и счётчик файлов пустой - т.е каталог пуст
if ($deleteFiles && !$filesCount) {
rmdir($subDirPath);
}
$contDir++;
}
if ($count < 1) {
echo 'Не нашёл данных для удаления
';
}
if ($saveBackup === 'yes') {
echo 'Бэкап файлов поместил в: ' . $patchBackup . '
';
}
echo '
Всего файлов удалил: ' . $removeFile . '';
echo '
Всего файлов в ' . $rootDirPath . ': ' . $countFile . '';
echo '
Всего подкаталогов в ' . $rootDirPath . ': ' . $contDir . '';
echo '
Всего записей в b_file: ' . count($arFilesCache) . '';
closedir($hRootDir);
echo ''; $time_end = microtime(true); $time = $time_end - $time_start; echo "Время выполнения $time секунд\n";

И нажимаем выполнить

Результат выполнения скрипта:


Из моего 10 летнего опыта работы над сайтами, максимум этим скриптом я удалил на одном сайте около 60гб мусора (Это был огромный интернет-магазин автозапчастей с 2 млн товаров.)!

Да, скрипт не сможет удалить такое количество файлов за один раз, нужно открывать его несколько раз.

После создания сайта я всегда пользуюсь им и прохожусь по папке upload, чтобы очистить весь возможный мусор, который мог возникнуть при разработке или доработке сайта.

Остались вопросы?

Отправьте письмо

Воспользуйтесь формой обратной связи
или пришлите вопросы на нашу почту info@ar-studio.by
Задать вопрос

Позвоните нам

+375 (29) 343-53-70 Пн. - Пт. 9:00 – 18:00
Вам ответит: Рапанович Андрей, руководитель веб-студии