Skip to main content

Анализ формирования временных файлов upload/tmp/BXTEMP- в 1С-Битрикс

Файлы и директории с префиксом BXTEMP- в папке upload/tmp/ формируются механизмом управления временными файлами Битрикса, в частности классом CTempFile.

Основные механизмы создания

Префикс BXTEMP- жестко задан в методе CTempFile::GetDirectoryName в двух модулях:

  1. bitrix/modules/main/classes/general/file_temp.php — для локального файлового хранилища.
  2. bitrix/modules/clouds/classes/general/temp_file.php — для облачных хранилищ.

В отличие от метода GetFileName, который создает случайную папку в upload/tmp/, метод GetDirectoryName создает структуру вида upload/tmp/BXTEMP-ГГГГ-ММ-ДД/ЧЧ/случайное_имя/. Такие файлы имеют заданное "время жизни" (параметр $hours_to_keep_files) и удаляются автоматически системным агентом или при завершении работы PHP (если время жизни вышло).


Основные причины создания и стек вызовов

На основе анализа кода проекта можно выделить следующие уровни и сценарии использования:

1. Интеграция с 1С (Самая частая причина)

При импорте каталога или обмене заказами Битрикс создает временные директории для распаковки XML-файлов и обработки изображений.

  • Сценарии: Импорт каталога товаров, экспорт заказов, импорт Highload-блоков.
  • Пример стека:
    bitrix/components/bitrix/catalog.import.1c/component.php
    -> CTempFile::GetDirectoryName(6, "1c_catalog")
    

2. Экспорт отчетов и данных

При формировании тяжелых отчетов (например, в Excel или CSV) файл собирается порциями во временной директории, чтобы не перегружать память.

  • Сценарии: Экспорт конструктора отчетов, экспорт списка заказов.
  • Пример стека:
    bitrix/components/bitrix/report.view/stexport.ajax.php
    -> CTempFile::GetDirectoryName(1, array('report', uniqid('report_export_')))
    

3. Работа с облачными хранилищами (clouds)

При загрузке файлов в облако (S3, Google Storage и т.д.) или при их скачивании для обработки (например, для изменения размера), Битрикс создает локальную копию в BXTEMP-.

  • Сценарии: Синхронизация с облаком, скачивание файла из облака для генерации превью.
  • Пример стека:
    bitrix/modules/clouds/classes/general/storage.php
    -> CTempFile::GetDirectoryName(2, 'clouds')
    

4. Загрузчик файлов (Uploader) в UI

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

  • Сценарии: Загрузка картинок в фотогалерею, вложение файлов в письма техподдержки.
  • Пример стека:
    bitrix/modules/main/lib/ui/uploader/uploader.php
    -> \CTempFile::GetDirectoryName(...)
    

5. Системные операции с данными

  • Локации: При импорте или обновлении базы местоположений архивы распаковываются в BXTEMP-.
  • Почтовый модуль: При обработке входящих писем с вложениями.
  • Перевод: При работе с интерфейсом перевода сообщений.

Иерархия вызовов (снизу вверх)

  1. Низший уровень (Ядро): CTempFile::GetDirectoryName. Именно здесь формируется строка BXTEMP- и определяется путь в upload/tmp/.
  2. Средний уровень (Системные API):
    • CFile::GetTempName — часто вызывает CTempFile::GetFileName, но может быть частью логики создания папок.
    • \Bitrix\Main\UI\Uploader\Uploader — библиотека для работы с загрузкой.
  3. Верхний уровень (Модули и Компоненты):
    • catalogsale (обмен с 1С).
    • report (выгрузки).
    • photogallery (обработка фото).

Как найти конкретный процесс?

Если в папке upload/tmp/BXTEMP-... скопилось много файлов, это может означать:

  1. Зависшие импорты 1С: Если процесс импорта упал с ошибкой, файлы могут не удалиться (хотя агент очистки должен их со временем убрать).
  2. Проблемы с правами доступа: PHP не может удалить созданные файлы/папки.
  3. Отсутствие агентов на хитах: Если на сайте нет посещаемости и не настроен cron, агент CTempFile::Cleanup не вызывается.

Для отладки конкретного появления файла можно временно добавить debug_print_backtrace() в bitrix/modules/main/classes/general/file_temp.php в методе GetDirectoryName.