Подсчёт использования фраз
Считает, в скольких файлах проекта встречается каждая фраза словаря. Запускается на экране Обслуживание, вкладка «Неиспользуемые фразы», шаг 1 «Подсчитать использование».
Как устроен прогон
Две фазы, обе — короткими шагами.
- Обход дерева. Каждый шаг просматривает не больше 40 файлов и не дольше 8 секунд, прибавляет найденное к счётчикам и запоминает, на каком файле остановился. Следующий шаг продолжает с этого места.
- Запись. Когда дерево пройдено, счётчики записываются в словарь пачками с курсором.
Промежуточное состояние хранится во временном файле, а не в сессии, и блокировка сессии освобождается сразу — другие вкладки админки не подвисают.
Раньше первый шаг обходил всё дерево проекта за один запрос и мог держать процесс PHP несколько минут. На большом проекте это упиралось в таймауты сервера, поэтому с 8.1.1 обход нарезан.
«Начать» заново — значит с нуля. Незаконченный прогон при повторном запуске не продолжается, а сбрасывается: иначе повторный клик дописал бы счётчики поверх старых, и каждая фраза посчиталась бы дважды.
Что именно ищется
Два набора образцов.
Вызовы модуля — Lang::get и LANG_VAR с кодом фразы в кавычках, с полным именем пространства имён и без него.
Штатные вызовы Битрикса — GetMessage, Loc::getMessage и прямое обращение к массиву сообщений.
Код длиннее 250 символов не учитывается. Файл с вхождением считается один раз, сколько бы раз фраза в нём ни встретилась.
Образцы ожидают одинарные кавычки вокруг кода; для двойных у вызовов модуля есть отдельная ветка.
Точка расширения
Если у вас своя обёртка над словарём, добавьте её образец в список образцов первого набора — метод CodeScanner::getPassAPatterns().
Без этого все фразы, выведенные через обёртку, будут числиться неиспользуемыми и попадать в кандидаты на удаление. См. Своя обёртка для переводов.
Исключения путей
Список исключённых каталогов лежит в сканере; обычно достаточно дописать туда свой путь.
Исключаются загрузки, кеш, каталоги зависимостей и сам модуль. Последнее существенно: внутри модуля кодов фраз много, и без исключения счётчики были бы завышены у всех служебных фраз.
Чего индексатор не может
Он читает текст файлов, а не выполняет их. Поэтому код фразы, собранный в программе из кусков, он не видит в принципе, и такие фразы всегда числятся неиспользуемыми.
Это не недоработка, а граница метода. Выполнять код проекта, чтобы узнать, какие фразы он позовёт, нельзя ни при каких обстоятельствах.