Менеджер по работе дает нам систему планирования — каким-то образом для хранения рабочих мест, пока они не должны быть запущены — и бегун — некоторый инструмент для запуска рабочих мест. WordPress’ wp’cron вроде подходит этому описанию. Тем не менее, с помощью WP-Очередь, я обнаружил, что соответствует моим потребностям лучше.
WP-Очередь
Пакет WP-Очередь отлично подходит для нескольких реаонов. Во-первых, это то, что задания абстрагируются от бегуна и планировщика. Я могу написать класс работы и протестировать его как единицу в изоляции. Во-вторых, планировщик заданий абстрагируется. По умолчанию, задания регистрируются в базе данных WordPress, а затем, когда они необходимы, они запланированы с wp’cron. Но я также могу использовать драйвер разработки, который делает их синхронными и есть драйвер Redis в процессе. Так что давайте начнем.
Настройка
Библиотека WP-Очередь — это пакет композиторов. Во-первых, установите пакет в плагин:
Для планировщика необходимо добавить таблицы баз данных. Readme для пакета имеет инструкции. Добавьте это к крючку активации вашего плагина или везде, где вы добавляете свои собственные таблицы.
Создание рабочих мест
Если вы когда-либо использовали очередь задания Laravel, структура класса «WP»Очередь и работа будет знакома. Ваш класс работдолженец должен иметь метод ручки() Этот метод вызывается при запуске задания. Вы, вероятно, будет иметь метод «конструкт() также.
Ключевая концепция, чтобы понять об этих классах является то, что свойства класса сериализуются в базу данных, когда задание запланировано и используется для мгновенного класса, когда он запущен.
Например, предположим, что вы хотели создать задание для выполнения всякий раз, когда публикация сохраняется. В методе «Конструкт»() вы передаете идентификатор публикации и используете этот аргумент для установки свойства. При запуске метода обработки этого свойства будет установлено с идентификатором публикации. В методе обработки можно использовать это свойство — сохраненный идентификатор публикации, сохраненный с помощью задания, — чтобы получить сохраненную публикацию из базы данных. Вот как это выглядит:
Копирование JSON сообщение в файл, когда он сохраняется
То, что мы сделали до сих пор это работа, которая получает сообщение из базы данных. Это круто, мы могли бы начать бегун, запланировать эту работу для выполнения каждый раз, когда сообщение сохраняется, и сделать эту работу получить сохраненный ответ REST API публикации и записать его в файл JSON. Давайте работать через этот список назад.
Почему этот заказ? Это последнее требование будет один класс, который я могу проверить в изоляции, и если он работает, то я могу настроить бегун и подключить сярприг действий, зная, что работа работает. Если бы я сделал это наоборот, я бы не знаю, если моя проблема была работа, или очереди. Это плохая наука.
Написать сообщение JSON в файл
Давайте продолжать работать на нашем классе работы. У нас есть все, что нужно, чтобы получить сообщение. Мы должны получить ответ объекта, что WordPress REST API будет создавать для поста, сериализировать его json и написать, что JSON в файл.
Я написал пост для крутящего момента некоторое время назад о том, как получить сообщения от WordPress REST API без предоставления запросов HTTP. Я украл большую часть этого кода оттуда:
Это полная работа. Я использовал пост-контроль WordPress REST API для создания WP-REST-Ответ и использовал json-encode () чтобы сделать его строкой и сохранил его в файл, названный в честь почты пули.
Где вы хранили файл и как вы его называете, зависит от ваших потребностей.
Прямо сейчас, мы можем мгновенно этот класс, чтобы проверить, если он работает. Мы можем запустить его непосредственно с чем-то вроде этого, где $postId был идентификатор опубликованного поста:
Затем вы должны увидеть в пути, который вы установили для написания файла, файл с JSON представление публикации. Мы также можем написать тест на интеграцию для него:
Планирование выполнения задания при обновлении публикации
Теперь, когда мы знаем, что наша работа будет работать, если она была запланирована для запуска, мы должны запланировать его для запуска, когда сообщение сохраняется. Действия «Сохранение» сравняют при сохранении публикации, так что мы можем использовать его. В функции обратного вызова мы мгновенно умрём класс задания и перейдем его на wp-queue()-gt;push().
Этого достаточно, чтобы запланировать его для запуска, как можно скорее.
Задержка выполнения задания
Вторым аргументом метода push() является время задержки выполнения задания. Последний пример кода не использовал этот аргумент. Задание будет запущено, как только очередь дойдет до него. Если бы мы хотели отложить его на 5 минут, мы могли бы пройти 600 — 5 минут в секундах — в качестве второго аргумента.
Настройка Бегун на работу
Последний шаг: нам нужно настроить очередь для запуска. Мы можем запустить очередь с помощью wp’cron:
Когда вы делаете локальную разработку, лучше использовать драйвер «синхронизации», а не драйвер базы данных, чтобы рабочие места запускать синхронно, IE сразу. Это упрощает тестирование.
Использование без WP-CRON
Я не собираюсь перечислять многие недостатки wp’cron. Но, что действительно здорово о WP-Очередь я могу настроить свою собственную систему для запуска его. Для оптимального perfomance, я не хочу полагаться на WordPress, чтобы вызвать wp’cron, и я не хочу, чтобы добавить больше «крон» рабочих мест в свою очередь. Вместо этого я предпочел бы добавить конечную точку REST API и пинг ее с внешним заданием cron, например, один запуск с setCronJob.com или что-то.
Мы можем получить доступ к очереди с функцией wp’queue(). Это возвращает объект Очереди с общедоступным методом под названием «Работник». Это возвращает объект «Рабочий» с помощью метода процесса () , который будет работать одно задание, если какие-либо задания доступны для обработки. Мы можем использовать цикл времени для выполнения заданий до тех пор, пока процесс не вернется ложным, и использовать приравливание целым, чтобы сохранить цикл от запуска слишком много запросов:
В этом примере я подключаю его к маршруту REST API, что позволит внешнему службе cron вызвать очередь. Вы управляете сервером, было бы наиболее безопасным, чтобы вызвать эту функцию с реальным cron или команды, которые могут быть запущены только изнутри сервера / контейнера. Если это невозможно, при публичной/секретной проверке подлинности ключей или что-то в этом роде.
Источник: torquemag.io