Початок роботи
Встановлення
Вимоги
- PHP 8.2 або новіша версія та WordPress 6.4 або новіша версія
- MySQL 8.0+ або MariaDB 10.6+. Воркери отримують завдання та прострочені розклади за допомогою
SELECT ... FOR UPDATE SKIP LOCKED, яку старіші сервери відхиляють із синтаксичною помилкою. mysqliабоpdo_mysql(див. нижче)- WP-CLI на сервері, якщо ви запускаєте виділені воркери з
wp queuety work - Розширення
pcntlіposixPHP, якщо ви запускаєте пули воркерів з--workersабо--min-workers/--max-workers
Queuety потребує або mysqli, або pdo_mysql у середовищі виконання PHP, що завантажує WordPress і WP-CLI. Драйвер вибирається автоматично: для середовищ виконання WordPress пріоритет має mysqli, а pdo_mysql доступний для автономного або прямого використання середовища виконання.
Якщо потрібне середовище виконання з базою даних без рівня плагіна WordPress, див. Автономне використання. У цьому режимі використовуються ті самі з’єднання й таблиці середовища виконання, але немає мостів хуків WordPress і реєстрації WP-CLI.
З архіву випуску
Кожен випуск GitHub має queuety.zip-архів : плагін із уже встановленими залежностями Composer. Установіть найновіший за допомогою WP-CLI:
wp plugin install https://github.com/inline0/queuety/releases/latest/download/queuety.zip --activate
Або завантажте zip-архів і вивантажте його в розділі Plugins > Add New > Upload Plugin. Це найпростіший спосіб для звичайного сайту WordPress.
Через Composer для Composer-керованого WordPress
composer require queuety/queuety
Потім активуйте плагін:
wp plugin activate queuety
Тип пакета — wordpress-plugin. Composer розміщує його в каталозі плагінів, лише якщо проєкт потребує composer/installers і зіставляє цей тип зі шляхом встановлення, як це робить Bedrock; також проєкт має завантажувати власний vendor/autoload.php (це теж робить Bedrock). Без composer/installers команда Composer встановлює пакет у vendor/queuety/queuety, де WordPress його не знаходить, тож на звичайній інсталяції WordPress використовуйте zip-архів випуску.
З вихідного коду під час розробки
Розмістіть репозиторій у wp-content/plugins/queuety, а потім установіть залежності PHP:
composer install
wp plugin activate queuety
Під час активації Queuety створює таблиці бази даних (queuety_jobs, queuety_workflows, queuety_logs, queuety_schedules, queuety_queue_states, queuety_webhooks, queuety_locks, queuety_signals, queuety_workflow_dependencies, queuety_workflow_dispatch_keys, queuety_batches, queuety_chunks, queuety_workflow_events, queuety_artifacts, queuety_state_machines, queuety_state_machine_events), щоб воркери могли отримувати завдання безпосередньо з MySQL.
За замовчуванням плагін також планує одноразовий запуск воркера через WordPress cron щохвилини для черги default. Це дає змогу виконувати завдання й робочі процеси без оболонки, які залишаються на default, за умови, що спрацьовує WordPress cron. Кожен запуск обробляє щонайбільше одне завдання; він не запускає повторювані розклади, не відновлює застарілі завдання й не перевіряє дедлайни робочих процесів. Усе це працює лише в довготривалому процесі wp queuety work (#14). Для власних черг, повторюваних розкладів, меншої затримки або інтенсивніших навантажень перейдіть на виділені процеси wp queuety work.
Конфігурація
Усі константи необов’язкові. Визначте їх у wp-config.php до завантаження плагіна або до запуску Queuety у вбудованій інсталяції в стилі теми:
| Константа | За замовчуванням | Опис |
|---|---|---|
QUEUETY_RETENTION_DAYS |
7 |
Стандартний вік у днях для wp queuety purge і Queuety::purge(). Автоматичне очищення не виконується |
QUEUETY_LOG_RETENTION_DAYS |
0 |
Зчитується Config::log_retention_days(), але поки не використовується; журнали зберігаються, доки ви не викличете Queuety::purge_logs() (#15) |
QUEUETY_MAX_EXECUTION_TIME |
300 |
Максимальна кількість секунд на завдання до тайм-ауту (поки не застосовується, див. Завдання) |
QUEUETY_WORKER_SLEEP |
1 |
Кількість секунд очікування, коли черга порожня |
QUEUETY_WORKER_MAX_JOBS |
1000 |
Максимальна кількість завдань до перезапуску воркера |
QUEUETY_WORKER_MAX_MEMORY |
128 |
Максимальний обсяг пам’яті в MB до перезапуску воркера |
QUEUETY_RETRY_BACKOFF |
exponential |
Стратегія збільшення інтервалу: exponential, linear або fixed |
QUEUETY_STALE_TIMEOUT |
600 |
Кількість секунд до відновлення завислих завдань |
QUEUETY_CACHE_TTL |
5 |
Стандартний TTL кешу в секундах |
QUEUETY_DEBUG |
false |
Увімкнути докладне журналювання воркера |
QUEUETY_CLI_COMMAND |
queuety |
Назва кореневої команди WP-CLI |
QUEUETY_TABLE_PREFIX |
queuety_ |
Спільна базова назва всіх таблиць Queuety після префікса бази даних WordPress |
QUEUETY_TABLE_JOBS |
queuety_jobs |
Назва таблиці завдань |
QUEUETY_TABLE_WORKFLOWS |
queuety_workflows |
Назва таблиці робочих процесів |
QUEUETY_TABLE_LOGS |
queuety_logs |
Назва таблиці журналів |
QUEUETY_TABLE_SCHEDULES |
queuety_schedules |
Назва таблиці розкладів |
QUEUETY_TABLE_SIGNALS |
queuety_signals |
Назва таблиці сигналів |
QUEUETY_TABLE_WORKFLOW_DEPENDENCIES |
queuety_workflow_dependencies |
Назва таблиці очікування залежностей робочих процесів |
QUEUETY_TABLE_WORKFLOW_DISPATCH_KEYS |
queuety_workflow_dispatch_keys |
Назва таблиці ключів ідемпотентності довготривалих робочих процесів |
QUEUETY_TABLE_CHUNKS |
queuety_chunks |
Назва таблиці фрагментів потокових даних |
QUEUETY_TABLE_QUEUE_STATES |
queuety_queue_states |
Назва таблиці станів черг |
QUEUETY_TABLE_WEBHOOKS |
queuety_webhooks |
Назва таблиці вебхуків |
QUEUETY_TABLE_LOCKS |
queuety_locks |
Назва таблиці блокувань |
QUEUETY_TABLE_BATCHES |
queuety_batches |
Назва таблиці пакетів |
QUEUETY_TABLE_WORKFLOW_EVENTS |
queuety_workflow_events |
Назва таблиці журналу подій робочих процесів |
QUEUETY_TABLE_ARTIFACTS |
queuety_artifacts |
Назва таблиці артефактів робочих процесів |
QUEUETY_TABLE_STATE_MACHINES |
queuety_state_machines |
Назва таблиці автоматів станів |
QUEUETY_TABLE_STATE_MACHINE_EVENTS |
queuety_state_machine_events |
Назва таблиці журналу подій автоматів станів |
QUEUETY_DB_DRIVER |
auto |
Драйвер MySQL: auto, mysqli або pdo. auto надає перевагу mysqli, якщо завантажено WordPress, інакше — pdo_mysql, а потім mysqli |
Константи для допуску ресурсів та адаптивних пулів (QUEUETY_RESOURCE_*, QUEUETY_WORKER_POOL_*) наведено на сторінці Воркери.
QUEUETY_TABLE_PREFIX змінює лише сегмент Queuety у назвах таблиць. Префікс бази даних WordPress усе одно додається до результату, тож $wpdb->prefix = 'wp_' і QUEUETY_TABLE_PREFIX = 'themequeue_' створюють таблиці на кшталт wp_themequeue_jobs. Для окремих таблиць пріоритет мають явно задані константи QUEUETY_TABLE_*.
Автономні з’єднання також можуть задавати префікс таблиць Queuety для кожного з’єднання:
$conn = new Connection(
host: '127.0.0.1:3306',
dbname: 'wordpress',
user: 'root',
password: 'secret',
prefix: 'wp_',
table_prefix: 'themequeue_',
);
Так префікс бази даних WordPress залишається незмінним, а змінюється лише сегмент таблиці Queuety.
Ваше перше завдання
Створіть клас обробника, що реалізує інтерфейс Handler:
use Queuety\Handler;
class SendEmailHandler implements Handler {
public function handle( array $payload ): void {
wp_mail( $payload['to'], $payload['subject'], $payload['body'] );
}
public function config(): array {
return [
'queue' => 'emails',
'max_attempts' => 5,
];
}
}
Зареєструйте його та поставте завдання в чергу:
use Queuety\Queuety;
Queuety::register( 'send_email', SendEmailHandler::class );
Queuety::dispatch( 'send_email', [
'to' => 'user@example.com',
'subject' => 'Welcome',
'body' => 'Hello from Queuety!',
] );
Або скористайтеся сучасним класом завдання з методом dispatch:
use Queuety\Contracts\Job;
use Queuety\Dispatchable;
readonly class SendEmailJob implements Job {
use Dispatchable;
public function __construct(
public string $to,
public string $subject,
public string $body,
) {}
public function handle(): void {
wp_mail( $this->to, $this->subject, $this->body );
}
}
SendEmailJob::dispatch( 'user@example.com', 'Welcome', 'Hello from Queuety!' );
Ваш перший робочий процес
Створіть обробники кроків, що реалізують інтерфейс Step:
use Queuety\Step;
class FetchDataHandler implements Step {
public function handle( array $state ): array {
$user = get_user_by( 'ID', $state['user_id'] );
return [ 'user_name' => $user->display_name ];
}
public function config(): array {
return [];
}
}
class CallLLMHandler implements Step {
public function handle( array $state ): array {
$response = wp_remote_post( 'https://api.openai.com/v1/chat/completions', [
'body' => json_encode( [ 'prompt' => "Generate report for {$state['user_name']}" ] ),
] );
return [ 'llm_response' => wp_remote_retrieve_body( $response ) ];
}
public function config(): array {
return [ 'max_attempts' => 5 ];
}
}
class FormatOutputHandler implements Step {
public function handle( array $state ): array {
$url = save_report( $state['user_name'], $state['llm_response'] );
return [ 'report_url' => $url ];
}
public function config(): array {
return [];
}
}
Поставте робочий процес у чергу:
$workflow_id = Queuety::workflow( 'generate_report' )
->then( FetchDataHandler::class )
->then( CallLLMHandler::class )
->then( FormatOutputHandler::class )
->dispatch( [ 'user_id' => 42 ] );
Запустіть воркер
wp queuety work
Воркер перевіряє наявність завдань, виконує їх, просуває робочі процеси далі й очікує, коли черга порожня. Натисніть Ctrl+C, щоб зупинити його; процес завершиться негайно, навіть посеред виконання завдання (див. Воркери).
Наведений вище SendEmailHandler надсилає завдання до черги emails через config(), тому воркер для default їх не отримає. Указуйте назви всіх черг, якими користуєтеся:
wp queuety work --queue=emails,default
Якщо ви не запускаєте окремий воркер, Queuety і далі використовує стандартний резервний варіант: WordPress cron запускається раз на хвилину, обробляє лише чергу default та одне завдання за запуск. Окремий воркер забезпечує більшу пропускну здатність і меншу затримку.
Для робочого середовища запустіть кілька воркерів:
wp queuety work --workers=4
Обробляйте кілька черг у порядку пріоритету:
wp queuety work --queue=high,default,low
Що далі
- Завдання — повний посібник із постановки завдань у чергу та обробників
- Робочі процеси — ланцюжки, паралельні кроки, розгалуження за умовами та запуск робочих процесів
- Проміжне ПЗ — обмеження частоти, уповільнення та логіка власного конвеєра
- Пакетна обробка — постановка груп завдань у чергу зі зворотними викликами
- Потокові кроки — збереження потокових даних фрагмент за фрагментом
- Планування — повторювані завдання
- Кешування — підключний рівень кешування
- Тестування — QueueFake і твердження для тестів
- CLI Довідник — усі доступні команди
- PHP API — програмний доступ