Создаем сайты

которые продают

Битрикс - очистка папки 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, чтобы очистить весь возможный мусор, который мог возникнуть при разработке или доработке сайта.

Ничего не понятно?
Я помогу вам очистить папку Upload!

Я помогу вам очистить папку Upload

Всего за 20 BYN / 8$ / 600 RUB


А также проконсультирую вас по любым
вопросам, связанным с вашим сайтом :)

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

Напишите мне!

Задать вопрос в

Написать в

Вам ответит: Рапанович Андрей, PHP-Программист