Налаштування WebP-конвертації зображень 1С-Бітрікс
На типовому інтернет-магазині Бітрикс сторінка каталогу завантажує 40–80 зображень. JPEG та PNG важать у сумі 2–5 МБ — це секунди затримки на мобільному з'єднанні. WebP при порівнянній якості дає 25–35% виграшу за розміром. Проблема в тому, що «включити WebP» у Бітриксі — не одна кнопка, а комбінація кількох механізмів, кожен з яких може мовчки не працювати.
Як Бітрикс обробляє зображення
Ядро використовує модуль main (клас CFile) для зберігання файлів і модуль resize_image для генерації превью. Фізично ресайзер викликається через \Bitrix\Main\Web\Image або через старий API CFile::ResizeImageFile(). Результати кешуються в bitrix/cache/resize_cache/ з хешованими іменами папок.
WebP-конвертація у Бітриксі реалізована двома шляхами:
Шлях 1 — серверна конвертація через PHP. Бібліотека GD або Imagick конвертує при ресайзі. Налаштовується в bitrix/php_interface/dbconn.php або через адміністративний інтерфейс у розділі «Продуктивність».
Шлях 2 — конвертація на рівні веб-сервера. Nginx/Apache віддає .webp-версію замість оригіналу, якщо браузер підтримує формат (заголовок Accept: image/webp). Файли конвертуються заздалегідь — скриптом або демоном.
Налаштування серверної конвертації
Перевірка GD та Imagick
php -r "echo gd_info()['WebP Support'] ? 'WebP OK' : 'WebP NOT supported';"
php -r "echo (new Imagick())->queryFormats('WEBP') ? 'Imagick WebP OK' : 'fail';"
Якщо GD зібраний без WebP — потрібен libwebp-dev та пересборка, або переведення на Imagick. На Bitrix VM проблем зазвичай немає — там Imagick з WebP йде з коробки.
Конфігурація у Бітриксі
У файлі /bitrix/php_interface/dbconn.php додаємо:
define("BX_USE_MYSQLI", true);
define("CACHED_b_file", 3600);
Включення WebP у модулі resize — через налаштування модуля main:
\Bitrix\Main\Config\Option::set('main', 'use_webp', 'Y');
\Bitrix\Main\Config\Option::set('main', 'webp_quality', '85');
Після цього \Bitrix\Main\Web\Image::resize() буде повертати .webp якщо клієнт підтримує формат. Перевірити можна у таблиці b_file — поле CONTENT_TYPE у нових превью повинно бути image/webp.
Конвертація на рівні Nginx
Це продуктивніше: PHP не витрачає CPU на конвертацію в момент запиту. Схема: при першому запиті генеруємо .webp-версію поруч з оригіналом, Nginx перевіряє її наявність і віддає якщо браузер підтримує.
map $http_accept $webp_suffix {
default "";
"~*webp" ".webp";
}
server {
location ~* ^/upload/.*\.(png|jpg|jpeg)$ {
add_header Vary Accept;
try_files $uri$webp_suffix $uri =404;
}
}
Попередня конвертація скриптом cwebp:
find /var/www/bitrix/upload -name "*.jpg" -o -name "*.png" | \
xargs -P4 -I{} sh -c 'cwebp -q 82 "$1" -o "$1.webp" 2>/dev/null' _ {}
Запускати через cron раз на годину для нових файлів — по даті модифікації через find -newer.
Інвалідація кеша превью
Після включення WebP старі превью в bitrix/cache/resize_cache/ залишаються в JPEG/PNG. Потрібно їх видалити:
rm -rf /var/www/bitrix/bitrix/cache/resize_cache/*
Або через адміністративну панель: «Управління сайтом» → «Продуктивність» → «Очистити кеш». Після цього превью регенеруються при першому звертанні — можна прогріти curl-скриптом за sitemap.
Типові проблеми
WebP генерується, але браузер отримує JPEG. Nginx не передає заголовок Vary: Accept — CDN або кешируючий прокси віддає закешовану версію без врахування типу браузера.
Розмір WebP більше оригіналу. Буває на дрібних іконках (до 10×10 px) та PNG з малою кількістю кольорів. Варто додати перевірку: якщо WebP більше оригіналу на 10%, віддавати оригінал.
Помилки в b_event_log. При включеній конвертації та відсутності прав на запис у upload/ — Бітрикс пише помилки. Перевірити chown на директорію upload/ від імені користувача веб-сервера.







