Привет, Хабр!
Сегодня мы поговорим о том, как highload-блоки в Битрикс24 могут помочь справиться с большими объемами данных и обеспечить стабильную работу систем при высоких нагрузках.
Highload-блоки в Битрикс24 — это специальный инструмент для работы с большими наборами данных в условиях высоких нагрузок. В отличие от стандартных инфоблоков, highload-блоки ориентированы на обработку большого объема данных с высокой производительностью.
Highload-блоков позволяют:
Уменьшить время отклика системы.
Снизить нагрузку на БД.
Оптимизировать процесс обработки данных.
Основные возможности
Поддержка NoSQL и ORM
Highload-блоки используют NoSQL подход для хранения и обработки данных. Так можно эффективно работать с неструктурированными и полуструктурированными данными.
ORM позволяет взаимодействовать с базой данных через объектно-ориентированные модели. Так получаем поддержку различных операций с данными, таких как создание, чтение, обновление и удаление, через объектные методы.
Настройка и интеграция с другими модулями
Сущестсует возможность использования highload-блоков для хранения доп. данных, связанных с CRM-сущностями, такими как контакты, сделки и компании.
Также есть поддержка кастомных полей (например, TagSelector), которые могут быть использованы в фильтрах и отчетах CRM.
Highload-блоки могут быть использованы для хранения данных, которые нецелесообразно хранить в стандартных инфоблоках из-за их объема или специфики.
Процесс настройки highload-блоков
Все стартует с создания highload-блока:
Переходим в административную часть Битрикс24. В меню выбераем раздел «Контент» и затем «Highload‑блоки». Нажимаем кнопку «Добавить highload‑блок». Указываем имя блока и его таблицы в Бд, а также код, который будет использоваться в коде. Там же можно указать группы пользователей.
Далее необходимо перейти к настройке блока. Добавляем необходимые поля, указав их тип (строка, целое число, дата и т. д.), название и доп. параметры, такие как обязательность заполнения и уникальность. Например, для справочника товаров можно создать поля «ID», «Название товара», «Цена», «Описание» и т. д.
Чтобы добавить элементы в highload‑блок, переходим к административной части, выбираем созданный highload‑блок и добавляемновые записи, заполнив соответствующие поля. Этот процесс аналогичен добавлению элементов в инфоблоки, но с учетом оптимизаций для высоких нагрузок.
Рассмотрим примеры настройки полей для различных кейсов:
Справочник товаров:
Поля: ID (автоинкремент), Название (строка), Цена (целое число), Описание (текст), Дата добавления (дата/время).
Для поля «Цена» можно задать валидацию на положительное значение.
Кастомные поля (TagSelector):
Поля: ID (автоинкремент), Тег (строка).
В настройках можно включить возможность выбора нескольких тегов и указать их отображение в виде списка или дерева.
Пример кода для создания и настройки полей highload-блоков:
use Bitrix\Highloadblock as HL; use Bitrix\Main\Entity; $hlblock = HL\HighloadBlockTable::add(array( 'NAME' => 'ProductCatalog', 'TABLE_NAME' => 'b_product_catalog' )); $entity = HL\HighloadBlockTable::compileEntity($hlblock); $fields = array( array( 'ENTITY_ID' => 'HLBLOCK_' . $hlblock['ID'], 'FIELD_NAME' => 'UF_NAME', 'USER_TYPE_ID' => 'string', 'MANDATORY' => 'Y' ), array( 'ENTITY_ID' => 'HLBLOCK_' . $hlblock['ID'], 'FIELD_NAME' => 'UF_PRICE', 'USER_TYPE_ID' => 'double', 'MANDATORY' => 'Y' ), array( 'ENTITY_ID' => 'HLBLOCK_' . $hlblock['ID'], 'FIELD_NAME' => 'UF_DESCRIPTION', 'USER_TYPE_ID' => 'string' ), array( 'ENTITY_ID' => 'HLBLOCK_' . $hlblock['ID'], 'FIELD_NAME' => 'UF_DATE_ADDED', 'USER_TYPE_ID' => 'datetime' ) ); foreach ($fields as $field) { $result = $entity::addField($field); if (!$result->isSuccess()) { echo implode(', ', $result->getErrorMessages()); } }
Импорт данных в highload-блоки можно выполнить через административную часть или с помощью API. Поддерживаются форматы CSV и XML. В случае CSV файла необходимо подготовить файл с заголовками, соответствующими полям highload-блока.
Пример для импорта данных из CSV:
$csvFile = '/path/to/file.csv'; $handle = fopen($csvFile, 'r'); while (($data = fgetcsv($handle, 1000, ',')) !== FALSE) { $result = $entity::add(array( 'UF_NAME' => $data[0], 'UF_PRICE' => $data[1], 'UF_DESCRIPTION' => $data[2], 'UF_DATE_ADDED' => $data[3] )); if (!$result->isSuccess()) { echo implode(', ', $result->getErrorMessages()); } } fclose($handle);
Экспорт данных из highload-блоков также поддерживает форматы CSV и XML. Можно использовать стандартные методы выборки данных и записи их в файл.
Пример:
$csvFile = '/path/to/export.csv'; $handle = fopen($csvFile, 'w'); fputcsv($handle, array('ID', 'Name', 'Price', 'Description', 'Date Added')); $result = $entity::getList(); while ($item = $result->fetch()) { fputcsv($handle, array( $item['ID'], $item['UF_NAME'], $item['UF_PRICE'], $item['UF_DESCRIPTION'], $item['UF_DATE_ADDED'] )); } fclose($handle);
Экспорт данных в формат RSS может быть выполнен с использованием стандартных библиотек PHP для генерации RSS-каналов.Так можно постить обновления и новости, связанные с данными highload-блоков.
Пример кода:
use Bitrix\Highloadblock as HL; use Bitrix\Main\Entity; // подключаем необходимые модули и файлы require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php"); CModule::IncludeModule('highloadblock'); // указываем ID highload-блока и получаем информацию о нём $hlblockId = 1; // Замените на ID вашего highload-блока $hlblock = HL\HighloadBlockTable::getById($hlblockId)->fetch(); $entity = HL\HighloadBlockTable::compileEntity($hlblock); $entityDataClass = $entity->getDataClass(); // получаем данные из highload-блока $rsData = $entityDataClass::getList(array( "select" => array('ID', 'UF_NAME', 'UF_DESCRIPTION', 'UF_DATE_ADDED'), "order" => array('UF_DATE_ADDED' => 'DESC'), "limit" => 20 )); header('Content-Type: application/rss+xml; charset=utf-8'); echo '<?xml version="1.0" encoding="UTF-8" ?>'; echo '<rss version="2.0">'; echo '<channel>'; echo '<title>Highload-блок RSS</title>'; echo '<link>http://yourwebsite.com/</link>'; echo '<description>Новости из highload-блока</description>'; echo '<language>ru</language>'; // проходим по данным и формируем элементы RSS while ($arItem = $rsData->fetch()) { echo '<item>'; echo '<title>' . htmlspecialchars($arItem['UF_NAME']) . '</title>'; echo '<link>http://yourwebsite.com/item/' . $arItem['ID'] . '</link>'; echo '<description>' . htmlspecialchars($arItem['UF_DESCRIPTION']) . '</description>'; echo '<pubDate>' . date(DATE_RSS, strtotime($arItem['UF_DATE_ADDED'])) . '</pubDate>'; echo '</item>'; } echo '</channel>'; echo '</rss>';
Используя ID highload-блока, получаем информацию о нём и данные, которые будем экспортировать в RSS-формат. Устанавливаем заголовок Content-Type, чтобы указать браузеру, что документ является RSS-лентой. В блоке while проходим по всем элементам, полученным из highload-блока, и формируем соответствующие элементы RSS <item>.
Highload-блоки в Битрикс24, несмотря на их мощность, имеют ряд ограничений и потенциальных проблем. Одно из основных ограничений является объем данных и производительность. Хотя highload-блоки могут хорошо работать с миллионами записей, производительность системы может снижаться при увеличении объема данных. Это связано с тем, что запросы к БД могут становиться более медленными, особенно если они не оптимизированы или отсутствует кэширование.
При увеличении объема данных может возникнуть необходимость в оптимизации самой БД:, индексация, настройка параметров кэширования и т.п.
В заключение напоминаю про открытый урок, на котором участники обсудят изменение пользовательских интерфейсов в Битрикс24.
К концу занятия вы узнаете, почему не стоит использовать переопределение шаблонов компонентов, как встраивать пользовательские поля с произвольной версткой, как встраивать REST приложения и дорабатывать интерфейс при помощи JavaScript.
Встреча пройдет 16 июля. Если актуально — записывайтесь по ссылке.
