Оптимизация WordPress путём кэширования переводов

API интернационализации i18n в WordPress реализован очень неэффективено.

Хотя файлы перевода и хранятся в форматах PO / MO и могут быть распаршены обычным gettext, но по факту WordPress использует свою собственную реализацию gettext под названием POMO, полностью написанную на PHP.

Это связано с тем, что модуль PHP gettext по умолчанию не встроен в PHP, поэтому на многих серверах его просто не будет.

Поскольку реализация gettext на чистом PHP в несколько раз медленнее, чем реализация на основе модуля, было предпринято несколько попыток для поддержки реализации на основе модулей.

Но ни одна из них не была добавлена в ядро WordPress, так как оказалось, что существуют серьезные различия между нативной/модульной реализацией и библиотекой POMO, включенной в WordPress.

Откуда берутся тормоза?

Каждая тема, плагин и само ядро загружают свои скомпилированные языковые пакеты при помощи функции load_plugin_textdomain, которые анализируются и загружаются в память. Эти операции занимают совсем немного времени.

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

Более того, выше указанные процессы происходят во время загрузки всех активных плагинов, поэтому ядро подтягивает абсолютно все строки в память, которые могут ему понадобиться в будущем. А, как известно, ленивой загрузки ядром не предусмотрено.

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

Как с этим бороться

Многие разработчики пытались бороться с этой проблемой при помощи кэширования декомпилировнных данных переводов в менее ресурсоёмких форматах: серилизация PHP или JSON, которые являются нативными и работают намного быстрее, чем библиотека POMO.

Все эти попытки давали прирост примерно в 20-30%, что уже совсем неплохо.

Так родилась библиотека pomodoro, название которой происходит от слияние двух слов POMO и d’Oro – золотой кэшер для POMO.

Для ее использования достаточно скопировать файл pomodoro.php из официального репозитория проекта на GitHub в папку вкраплений (необходимых плагинов) /wp-content/mu-plugins/ на вашем сервере. И плагин сразу начнёт работать.

Возможные проблемы

  • Отсутствие opcache. Без него работать будет на 50% медленнее
  • Использование pomodoro вместе с плагином Loco Translate может привести к непредвиденным результатам в некоторых редких случаях.
  • Папка временных файлов на сервере может быть защищиена от чтения/записи или закрыта через open_basedir.
  • В очень редких случаях (один на миллион, когда кончается дисковое пространство) при возникновении фатальных ошибок весь сайт падает с синтаксической ошибкой.

Ссылки

Optimization performance Translations WordPress

Источник: https://www.kobzarev.com/wordpress/pomodoro-cache/

Михаил Кобзарёв

Суровый русский тимлид. Жил в Магадане, в офисе московских веб студий и в Тульской деревне. Виртуозно знает WordPress, PHP, ООП, Vue.js и вот это вот все. Делает крутые высоконагруженные сайты, поэтому уже почти захватил весь рынок WordPress разработки в России. Не дает никому делать сайты без спроса. Ведет блог о разработке, дайджест в телеграмме и в ВК. Любит сиськи, баню и радиоэлектронику. 100% патриот (но это не точно). Тролль 542 уровня. Ездит в отпуск раз в 5 лет.

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

%d такие блоггеры, как: