Зачастую администраторы веб-сайтов, работающих на платформе 1С-Битрикс, могут не обращать внимание на огромные размеры папки «upload». Очистка папки в таком случае — одна из наиболее критических операций по управлению ресурсами сервера, и она может существенно повлиять на производительность вашего сайта. Давайте рассмотрим, почему очистка этой папки настолько важна и как ее выполнить.
Папка «upload» в 1С-Битрикс: что это и как она используется?
Папка «upload» — это одно из ключевых мест, где хранятся все загруженные файлы на вашем сайте, такие как изображения, документы, архивы и многое другое. Эта папка используется системой 1С-Битрикс для хранения пользовательских данных, а также файлов, созданных самой системой.
1С-Битрикс при удалении элементов в штатном режиме через панель управления хорошо чистит все за собой. Однако часто при неправильной настройке синхронизации 1С-Битрикс и 1С8, по мере использования сайта или при других факторах, например восстановление из бэкапа, возникает проблема, когда в папке upload остаются лишние файлы, которые не используются сайтом.
Проблема, связанная с неочищенной папкой «upload». Постоянный прирост файлов в папке «upload» может привести к неэффективному использованию ресурсов сервера. Это может сказаться на производительности вашего сайта и снизить скорость его загрузки. Чем больше файлов хранится в папке «upload», тем больше времени может занимать процесс обработки запросов и загрузки страниц. Это особенно актуально для модуля «iblock», который часто используется для отображения изображений и других медиафайлов. Очистка папки помогает улучшить производительность сайта и ускорить загрузку страниц.
Очистка этой папки позволяет освободить место на сервере для новых файлов и обеспечить бесперебойную работу сайта.
Как очистить папку «upload» в 1С-Битрикс
Чтобы избежать вышеуказанных проблем, необходимо периодически проводить очистку папки «upload».
На просторах интернета уже есть скрипты, для очистки папки «iblock», но некоторые из них потеряли актуальность и работают некорректно. В связи с тем, что в папке «upload» хранят информацию и другие модули, например, Crm, Voximplant и т.д., которые накапливают огромные объёмы данных, требуется универсальный скрипт обнаружения.
Для обнаружения неиспользуемых файлов воспользуемся скриптом:
<?php
require($_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/include/prolog_before.php');
class ScanUpload
{
// целевая папка для поиска файлов
public $rootDirPath;
// массив для записи файлов из таблицы b_file
public $arFilesCache = [];
//название модуля для сканирования
public $module;
public function __construct()
{
// целевая папка для поиска файлов
$this->rootDirPath = $_SERVER['DOCUMENT_ROOT'] . "/upload/crm/";
$this->module = 'crm';
$this->getFilesFromDB();
}
private function getFilesFromDB()
{
// глобальный объект $DB для работы с базой данных
global $DB;
// получаем записи из таблицы b_file
$result = $DB->Query('SELECT FILE_NAME, SUBDIR FROM b_file WHERE LEFT(SUBDIR, LOCATE("/", SUBDIR) - 1) ="' . $this->module . '"');
// перебираем записи из таблицы b_file
while ($row = $result->Fetch())
{
$this->arFilesCache[$row['FILE_NAME']] = $row['SUBDIR'];
}
}
public function findAndCheckFiles()
{
$foundFiles = [];
$this->findFiles($this->rootDirPath, $foundFiles);
$matchingFiles = [];
foreach ($foundFiles as $filePath)
{
$fileName = basename($filePath);
if (!isset($this->arFilesCache[$fileName]) && $this->arFilesCache[$fileName] !== $filePath)
{
$matchingFiles[] = $filePath;
}
}
return $matchingFiles;
}
private function findFiles($directory, &$foundFiles)
{
$files = glob($directory . '/*');
if ($files === false)
{
return;
}
foreach ($files as $file)
{
if (is_dir($file))
{
$this->findFiles($file, $foundFiles);
}
else
{
$foundFiles[] = $file;
}
}
}
}
$fileChecker = new ScanUpload();
$matchingFiles = $fileChecker->findAndCheckFiles();
echo "Найдено файлов: " . count($matchingFiles) . "<br>";
foreach ($matchingFiles as $filePath)
{
echo "Файл $filePath не используется в b_file.<br> ";
}
?>
Логика работы скрипта заключается в запросе к таблице b_file, но не по столбцу MODULE_ID, а по столбцу SUBDIR, т.к. существуют записи с пустым MODULE_ID.
Скрипт ходит по файловой структуре и сверяется с записями в b_file, файлы и папки, которые не найдены в b_file записываются в массив matchingFiles. Скрипт легко модифицируется, если требуется очистка файлов, достаточно добавить метод удаления, бэкапа т. д. И подставить туда данные из массива matchingFiles.
Предупреждение: Автор статьи не несет ответственности за удаление файлов и все действия выполняются на свой страх и риск. Прежде чем удалять файлы, убедитесь, что у вас есть резервная копия всех важных данных. Это поможет избежать потери информации.