Есть компонент A который выводит инфо об элементе инфоблока. Вывод кешируется по ID элемента. Иногда возникает необходимость сбросить кеш компонента A когда в компоненте B происходит какое-то событие. К сожалению, CBitrixComponent::clearComponentCache сбрасывает кеш всего компонента. А необходимо иметь возможность сбросить кеш только частично. Например компонентом A закешировано 100 элементов. Если я сброшу весь кеш компонента A через CBitrixComponent::clearComponentCache, то при следующих обращениях к компоненту, его кеш будет заполняться заново, даже если был изменен только один элемент. А если бы была возможность указывать ID кеша, то можно было бы сбросить только часть кеша компонента.
На сайтах где много страниц - кеш меню очень сильно разрастается, инодга на несколько гигабайт, что сильно тормозит работу сайта, так как на каждую страницу Битрикс зачем-то создает свой кеш меню.
Это оказывается можно выключить, если добавить скрытый недокументированный параметр "CACHE_SELECTED_ITEMS" => "N"
<?$APPLICATION->IncludeComponent("bitrix:menu", "top", Array(
"ROOT_MENU_TYPE" => "top", // Тип меню для первого уровня
"MENU_CACHE_TYPE" => "A", // Тип кеширования
"MENU_CACHE_TIME" => "3600", // Время кеширования (сек.)
"MENU_CACHE_USE_GROUPS" => "N", // Учитывать права доступа
...
"CACHE_SELECTED_ITEMS" => "N", // Не создавать кеш меню для каждой страницы
),
false
);?>
но из за незнания этих особенностей все сайты на Битрикс (даже самые простые) где много страниц - могут занимать Гигабайты (причем большую часть места занимает именно кеш).
Если добавить этот параметр - то тогда для меню создается всего один файл кеша для всех страниц сайта.
Но если оставить как есть по умолчанию - то ваше меню будет разрастаться и распухать как на дрожжах, так как при каждом посещении новой страницы (при каждом разном $APPLICATION->GetCurPage() ) ваш кеш будет пухнуть.
Например, даже если у вас в меню всего 5 страниц, но зато 1000 товаров, то кеш меню создастся 1000 раз.
Зачем так мучать сервер? Выключите, пожалуйста, этот параметр по умолчанию, или добавьте константу которая будет эту штуку отключать, или хотя-бы вынесете в параметры меню, чтобы можно было отключать ее одним кликом мышки.
Предлагаю реализовать функционал триггера для инвалидации тегированного кеша при наступлении даты/времени в свойстве типа дата/время с установленной галочкой "Инвалидация кеша"
Это необходимо для реализации всевозможных акций которые стартуют с определённого времени. Ну и ещё можно для чего либо использовать)
В стандартных компонентах к параметрам кеширования CACHE_TYPE CACHE_TIME CACHE_GROUPS
добавить еще один параметр CACHE_PARAM
в который можно записывать произвольные данные (число, строка) и будет изменяться идентификатор кеша компонента. Для чего это можно использовать: например, полностью устраивает компоннет bitrix:catalog.element, но нужно чтобы в зависимости от выбранного параметра на странице этот компонент (через логику result_modifier) выбирал или обрабатывал дополнительные данные.
Если компонент работает в режиме автокеширования, то какие бы мы параметры адресной строки не меняли, кеш будет один и тот-же, до тех пор пока мы не изменим входные параметры компонента.
Чтобы не создавать дополнительные параметры для этого случая, было бы удобно, чтобы был стандартный зарезервированный параметр CACHE_PARAM, в который можно поместить какие-то данные, и идентификатор кеша изменился бы.
Очень часто нужно подключить другой компонент в шаблоне одного компонента, и чтобы не городить костыли, удобно было бы иметь штатную возможность включать или выключать функционал кеширования шаблона.
Сделать обертку над функцией GetCurPageParam, которая бы автоматически удаляла из генерируемого урла такие параметры, как show_page_exec_time, bitrix_include_areas, clear_cache, и прочие стандартные переменные Битрикс.
Кому и зачем нужно
Разработчик заходит на страницу и сбрасывает кеш через clear_cache. Весь кеш удаляется и генерируется заново. Если компоненты выводили ссылки с помощью GetCurPageParam, и там не прописано удаление переменной clear_cache, эта переменная попадает в ссылку и ее увидит каждый пользователь на сайте. Решения три - сбрасывать кеш только в админке - каждый раз писать, чтобы GetCurPageParam удаляла clear_cache - сделать обертку над GetCurPageParam, которая будет это делать сама, и вызывать уже ее.
Часто кастомизация компонента (копирование в свое пространство имен и дальнейшая модификация) делается ради пары-тройки строк кода, которые добавляют в ключ кеша некоторые дополнительные параметры. Предлагаю избавить нас всех от этих мучений. Каким образом? Предлагаю ввести в параметры компонента настройку, назовем ее CACHE_KEYS - множественное поле типа "строка". В ней разработчики будут, так же как в параметре FILTER_NAME, прописывать ИМЯ переменной. В самом компоненте значения будут вытаскиваться из этих переменных и передаваться в метод StartResultCache. Избежать всеобщей модификации всех компонентов можно, если добавлять параметр CACHE_KEYS автоматически всегда, когда включено кеширование, а перед вызовом компонента добавлять значения в глобальные переменные, откуда и доставать внутри метода StartResultCache.
Что бы кеш шаблона компонента формировался с учетом значений дополнительных переменных. Например при смене города на сайте добавляется переменная $_REQUEST["CITY_CODE"], в зависимости от значений которой и выводился бы кеш шаблона компонента.