Ξεκινώντας
Εγκατάσταση
Απαιτήσεις
- 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. Επιλέγει αυτόματα το πρόγραμμα οδήγησης, προτιμώντας το mysqli για περιβάλλοντα εκτέλεσης WordPress και διατηρώντας διαθέσιμο το pdo_mysql για αυτόνομη ή άμεση χρήση.
Αν θέλετε το περιβάλλον εκτέλεσης με βάση τη βάση δεδομένων χωρίς το επίπεδο πρόσθετου WordPress, ανατρέξτε στην ενότητα Αυτόνομη χρήση. Αυτή η διαδρομή χρησιμοποιεί την ίδια σύνδεση και τους ίδιους πίνακες περιβάλλοντος εκτέλεσης, αλλά δεν περιλαμβάνει τις γέφυρες hooks WordPress ή την καταχώριση WP-CLI.
Από το αρχείο zip της έκδοσης
Κάθε έκδοση GitHub έχει ένα αρχείο queuety.zip: το πρόσθετο με τις εξαρτήσεις Composer ήδη εγκατεστημένες. Εγκαταστήστε την πιο πρόσφατη έκδοση με το WP-CLI:
wp plugin install https://github.com/inline0/queuety/releases/latest/download/queuety.zip --activate
Ή κατεβάστε το αρχείο zip και μεταφορτώστε το από την επιλογή Πρόσθετα > Προσθήκη νέου > Μεταφόρτωση πρόσθετου. Αυτή είναι η απλούστερη διαδρομή για έναν συνηθισμένο ιστότοπο WordPress.
Μέσω του Composer για περιβάλλον WordPress με διαχείριση Composer
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 δεν το εντοπίζει, οπότε χρησιμοποιήστε το zip της έκδοσης σε μια απλή εγκατάσταση WordPress.
Από τον πηγαίο κώδικα κατά την ανάπτυξη
Τοποθετήστε το αποθετήριο στο 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), ώστε οι workers να μπορούν να αναλαμβάνουν εργασίες απευθείας από το MySQL.
Από προεπιλογή, το πρόσθετο προγραμματίζει επίσης έναν worker μίας εκτέλεσης μέσω του WordPress cron κάθε λεπτό για την ουρά default. Έτσι έχετε μια βασική λύση χωρίς shell για εργασίες και ροές εργασίας που εκτελούνται στο 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 |
Μέγιστος αριθμός εργασιών πριν από την επανεκκίνηση του worker |
QUEUETY_WORKER_MAX_MEMORY |
128 |
Μέγιστα MB πριν από την επανεκκίνηση του worker |
QUEUETY_RETRY_BACKOFF |
exponential |
Στρατηγική αναμονής: exponential, linear ή fixed |
QUEUETY_STALE_TIMEOUT |
600 |
Δευτερόλεπτα μέχρι την ανάκτηση κολλημένων εργασιών |
QUEUETY_CACHE_TTL |
5 |
Προεπιλεγμένος χρόνος ζωής της cache σε δευτερόλεπτα |
QUEUETY_DEBUG |
false |
Ενεργοποίηση αναλυτικής καταγραφής από τον worker |
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 |
Όνομα πίνακα webhook |
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_*) παρατίθενται στη σελίδα Workers.
Το 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!',
] );
Ή χρησιμοποιήστε τη σύγχρονη κλάση εργασίας με δυνατότητα αποστολής:
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 ] );
Εκκίνηση worker
wp queuety work
Ο worker αναζητά εκκρεμείς εργασίες, τις εκτελεί, προχωρά τις ροές εργασίας και περιμένει όταν η ουρά είναι κενή. Πατήστε Ctrl+C για διακοπή· η διεργασία τερματίζεται αμέσως, ακόμη και στη μέση μιας εργασίας (δείτε Workers).
Η παραπάνω SendEmailHandler στέλνει τις εργασίες της στην ουρά emails μέσω του config(), οπότε ένας worker στην default δεν τις αναλαμβάνει. Ονομάστε κάθε ουρά που χρησιμοποιείτε:
wp queuety work --queue=emails,default
Αν δεν εκτελείτε αποκλειστικό worker, το Queuety εξακολουθεί να διαθέτει την προεπιλεγμένη εναλλακτική WordPress cron ανά λεπτό που περιγράφηκε παραπάνω, περιορισμένη στην ουρά default και σε μία εργασία ανά εκτέλεση. Ο αποκλειστικός worker προσφέρει μεγαλύτερη διεκπεραιωτική ικανότητα και μικρότερη καθυστέρηση.
Για περιβάλλον παραγωγής, εκτελέστε πολλούς workers:
wp queuety work --workers=4
Επεξεργαστείτε πολλές ουρές με σειρά προτεραιότητας:
wp queuety work --queue=high,default,low
Τι ακολουθεί
- Εργασίες για τον πλήρη οδηγό αποστολής και χειρισμού
- Ροές εργασίας για αλυσίδες, παράλληλα βήματα, διακλάδωση υπό όρους και ροές εργασίας εκτέλεσης
- Ενδιάμεσο λογισμικό για περιορισμό ρυθμού, περιορισμό συχνότητας και προσαρμοσμένη λογική αγωγού
- Ομαδοποίηση για αποστολή ομάδων εργασιών με συναρτήσεις επανάκλησης
- Βήματα ροής δεδομένων για αποθήκευση δεδομένων ροής τμηματικά
- Προγραμματισμός για επαναλαμβανόμενες εργασίες
- Προσωρινή αποθήκευση για την επεκτάσιμη βαθμίδα cache
- Δοκιμές για το QueueFake και τις επιβεβαιώσεις δοκιμών
- ΑναφοράCLI για όλες τις διαθέσιμες εντολές
- PHP API για προγραμματική πρόσβαση