Drupal → Уменьшаем количество запросов при включённом модуле Locale

18.05.2010

Модуль Locale делает запрос к базе при каждом использовании функции t(). Есть способ избавиться от этих запросов, достаточно вынести часто используемые строки в файл settings.php. Например у меня это:

$conf['locale_custom_strings_ru'] = array(
    'Manage posts by content type, including default status, front page promotion, etc.' => 'Управление материалами по типам, включая значения по умолчанию, размещение на главной странице и т.д.',
    'Control posting behavior, such as teaser length, requiring previews before posting, and the number of posts on the front page.' => 'Настройка режима публикации: длина анонса, необходимость просмотра перед публикацией и количество сообщений на главной странице.',
    'Configure the number of items per feed and whether feeds should be titles/teasers/full-text.' => 'Настройка количества пунктов в RSS-ленте и их характер (заголовки, анонсы, полный текст).',
    'Get a status report about available updates for your installed modules and themes.' => 'Показывает отчет о доступных обновлениях для модулей и тем.',
    'Configure what block content appears in your site\'s sidebars and other regions.' => 'Настройка расположения содержимого блоков в боковых колонках и других областях сайта.',
    'Control your site\'s navigation menu, primary links and secondary links. as well as rename and reorganize menu items.' => 'Управление навигационным меню вашего сайта, основными и дополнительными ссылками. Например, переименование или упорядочивание пунктов меню.',
    'Settings for how Drupal displays date and time, as well as the system\'s default timezone.' => 'Выбор способа отображения даты и времени, а также системного часового пояса по умолчанию.',
    'Control how Drupal deals with errors including 403/404 errors as well as PHP error reporting.' => 'Настройка обработки ошибок сервера 403/404 и ошибок интерпретатора PHP.',
    'Configure how content input by users is filtered, including allowed HTML tags. Also allows enabling of module-provided filters.' => 'Настройка фильтрации текста присылаемых пользователями материалов, например, разрешение вставки в текст тегов HTML или PHP кода. Также позволяет подключать фильтры, предоставляемые модулями.',
    'Settings for logging and alerts modules. Various modules can route Drupal\'s system events to different destination, such as syslog, database, email, ...etc.' => 'Настройки для модулей отчетов и сообщений. Различные модули могут записывать системные события Drupal в разные места, такие как системные логи, почта, и т.д.',
    'Settings for logging to the Drupal database logs. This is the most common method for small to medium sites on shared hosting. The logs are viewable from the admin pages.' => 'Настройки хранения отчётов в базе данных. Это наиболее популярный метод для небольших сайтов, располагающихся на shared-хостинге. Все отчёты доступны на страницах административного раздела.',
    'Enable or disable page caching for anonymous users and set CSS and JS bandwidth optimization options.' => 'Включение/выключение кеширования для анонимных пользователей, а также включение/выключение препроцессора CSS.',
    'Change basic site information, such as the site name, slogan, e-mail address, mission, front page and more.' => 'Изменение основной информации о сайте, такой как название сайта, слоган, адрес электронной почты, миссия, главная страница и прочее.',
    'Configure the submission settings of the XML sitemap to the search engines.' => 'Конфигурация XML карты сайта, для поисковых систем.',
    'List and create rules to disallow usernames, e-mail addresses, and IP addresses.' => 'Список и создание шаблонов нежелательных имён пользователей, электронных почтовых ящиков и IP адресов.',
    'Configure default behavior of users, including registration requirements, e-mails, and user pictures.' => 'Настройка требований к пользователям, включая правила регистрации, сообщения по электронной почте и пользовательские изображения.',
    'You can enable syntax highlighting of source code with the following tags: !tags.' => 'Подсветка кода осуществляется с помощью тегов: !tags.',
);

Минус 17 запросов под администратором.

Посмотреть список строк, нуждающихся в переводе, можно с помощью модуля Devel:

Список запросов

Сами переводы ищутся на странице admin/build/translate/search

Написанное актуально для
Drupal 6.x
Похожие записи

Комментарии

Петров Николай
27.01.2011, 16:39

Прекрасный способ.

А если при обновлении ядра (или модуля) исходный текст строки поменяется, нужно будет ведь эту строку заново править в файле settings.php?

У меня -16 запросов, правда все из них были по 1мс. Но я понимаю что не только время важно но и то что ПХП не вызывает эти функции и память жрется меньше ну и вообще ресурсы на каждом шаге выполнения запроса.

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

Ну а для сайтов где регятся юзеры (и юзер-интерфейс на русском необходим) конечно, это - превосходное решение!

Спасибо еще раз :)

нужно будет ведь эту строку заново править в файле settings.php?

разумеется, но это происходит не так часто

Тут подумал что если админку вижу только я, то можно вообще отключить модуль locale

locale один из самых прожорливых модулей, поэтому если есть возможность от него отказаться, то стоит ей воспользоваться =)

