13.02.2020
Не будем вдаваться в подробности отчего так происходит, но вот иногда нужно сравнить все записи с таблицей b_file и удалить файлы в /upload/iblock/ или /upload/support/, которых в этой таблице нет.
Делается это скриптом, который написали ребята из zixn.ru, за что им отдельное спасибо.
Но удаление управляется вот в этих строках:
Количество показов: 7053
Удалить лишние файлы в /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