Перейти к содержимому

Настройка не применяется - разбор причин

Значение в настройках поменяли, а поведение прежнее. Разбираем причины по убыванию частоты, начиная с того, откуда код вообще берёт это значение.

С чего начать

Печатаем значение так, как его видит код:

var_dump(\Bitrix\Main\Config\Configuration::getValue('cache'));
var_dump(\Bitrix\Main\Config\Option::get('main', 'captcha_registration'));
var_dump(defined('BX_COMP_MANAGED_CACHE')); // константы задаются третьим местом
// первое приходит из файлов настроек, второе - из базы, и это разные источники

Значение из файла и значение из опции модуля живут в разных местах. Пока не видно, какое из двух читает код, правка идёт наугад и в половине случаев уходит не туда.

Ищем, где это значение вообще задаётся:

Окно терминала
grep -rn "'cache'" /home/bitrix/www/bitrix/.settings.php \
/home/bitrix/www/bitrix/.settings_extra.php /home/bitrix/www/bitrix/php_interface/dbconn.php
# дополнительный файл настроек перекрывает основной, а не дополняет его молча

Дополнительный файл настроек перекрывает основной по тем же ключам. Правка в основном файле при этом выглядит сделанной, а работает по-прежнему значение из перекрывающего файла.

Смотрим опцию по сайтам:

foreach (['s1', 's2'] as $siteId) {
printf("%s = %s\n", $siteId, \Bitrix\Main\Config\Option::get('sale', 'expiration_processing_events', '', $siteId));
}
printf("общее = %s\n", \Bitrix\Main\Config\Option::get('sale', 'expiration_processing_events'));
// опция бывает задана для одного сайта, а проверяют её на другом

Проверяем, не закрыта ли секция от правок:

$section = \Bitrix\Main\Config\Configuration::getInstance()->get('connections');
var_dump(isset($section['readonly']) && $section['readonly'] === true);
// секция только для чтения не меняется во время работы скрипта

Сбрасываем кэш после правки:

Окно терминала
php -r 'require $_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php"; BXClearCache(true);'
# значение могло попасть в кэш страницы или компонента вместе с разметкой

Причины

  1. Правка ушла в перекрытый файл настроек примерно 25% случаев

    ПризнакВ основном файле значение новое, а код продолжает работать со старым.

    ПроверкаИщем ключ во всех файлах настроек проекта, включая дополнительный и файл подключения к базе.

    Что делатьПравим значение в том файле, который перекрывает остальные, и убираем дубли ключа.

  2. Значение читается из опции, а правили файл примерно 20% случаев

    ПризнакПравка в файле настроек не даёт эффекта, а в админке значение другое.

    ПроверкаПечатаем и значение из файлов настроек, и значение опции модуля рядом.

    Что делатьМеняем настройку в том хранилище, откуда её действительно читает прикладной код.

  3. Опция задана для другого сайта примерно 15% случаев

    ПризнакНа одной витрине многосайтовой копии настройка работает, на другой - нет.

    ПроверкаПечатаем значение опции по каждому идентификатору сайта в отдельности.

    Что делатьЗадаём опцию нужному сайту: значение по умолчанию не заменяет настройку конкретной витрины.

  4. Старое значение осталось в кэше примерно 15% случаев

    ПризнакНастройка применилась в админке, но витрина показывает прежнее поведение.

    ПроверкаПроверяем поведение на странице с выключенным кэшем или сразу после его сброса.

    Что делатьСбрасываем кэш компонентов и страниц, а на композитном сайте ещё и кэш готовых страниц.

  5. Секция настроек закрыта для правок примерно 15% случаев

    ПризнакИзменение значения из кода проходит без ошибок и никак не влияет на работу.

    ПроверкаСмотрим признак только для чтения у нужной секции файла настроек.

    Что делатьПравим значение в самом файле настроек, а не пытаемся подменить секцию во время работы.

  6. Правка не доехала до нужного стенда примерно 10% случаев

    ПризнакНа стенде всё работает, на боевом сайте настройка выглядит нетронутой.

    ПроверкаСверяем значение на обоих стендах одной командой печати из консоли.

    Что делатьПереносим настройку на боевой сайт: файлы настроек обычно не версионируются и не выкладываются.

Частые вопросы

Где вообще хранятся настройки платформы?

В файлах настроек проекта и в опциях модулей внутри базы. Первое читается до подключения базы, второе правится из административного раздела.

Зачем нужен дополнительный файл настроек?

Он держит отличия конкретного стенда: свои реквизиты, отключённый обмен, тестовые ключи. Основной файл при этом одинаков на всех стендах.

Почему настройку нельзя менять во время работы?

Секции с реквизитами закрывают признаком только для чтения. Это защита от подмены подключения чужим кодом прямо на запросе.

Как узнать значение опции по умолчанию?

Оно возвращается, когда значение не задано ни для сайта, ни глобально. В печати значения его видно сразу, если передать пустой сайт.

Нужно ли класть файлы настроек в репозиторий?

Нет, в них лежат реквизиты и ключи. В репозитории держат образец без секретов, а сами файлы переносят отдельно.

Смежное

Первоисточник