Петров Николай
27.01.2011, 17:44

Возникла проблема с фразами, содержащими экранированные двойные кавычки:

You can create new profiles using the add profiles tab or by checking the \"Save these settings\" button on the advanced backup page.

Победить запросы с такими фразами мне пока не удалось (их нашел пока 4 штуки).

Сделал экспорт базы (там BLOG, через PMA не удалось посмотреть исходник фразы), взял оттуда - ничего. Пробовал заменить символы кавычек и слешей, введя с клавиатуры, тоже не алё.

(это фразы из модулей Devel и Backup and Migrate)

Где тут могут быть подводные камни?

Отключить модуль locale это хорошо, и наверное на сайте где пишу только я - так и сделаю, но на текущем проекте не представляется возможным, т.к. это закрытый корпоративный вики-портал, на ней тока для зарегленых доступ...

You can create new profiles using the add profiles tab or by checking the \\"Save these settings\\" button on the advanced backup page.

? можно без слэшей попробовать. ещё теоретически кавычки могут идти как ". в своём Backup and Migrate такой строки не нашёл. Ещё в начале или в конце может пробел идти, такой баг в Admin menu был

Петров Николай
27.01.2011, 18:38

в своём Backup and Migrate

может я ошибся, или у меня старая версия перевода.

Вообще, перед тем как описать что я пробовал, нужно сделать одну поправку. Сайт над которым я провожу данные эксперименты стоит на локалке (win7 64bit), поэтому в косяках с запросами, кодировкой и прочих чудесах можно заподозрить именно ее, и денверовский сервер.

Перепробовал все - ", двойное экранирование, без слешей вообще, одинарные кавычки и т.д. Поменял кодировку в settings.php на UTF without BOM - не помогло.

Да и ладно, фиг с ним с этим багом, может на продакшн-сервере заработает, проверю когда перенесу.

Единственное что меня удивило, та это то что данный запрос:

SELECT s.lid, t.translation, s.version FROM locales_source s LEFT JOIN locales_target t ON s.lid = t.lid AND t.language = 'ru' WHERE s.source = ' Queries taking longer than @threshold ms and queries executed more than once, are <span class=\"marker\">highlighted</span>.' AND s.textgroup = 'default'

идет явно с пробелом в начале. Я сделал экспорт БД, (как я уже говорил строка хранится в BLOB, и в PMA ее не посмотреть) и посмотрел эту строку, и она там БЕЗ ПРОБЕЛА. Странно, подумал я. Выполнил этот запрос с пробелом во вкладке SQL (PMA), запрос вернул один результат - ок. Убрал пробел - опа, запрос вернул пустой результат!

Ну и ладно, это сейчас не так критично, просто интересно из принципа где косяк, в винде, в денвере или в друпале.

Петров Николай
27.01.2011, 18:56

Так что будем ждать новых заметок о «массовом уничтожении лишних запросов к БД»

Петров Николай
29.01.2011, 18:14

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

Вопрос: есть-ли какой-нибудь более-менее адекватный способ переводить выборочно ну штук 10-15 строк из интерфейса без включения этого модуля? Имею ввиду только те строки, которые видит зарегистрированный пользователь.

Петров Николай
08.04.2011, 15:27

Вроде подразобрался.

Ну, как выяснилось l10n client (localization client) как раз требует включения модуля Locale. Из чего я сделал вывод что данный модуль точно так-же все строки хранит в базе и точно так-же на каждый вызов функции t() делает один запрос. По сути отличие Live Translation от Localization client как я понял в том, что первый массово умеет качать новые (или обновленные) строки с сервера переводов, а второй предоставляет удобный интерфейс для перевода любых строк но в ручную, без оглядки на чьи-то переводы. Но и в том и в другом случае модуль Locale обязателен.

В итоге пришел к такой схеме:
1. сначала переводим все нужные модули с помощью Live Translation (под нужными подразумеваю те, с которыми будет взаимодействовать юзер)

2. отключаем нафик этот модуль чтоб не жрал ресурсов

3. наполняем массив $conf['locale_custom_strings_ru'] строками из Devel query log, как описано в данной статье.

Можно попытаться перевести весь интерфейс хуками, тогда действительно можно не включать модуль Locale... ну это только если интерфейс небольшой (2-3 формы на весь сайт) и если разобраться как переводить заголовки страниц, и надписи в табах - то это тоже вариант.

С хуками форм я разобрался, для переводов заголовков вроде придумал свой костыль, а вот как перевести табы пока не допер, поэтому пока использую Locale + хак данного поста

а вот как перевести табы пока не допер

текст из таб автоматом проходит через t()

Петров Николай
08.04.2011, 15:44

я имел ввиду что пока не знаю "как перевести табы с выключенным Locale".
Конечно, если включить локаль, это все легко переводится через t(), но если его выключить - t() ничего не будет переводить, оставляя оригинальную строку, которая была скормлена этой функции.

hook_menu_alter($items) {
  $items['tab/path']['title'] = 'new title';
}
Гость
30.09.2012, 19:05

Сразу не включал locale модуль,
включил в $conf['locale_custom_strings_ru'] = array(... - пару нужных строк...

И вместо русских слов - совсем пусто или пустые квадратики!

Причем для message area - пропадают и англ.соседние текстовки, если хотя бы в одном из сообщений появляется одна! русская буква...

Где и что хакнуть, чтобы Д6 выводил бы нормально русские тексты?
А locale модуль вроде и вовсе мне не нужен, переводов очень мало.

возможно сохранили файл в неправильной кодировке

Гость
01.10.2012, 10:53

Благодарю! Сохранил файл settings.php как UTF8 и всё путем!

Гость
01.10.2012, 11:27

Да, исправьте вверху:
не: $conf['locale_custom_strings_ru'] = array(
а: $conf['locale_custom_strings_en'] = array(

@Гость, вы видимо оставили дефолтным языком английский, поэтому у вас и $conf['locale_custom_strings_en']

Гость
01.10.2012, 13:14

Так у меня нет и не был включен модуль locale (ведь он совсем не нужен!), потому язык только один - EN

Гость, вы заголовок внимательно читали?
>Уменьшаем количество запросов при включённом модуле Locale

Гость
27.12.2012, 12:01

Да, но ИТОГО Смысл такой:
при включённом модуле Locale - все ОК
Но еще круче - без модуля Locale
(и тогда: $conf['locale_custom_strings_en'] вместо $conf['locale_custom_strings_ru'])

Я вообще хочу написать парсер .po файла, чтобы из него в собирать строки в php код. Единственный вопрос как быть с числительными (1 кнопка, 2 кнопки, 5 кнопок)?

Гость
27.12.2012, 17:49

1 кнопка, 2 кнопки, 5 кнопок
- в друпале (Д6) кажется есть готовая функция на это, но не вспомню, где

- но хорошо ли раздувать $CONF очень сильно - спросите у корифеев

При использовании APC или eAccelerator это не играет роли, но позволяет существенно разгрузить сайт за счет уменьшения обращений к БД.

Гость
27.12.2012, 19:35

У модуля Locale есть плюс: можно ставить приоритетному синониму русский язык, и он станет главным синонимом.
Но м.б. лучше поставить Global Redirect и делать это через 301 (пока не пробовал).

Отпишитесь сюда о результатах, будет интересно узнать.

Гость
21.01.2013, 12:49

Есть строки которые без перевода, их не тянет из settings.php как быть с ними?

Гость
22.01.2013, 10:48

Приведите пример.
Такого не должно быть, друпалеры любят всё заключать в функцию t()

Гость
22.01.2013, 10:57

У меня сборка, очень много сделано с помощью CCK и View.
Я с помощью девела нахожу запрос locale "Управление смайлами и включение/выключение функционирования панели выбора смайлов для материалов и комментариев."
Добавляю его в settings:
Пробовал и так 'Управление смайлами и включение/выключение функционирования панели выбора смайлов для материалов и комментариев.'

И так: 'Управление смайлами и включение/выключение функционирования панели выбора смайлов для материалов и комментариев.' => 'правление смайлами и включение/выключение функционирования панели выбора смайлов для материалов и комментариев.',

Но в девале так и показывает этот запрос.

Гость
22.01.2013, 13:33

Так русская фраза - может быть любой, а вот на английском - точь в точь, как в пхп-файле, в функции t().
А вы все русские тексты приводите. Базовый язык для t() - только английский.

Гость
22.01.2013, 13:35

Русский перевод тоже тянет с базы, вот я и хотел в settings прописать что бы не тянул с базы лишние 10 запросов.

Гость
23.01.2013, 08:37

Вы меня не поймете.
Как правильно прописать русский текст который тянет с базы???, он без перевода.

>Как правильно прописать русский текст который тянет с базы???, он без перевода.
А такое бывает?

Все модули передают в функцию t() английские фразы и если локаль русская, то из базы по английской фразе подбирается русская фраза.

Михаил
23.01.2013, 12:12

Бывает, я у меня сборка друпал, очень много сделано с помощью CCK и Views

Ну так выносите views в код, там где t() от русских фраз, замените фразы на английские и уже в конфиге сделаете перевод...

Дмитрий
30.04.2013, 11:40

А есть подобное решение для семерки?

в семёрке проблемы нет, Locale кеширует данные

Дмитрий
30.04.2013, 12:34

то есть, если разработчик бд не трогал, то значит хостер хреновый

Работа админки, после отключения модуля Locale, просто молниеносна!!! Теперь буду разрабить только так.. Спасибо за инфу!

Добавить комментарий