Как реализовать фоновую обработку в плагинах и темах WordPress?

С ростом масштабов WordPress-сайтов увеличивается и сложность задач, которые эти сайты должны выполнять, что зачастую приводит к серьезному потреблению ресурсов или чрезмерной трудоемкости. В частности, я говорю о задачах, которые не должны немедленно выполняться сразу после пользовательского запроса. К таким задачам относится отправка email, вызовы API, а также запросы к базе данных. Ведь последняя вещь, с которой вы хотите столкнуться – это ожидание загружающейся страницы. Именно по этой причине мы должны отложить такие задачи и обработать их в фоновом режиме.

processing

WordPress Cron

Большинству придет в голову идея реализации этого в WordPress через планировщик cron, который используется в ядре для преодоления таких проблем. В своем посте для WordPress 4.3 Бун указывал на необходимость разделения расшаренных термов таксономий и описывал сложности, с которыми можно было столкнуться во время процедуры обновления движка. Решение состояло в том, чтобы использовать wp_schedule_single_event и обрабатывать небольшие наборы из 10 таксономий за один проход. Этот процесс повторялся каждые две минуты, вследствие чего все таксономии были обработаны.

Однако в таком подходе имелся и свой недостаток – низкая эффективность. Если у нас будет 1000 элементов, и мы будем обрабатывать по 10 элементов каждые две минуты, вся процедура обновления займет три часа, что вряд ли можно назвать приемлемым решением. Также можно предположить, что сайт имеет постоянный трафик, или на сайте уже сконфигурирована реальная задача cron. Простое повышение пакетного лимита – не самый лучший выход, поскольку это может привести к перебоям в работе на виртуальных хостингах. Как же решить эту проблему?

WP Background Processing

WP Background Processing – это библиотека, которая была создана для преодоления проблем с использованием cron WordPress. Она представляет собой систему очередей, напоминающую аналогичные системы, реализованные в PHP-фреймворках, таких как, к примеру, Laravel. WP Background Processing не имеет зависимостей или требований. Библиотека запускается на PHP 5.2, что делает ее идеальным вариантом для использования в коммерческих плагинах. Фактически библиотека WP Background Processing основана на системе, используемой в WP Offload S3 Pro, что позволяет выполнять поиск и замену в базе данных, никоим образом не влияя на пользовательский опыт взаимодействия.

Каким образом мы можем создать систему очередей, которая будет эффективной, надежной и совместимой с минимальными системными требованиями WordPress?

Во-первых, в библиотеке отсутствует привязка к пакетным лимитам. В каждом пакете будут обрабатываться элементы, не «съедая» память PHP, и общее время выполнения не превысит 20 секунд. Большинство хостингов (особенно виртуальные) имеют максимальное время выполнения, равное 30 с, поэтому 20-секундный лимит позволяет завершить обработку пакетов до таймаута.

Мы не используем cron WordPress для реализации очереди. Вместо этого мы используем неблокирующие асинхронные запросы, которые были популяризованы командой TechCrunch. Когда пакет достигает либо максимума памяти PHP, либо таймаут-лимита, он сохраняет состояние очереди и немедленно запускает выполнение следующего пакета. Это позволяет полностью отказаться от ожидания, которое имеется в cron, что дает возможность выполнить 9 пакетов вместо одного.

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

Чтобы убедиться в том, что обработчик очереди доступен при существовании элементов очереди, мы автоматически планируем проверки жизнеспособности, основанные на Cron WordPress. Если по каким-либо причинам обработчик очереди умрет, проверка жизнеспособности перезапустит очередь, и обработка продолжится с момента смерти обработчика. Такие проверки выполняются каждые 5 минут (предполагая, что cron правильно настроен или сайт получает регулярный трафик).

Давайте рассмотрим пример.

Пример использования WP Background Processing

Я написал простой плагин, который показывает то, как работает фоновая обработка. Плагин вносит в специальный лог случайные имена, сопровождаемые Lorem Ipsum, что генерируется при помощи запроса к loripsum.net API. Чтобы имитировать длительный процесс выполнения, он останавливается на 5 секунд перед обработкой элемента очереди.

background-processing

Щелчок по ссылке All Users помещает 20 рандомных имен в очередь, после чего сразу же начинается их обработка.

debug-log

Записи будут появляться в файле debug.log примерно каждые 5 секунд, и этот процесс будет продолжаться до тех пор, пока очередь не станет пустой.

Я не буду приводить код в данной статье. Все интересующиеся могут воспользоваться файлом README.md, в котором содержится информация о том, как зарегистрировать новые очереди.

Дальнейшие улучшения

WP Background Processing работает с минимальными требованиями WordPress, однако имеются некоторые улучшения, которые могут быть сделаны, если вы имеете контроль над хостинг-средой. Текущая реализация сохраняет элементы очереди в базу данных, что не является самым эффективным методом хранения данных очереди. Вместо этого вы можете хранить данные в памяти, используя Redis или Memcached. В качестве альтернативы вы можете вынести ваши данные очереди в сторонний сервис, такой как Amazon SQS или Iron.io. Все эти варианты являются вполне жизнеспособными и будут рассмотрены в будущих записях.

Сталкивались ли вы с подобными проблемами в прошлом? Расскажите нам, как вы преодолели это.

Источник: deliciousbrains.com

Блог про WordPress
Комментарии: 4
  1. Кирилл

    У меня таких проблем не было, но все равно приятно, что вордпресс не стоит на месте, а развивается и придумывает новые интересные решения возникающих задач. Спасибо за статью, полезный материал.

  2. Алексей

    Давно работаю на Joomla, решил немного оценить WordPress.
    Радует, что разработчики бесплатных CMS, постоянно улучшают
    свои «движки».Спасибо, за статьи о WordPress, хочу создать блог,
    буду тестировать.

  3. vidos

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

  4. Арсений Локов

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

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

Получать новые комментарии по электронной почте.