Μετάβαση στο περιεχόμενο

Ξεκινώντας

Εγκατάσταση

Απαιτήσεις

  • 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 και posix PHP, αν εκτελείτε ομάδες εργατών με --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 ανά σύνδεση:

PHP
$conn = new Connection(
    host: '127.0.0.1:3306',
    dbname: 'wordpress',
    user: 'root',
    password: 'secret',
    prefix: 'wp_',
    table_prefix: 'themequeue_',
);

Έτσι διατηρείται ανέπαφο το πρόθεμα βάσης δεδομένων WordPress και αλλάζει μόνο το τμήμα πίνακα Queuety.

Η πρώτη σας εργασία

Δημιουργήστε μια κλάση χειριστή που υλοποιεί τη διεπαφή Handler:

PHP
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,
        ];
    }
}

Καταχωρίστε την και αποστείλετε την εργασία:

PHP
use Queuety\Queuety;

Queuety::register( 'send_email', SendEmailHandler::class );

Queuety::dispatch( 'send_email', [
    'to'      => 'user@example.com',
    'subject' => 'Welcome',
    'body'    => 'Hello from Queuety!',
] );

Ή χρησιμοποιήστε τη σύγχρονη κλάση εργασίας με δυνατότητα αποστολής:

PHP
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:

PHP
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 [];
    }
}

Αποστείλετε τη ροή εργασίας:

PHP
$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

Τι ακολουθεί