Блог специалистов
13.02.2020

Удалить лишние файлы в /upload/iblock/ сравнив с записями в таблице b_file в Битрикс.

Активно работая с Битриксом, он имеет свойство увеличиваться в объеме. Все загружаемый файлы через админку получают запись о себе в таблицу b_file, со временем она разрастается. Обычно, удаляя файл или элемент, файл должен удаляться как и запись о нем в таблице, но, как показывает практика, частенько в таблице запись удалена, а вот файл все так и продолжает лежать на хостинге.

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

Делается это скриптом, который написали ребята из zixn.ru, за что им отдельное спасибо.

Но удаление управляется вот в этих строках:

$deleteFiles = 'no'; //Удалять ли найденные файлы yes/no $saveBackup = 'no'; //Создаст бэкап файла yes/no

Нужно создать файл .php в корне сайта, скопировать в него скрипт и запустить:

<?php require($_SERVER["DOCUMENT_ROOT"] . "/bitrix/header.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 = 'no'; //Создаст бэкап файла yes/no //Папка для бэкапа $patchBackup = $_SERVER['DOCUMENT_ROOT'] . "/upload/backup_files/"; //Целевая папка для поиска файлов $rootDirPath = $_SERVER['DOCUMENT_ROOT'] . "/upload/iblock"; //$rootDirPath = $_SERVER['DOCUMENT_ROOT'] . "/upload/support"; // Чтобы удалить в модуле техподдержка надо раскомментировать //$rootDirPath = $_SERVER['DOCUMENT_ROOT'] . "/upload/support/not_image"; //Чтобы удалить из данной папки //Создание папки для бэкапа if (!file_exists($patchBackup)) {     CheckDirPath($patchBackup); }   // Получаем записи из таблицы b_file $arFilesCache = array(); $result = $DB->Query('SELECT FILE_NAME, SUBDIR FROM b_file WHERE MODULE_ID = "iblock"'); //Тут меняем iblock на support, чтобы удалить в модуле техподдержка 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"); ?>

Количество показов: 7053




Возврат к списку