Queuety
Die WordPress Workflow-Engine.
wp plugin install https://github.com/inline0/queuety/releases/latest/download/queuety.zip --activateNeueste Version 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!',
] );In der Praxis
Ein in PHP definierter Workflow und der Worker-Befehl, der ihn ausführt.
Ein Genehmigungsworkflow
Der Workflow führt einen Schritt aus, wartet 24 Stunden und pausiert dann bei wait_for_approval(), bis ein anderer Prozess das Signal approval sendet.
Die Verzögerung wird in der Datenbank gespeichert und bleibt daher bei Worker-Neustarts und Deployments erhalten. Ein vorzeitig gesendetes Signal wird aufgezeichnet und verarbeitet, sobald der Workflow die Wartephase erreicht. Beim Abbrechen des Durchlaufs wird der Handler on_cancel() aufgerufen.
$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=6Direkte MySQL-Übernahme
Jeder Worker läuft in einem langlebigen WP-CLI-Prozess und übernimmt Jobs direkt aus MySQL mit FOR UPDATE SKIP LOCKED.
Dauerhafte Workflows
Mehrstufige Prozesse mit dauerhaft gespeichertem Zustand, die PHP-Zeitüberschreitungen, Abstürze und erneute Versuche überstehen.
Zustandsautomaten
Langlebiger, ereignisgesteuerter Zustand mit Queuety::machine(): Definiere Zustände und Übergänge, sende Ereignisse und lies den Zeitverlauf.
Signale und Freigaben
wait_for_signal(), wait_for_approval() und wait_for_input() pausieren einen Workflow, bis eine externe Eingabe eintrifft.
Prioritätsstufen
Vier Stufen von niedrig bis dringend. Innerhalb einer Warteschlange werden Jobs mit höherer Priorität zuerst übernommen.
Ratenbegrenzung
Limits pro Handler innerhalb eines gleitenden Zeitfensters. Übernimmt ein Worker einen Job mit Ratenbegrenzung, legt er ihn zurück und wartet.
Wiederkehrende Jobs
Zeitplanung auf Basis von Intervallen und cron. Integrierter cron-Parser ohne externe Abhängigkeiten.
Parallele Schritte
Führe Workflow-Schritte parallel aus und warte, bis alle abgeschlossen sind, bevor es weitergeht.
Metriken und Protokollierung
Ein dauerhaftes Datenbankprotokoll mit Durchsatz, durchschnittlicher Dauer, p95-Dauer und Fehlerrate pro Handler.
WP-Cron-Fallback
Ohne Shell-Zugriff führt ein WordPress cron-Ereignis einmal pro Minute einen einmaligen Worker für die Standardwarteschlange aus.
Middleware
Job-Middleware nach dem Onion-Prinzip für Ratenbegrenzungen, Drosselung bei Ausnahmen, Eindeutigkeit, Timeouts und Schutz vor Überschneidungen.
PHP 8.2+
Enums, readonly-Klassen, match-Ausdrücke, Constructor Promotion und PHP-Attribute.
Warum Queuety
Der Zustand liegt in MySQL
Warteschlangen-Einträge, Workflow-Zustand, Protokolle, Signale und gestreamte Teile werden in MySQL gespeichert. Daher geht bei einem Worker-Neustart kein Orchestrierungszustand verloren. An jeder Schrittgrenze werden die Zustandsänderung, der Job-Abschluss und das Einreihen des nächsten Jobs in einer Transaktion übernommen.
Unabhängig von Seitenaufrufen
WP-Cron wird nur bei Seitenaufrufen ausgelöst, und ein 60-sekündiger LLM-Aufruf wird durch ein 30-sekündiges PHP-Timeout beendet. Queuety-Worker laufen in einem langlebigen WP-CLI-Prozess und nehmen Aufgaben unabhängig vom Traffic auf.
Leitplanken für Agentenläufe
for_each() mit Quorum-Modus, Genehmigungsschranken und Begrenzungen wie max_transitions() und max_state_bytes() halten lange Agentenläufe innerhalb eines definierten Rahmens.
Auch außerhalb von WordPress nutzbar
Der datenbankgestützte Kern läuft in jedem PHP-Prozess, der dieselbe Datenbank öffnen kann. So kann eine andere App Jobs einreihen, Signale senden und den Workflow-Status lesen. Action-Trigger, die WP-Cron-Brücke und die WP-CLI-Befehle benötigen weiterhin WordPress.
Im Vergleich zu
Wie Queuety zu den Schedulern und Workflow-Engines passt, die WordPress-Entwickler bereits kennen.
| Werkzeug | Gut geeignet für | Unterschiede zu Queuety |
|---|---|---|
| WP-Cron | Gut geeignet fürIn WordPress integriert, benötigt es auf Shared Hosting keinen Zugriff auf den System-Scheduler. Eine Aufgabe, deren Ausführungszeit verpasst wurde, läuft beim nächsten Seitenaufruf statt ganz auszufallen. | Unterschiede zu QueuetyQueuety-Worker laufen unabhängig vom Website-Traffic und benötigen einen langlebigen wp queuety work-Prozess. Die WP-Cron-Brücke wandelt wiederkehrende Ereignisse in Zeitpläne um, führt deren Hook-Callbacks aber noch nicht aus. Dafür bleibt WP-Cron zuständig. |
| Action Scheduler | Gut geeignet fürFür die Verteilung in Plugins und Themes ohne erforderlichen Serverzugriff entwickelt. Verarbeitet jeden Monat Millionen Zahlungen für Subscriptions und Webhooks für WooCommerce und protokolliert jede Aktion in einer Admin-Oberfläche. | Unterschiede zu QueuetyAction Scheduler führt einen Hook zu einem späteren Zeitpunkt aus, etwa einen verzögerten do_action(). Queuety ergänzt mehrstufige Workflows mit dauerhaftem Zustand zwischen den Schritten, Wartezeiten auf Signale und Genehmigungen sowie Zustandsautomaten. Sie lassen sich über WP-CLI-Befehle wie wp queuety workflow timeline prüfen. |
| Temporal | Gut geeignet fürEine Plattform für dauerhafte Ausführung: Im Event-Verlauf wird jeder Workflowschritt aufgezeichnet. Nach Abstürzen oder Ausfällen wird ein Durchlauf ab dem letzten gespeicherten Ereignis fortgesetzt. Temporal Cloud ist eine Alternative zum Selbsthosting des Dienstes. | Unterschiede zu QueuetyEin Temporal Service ist ein Go-Server mit Datenbank, der neben deiner Anwendung läuft. Queuety speichert seinen Zustand in MySQL-Tabellen über die WordPress-Datenbankverbindung und führt Worker über WP-CLI aus. |
Fragen und Antworten
Kurze Antworten aus der Queuety-Dokumentation.
Für einfache Jobs in der Standardwarteschlange nicht. Das Plugin startet jede Minute über WordPress cron einen einmaligen Worker, sofern WordPress cron ausgelöst wird. Pro Lauf verarbeitet er einen Job. Wiederkehrende Zeitpläne, eigene Warteschlangen und geringere Latenz erfordern einen dedizierten wp queuety work-Prozess.
Nein. Es benötigt entweder mysqli oder pdo_mysql und verwendet unter WordPress standardmäßig mysqli. Lege QUEUETY_DB_DRIVER als auto, mysqli oder pdo fest, um einen Treiber vorzugeben.
Jobs werden mit SELECT ... FOR UPDATE SKIP LOCKED übernommen. MySQL unterstützt dies ab Version 8.0, MariaDB ab Version 10.6. Die CI des Projekts läuft mit MySQL 8.0.
Ja. Der datenbankgestützte Kern mit Jobs, Workern, Workflows, Signalen, Zustandsautomaten, Artefakten, Protokollen, Metriken und Zeitplänen läuft über eine direkte Connection. Worker-Pools benötigen außerdem die Konstanten DB_HOST, DB_NAME, DB_USER und DB_PASSWORD. Queuety::on_action(), replace_wp_cron(), das Plugin-Bootstrap und die wp queuety-Befehle erfordern weiterhin WordPress.
Noch nicht. Queuety::replace_wp_cron() wandelt wiederkehrende wp_schedule_event()-Ereignisse in Queuety-Zeitpläne um, führt deren Hook-Callbacks aber noch nicht aus. Lass WP-Cron für Ereignisse aktiviert, die ausgelöst werden müssen. Ereignisse von wp_schedule_single_event() bleiben bei WP-Cron.
wp queuety work --workers=N startet einen festen Pool und startet abgestürzte Kindprozesse neu. Dafür sind die Erweiterungen pcntl und posix erforderlich. --min-workers und --max-workers starten einen adaptiven Pool, der bei wachsender Warteschlange wächst und bei nachlassender Auslastung schrumpft.
Installiere das Plugin, starte einen Worker und folge den Anleitungen – vom ersten Job bis zu Genehmigungsworkflows und Zustandsautomaten.