Queuety
Рушій робочих процесів WordPress.
wp plugin install https://github.com/inline0/queuety/releases/latest/download/queuety.zip --activateОстанній випуск v0.22.0 GPL-2.0-or-later WordPress 6.4+, PHP 8.2+
use Queuety\Queuety;
Queuety::register( 'send_email', SendEmailHandler::class );
Queuety::dispatch( 'send_email', [
'to' => 'user@example.com',
'subject' => 'Welcome',
'body' => 'Hello from Queuety!',
] );На практиці
Робочий процес, визначений у PHP, і команда обробника, що його запускає.
Робочий процес погодження
Робочий процес виконує крок, чекає 24 години, а потім призупиняється на wait_for_approval(), доки інший процес не надішле сигнал approval.
Затримка зберігається в базі даних, тож вона переживає перезапуски обробника й розгортання; ранній сигнал реєструється та обробляється, щойно робочий процес дійде до очікування. Скасування запуску викликає обробник on_cancel().
$workflow_id = Queuety::workflow( 'approval_flow' )
->then( SubmitRequestHandler::class )
->delay( hours: 24 )
->wait_for_approval()
->then( ProcessApprovalHandler::class )
->on_cancel( CleanupHandler::class )
->dispatch( [ 'request_id' => 99 ] );
// Later, from another process:
Queuety::signal( $workflow_id, 'approval', [ 'approved_by' => 'admin@example.com' ] );# Single worker on default queue
wp queuety work
# Process a specific queue
wp queuety work --queue=emails
# Process multiple queues in priority order
wp queuety work --queue=critical,default,low
# One-shot mode
wp queuety work --once
# Multi-worker mode
wp queuety work --workers=4
# Adaptive worker pool
wp queuety work --queue=providers --min-workers=2 --max-workers=6Пряме отримання завдань MySQL
Кожен обробник працює в довготривалому процесі WP-CLI і отримує завдання безпосередньо з MySQL за допомогою FOR UPDATE SKIP LOCKED.
Надійні робочі процеси
Багатокрокові процеси зі збереженням стану, що переживають тайм-аути PHP, збої та повторні спроби.
Автомати станів
Тривалий стан, що змінюється у відповідь на події, із Queuety::machine(): визначайте стани й переходи, надсилайте події та переглядайте хронологію.
Сигнали та погодження
wait_for_signal(), wait_for_approval() і wait_for_input() призупиняють робочий процес до надходження зовнішніх даних.
Рівні пріоритету
Чотири рівні: від низького до термінового. У межах черги завдання з вищим пріоритетом отримують першими.
Обмеження частоти
Ліміти для кожного обробника у ковзному вікні. Обробник, який отримав завдання з обмеженням частоти, повертає його в чергу й чекає.
Регулярні завдання
Планування за інтервалом і на основі cron. Вбудований парсер cron без зовнішніх залежностей.
Паралельні кроки
Виконуйте кроки робочого процесу паралельно й чекайте завершення всіх, перш ніж переходити далі.
Метрики та журналювання
Постійний журнал у базі даних із пропускною здатністю, середньою тривалістю, тривалістю p95 та частотою помилок для кожного обробника.
Резервний варіант WP-Cron
Якщо доступу до оболонки немає, подія WordPress cron, що запускається раз на хвилину, запускає одноразовий обробник для черги за замовчуванням.
Проміжне програмне забезпечення
Проміжне програмне забезпечення для завдань із послідовним ланцюжком обробки: обмеження частоти, стримування винятків, унікальність, тайм-аути та захист від одночасного виконання.
PHP 8.2+
Переліки, класи лише для читання, вирази match, автоматичне просування властивостей конструктора та атрибути PHP.
Чому Queuety
Стан зберігається в MySQL
Рядки черги, стан робочих процесів, журнали, сигнали й потокові фрагменти зберігаються в MySQL, тому після перезапуску обробника стан оркестрації не втрачається. На межі кожного кроку оновлення стану, завершення завдання та додавання наступного завдання фіксуються однією транзакцією.
Поза запитом сторінки
WP-Cron запускається лише під час відвідування сторінок, а 60-секундний виклик LLM переривається через 30-секундний тайм-аут PHP. Обробники Queuety працюють у довготривалому процесі WP-CLI й беруть завдання без очікування на трафік.
Обмеження для запусків агентів
for_each() із режимом кворуму, етапами погодження та такими обмеженнями, як max_transitions() і max_state_bytes(), тримають тривалі запуски агентів у визначених межах.
Можна використовувати поза WordPress
Ядро, що працює з базою даних, запускається в будь-якому процесі PHP, який може підключитися до тієї самої бази даних, тож інша програма може додавати завдання, надсилати сигнали й читати стан робочих процесів. Для тригерів дій, моста WP-Cron і команд WP-CLI все ще потрібен WordPress.
Порівняно з
Як Queuety співвідноситься з планувальниками та рушіями робочих процесів, які вже знають розробники WordPress.
| Інструмент | Переваги | Відмінність від Queuety |
|---|---|---|
| WP-Cron | ПеревагиВбудований у WordPress, він не потребує доступу до системного планувальника на спільному хостингу; завдання, що пропустило запланований час, виконається під час наступного завантаження сторінки, а не буде відкинуте. | Відмінність від QueuetyОбробники Queuety працюють незалежно від трафіку сайту й потребують довготривалого процесу wp queuety work. Міст WP-Cron перетворює регулярні події на розклади, але поки не запускає їхні обробники хуків, тому за них і далі відповідає WP-Cron. |
| Action Scheduler | ПеревагиСтворений для розповсюдження в плагінах і темах без потреби в доступі до сервера, він щомісяця обробляє мільйони платежів за підписками та вебхуки для WooCommerce, а також записує кожну дію в інтерфейс адміністратора. | Відмінність від QueuetyAction Scheduler запускає хук пізніше, наприклад як відкладений do_action(). Queuety додає багатокрокові робочі процеси зі станом, що зберігається між кроками, очікуванням на сигнали й погодження та автоматами станів; переглядати їх можна командами WP-CLI, зокрема wp queuety workflow timeline. |
| Temporal | ПеревагиПлатформа надійного виконання: журнал подій записує кожен крок робочого процесу, тож після збою чи перебою запуск поновлюється з останньої записаної події; Temporal Cloud пропонується як альтернатива самостійному хостингу сервісу. | Відмінність від QueuetyСервіс Temporal — це сервер Go та база даних, що працюють поруч із вашою програмою. Queuety зберігає стан у таблицях MySQL через підключення до бази даних WordPress, а обробники запускає за допомогою WP-CLI. |
Запитання та відповіді
Короткі відповіді з документації Queuety.
Для простих завдань у черзі за замовчуванням — ні. Плагін щохвилини запускає одноразовий обробник через WordPress cron, якщо спрацьовує WordPress cron; за один запуск він обробляє одне завдання. Для регулярного планування, власних черг і меншої затримки потрібен окремий процес wp queuety work.
Ні. Йому потрібен або mysqli, або pdo_mysql; за замовчуванням у WordPress використовується mysqli. Щоб примусово вибрати драйвер, задайте QUEUETY_DB_DRIVER значення auto, mysqli або pdo.
Завдання отримуються за допомогою SELECT ... FOR UPDATE SKIP LOCKED, який підтримується в MySQL від версії 8.0, а в MariaDB — від 10.6. CI проєкту запускається на MySQL 8.0.
Так, ядро, що працює з базою даних: завдання, обробники, робочі процеси, сигнали, автомати станів, артефакти, журнали, метрики й розклади працюють із прямим підключенням Connection. Для пулів обробників також потрібні константи DB_HOST, DB_NAME, DB_USER і DB_PASSWORD. Queuety::on_action(), replace_wp_cron(), початкове налаштування плагіна й команди wp queuety усе ще потребують WordPress.
Поки що ні. Queuety::replace_wp_cron() перетворює регулярні події wp_schedule_event() на розклади Queuety, але поки не запускає їхні обробники хуків, тож залиште WP-Cron для подій, які мають спрацьовувати. Події від wp_schedule_single_event() залишаються за WP-Cron.
wp queuety work --workers=N розгалужує фіксований пул і перезапускає аварійно завершені дочірні процеси; для цього потрібні розширення pcntl і posix. --min-workers і --max-workers запускають адаптивний пул, який збільшується за накопичення черги й скорочується, коли завдань стає менше.
Установіть плагін, запустіть обробник і перегляньте посібники: від першого завдання до робочих процесів погодження й автоматів станів.