.*?<\/div>/is', '', $content); // $content = preg_replace('/]*?id=["\']bx-admin-panel["\'][^>]*?>.*?<\/div>/is', '', $content); // $content = preg_replace('/]*?href="[^"]*?bitrix\/panel\/main\/top_panel\.css"[^>]*?>/is', '', $content); // } // } // AddEventHandler("main", "OnEndBufferContent", "convertImagesToAvif"); // function convertImagesToAvif(&$content, $bForce = false) // { // // если админка / ajax / cron — можно не трогать // global $USER, $APPLICATION; // // Пропускаем для авторизованных, админки и служебных страниц // if ( // (is_object($USER) && $USER->IsAuthorized()) || // strpos($APPLICATION->GetCurDir(), "/bitrix/") !== false // ) { // return; // } // /*$arPatternsToRemove = [ // '/<\/script>/', // '/<\/script>/', // '/BX\.(setCSSList|setJSList)\[.+?\].*?<\/script>/', // '/if\s*\(!window\.BX\)window\.BX.+?<\/script>/', // '/]+?>(window\.BX\|\|top\.BX)\.message[^<]+<\/script>/', // ]; // $content = preg_replace($arPatternsToRemove, "", $content); // $content = preg_replace("/\n{2,}/", "\n\n", $content); // Очистка пустых строк*/ // if (defined('ADMIN_SECTION') && ADMIN_SECTION === true) { // return; // } // // Пропускаем не HTML и админку // if ( // strpos($content, ']*?)>/i'; // $content = preg_replace_callback($pattern, function ($matches) { // $fullTag = $matches[0]; // $attrs = $matches[1]; // Атрибуты ДО src // $src = $matches[2]; // Сам URL // $restAttrs = $matches[3]; // Атрибуты ПОСЛЕ src (здесь часто живут alt, title, class) // // Проверяем наличие AVIF версии // $avifUrl = convertToAvifUrl($src); // if (!$avifUrl) // return $fullTag; // // Соединяем все старые атрибуты в одну строку для проверки // // (чтобы случайно не добавить decoding="async", если он уже есть в $restAttrs) // $allOldAttrs = $attrs . $restAttrs; // // Добавляем атрибуты для поддержки браузеров, если их нет // // Используем stripos для регистронезависимого поиска // $decoding = stripos($allOldAttrs, 'decoding=') === false ? ' decoding="async"' : ''; // $loading = ''; // // $loading = stripos($allOldAttrs, 'loading=') === false ? ' loading="lazy"' : ''; // return sprintf( // '', // Обратите внимание: убрал пробел после src="", так как он обычно есть в начале $attrs или $restAttrs // $avifUrl, // $attrs, // Возвращаем то, что было ДО src // $restAttrs, // Возвращаем то, что было ПОСЛЕ src (включая ALT) // $loading, // $decoding // ); // }, $content); // } function convertToAvifUrl($imageUrl) { static $cache = []; $hash = md5($imageUrl); if (isset($cache[$hash])) return $cache[$hash]; $docRoot = $_SERVER['DOCUMENT_ROOT']; // ✅ ПОЛНАЯ НОРМАЛИЗАЦИЯ ПУТЕЙ BITRIX $imagePath = normalizeImagePath($imageUrl); // AddMessage2Log("Normalized path: " . $imagePath, "avif_debug"); $fullPath = $docRoot . $imagePath; if (!file_exists($fullPath)) { // AddMessage2Log("File not found: " . $fullPath, "avif_debug"); $cache[$hash] = false; return false; } $avifPath = preg_replace('/\.(jpg|jpeg|jpe|png|gif|webp)$/i', '.avif', $fullPath); $avifUrl = str_replace($docRoot, '', $avifPath); if (file_exists($avifPath)) { $cache[$hash] = $avifUrl; return $avifUrl; } $result = createAvifImage($fullPath, $avifPath); $cache[$hash] = $result ? $avifUrl : false; return $cache[$hash]; } function normalizeImagePath($url) { // Убираем протокол, домен, query string $url = preg_replace('#^https?://[^/]+#i', '', $url); $url = preg_replace('#\?.*$#', '', $url); // Убираем параметры $url = preg_replace('#^/+(.+)$#', '/$1', $url); // Нормализуем слеши // ✅ Bitrix пути: /upload/iblock/..., /bitrix/templates/... $url = str_replace('//', '/', $url); // AddMessage2Log("Raw URL: $url", "avif_debug"); return $url; } function createAvifImage($sourcePath, $targetPath) { if (!extension_loaded('imagick')) return false; try { $imagick = new Imagick($sourcePath); $imagick->setImageFormat('avif'); $imagick->setImageCompressionQuality(100); // Баланс качества/размера $imagick->stripImage(); // Удаляем метаданные // Создаем директории если нужно $targetDir = dirname($targetPath); if (!is_dir($targetDir)) { mkdir($targetDir, 0755, true); } return $imagick->writeImage($targetPath); } catch (Exception $e) { // AddMessage2Log("AVIF conversion error: " . $e->getMessage(), "avif"); return false; } } function getWebpUrl($imagePath) { $imagePath = str_replace([$_SERVER['HTTP_HOST'], 'http://', 'https://'], '', $imagePath); $webpPath = preg_replace('/\.(jpg|jpeg|png)$/i', '.webp', $_SERVER['DOCUMENT_ROOT'] . $imagePath); return file_exists($webpPath) ? str_replace($_SERVER['DOCUMENT_ROOT'], '', $webpPath) : preg_replace('/\.(jpg|jpeg|png|webp)$/i', '.webp', $imagePath); }
[RuntimeException] 
Could not start session because headers have already been sent. "/home/bitrix/www/bitrix/php_interface/init.php":1974. (0)
/home/bitrix/www/bitrix/modules/main/lib/session/session.php:143
#0: Bitrix\Main\Session\Session->start
	/home/bitrix/www/bitrix/modules/main/lib/session/kernelsessionproxy.php:47
#1: Bitrix\Main\Session\KernelSessionProxy->start
	/home/bitrix/www/bitrix/modules/main/include.php:182
#2: require_once(string)
	/home/bitrix/www/bitrix/modules/main/include/prolog_before.php:19
#3: require_once(string)
	/home/bitrix/www/bitrix/modules/main/include/prolog.php:10
#4: require_once(string)
	/home/bitrix/www/bitrix/header.php:1
#5: require(string)
	/home/bitrix/www/ukraine/blagoveshchenskoe/index.php:2
----------