Pereiti prie turinio

Darbo pradžia

Diegimas

Reikalavimai

  • PHP 8.2 arba naujesnė versija ir WordPress 6.4 arba naujesnė versija
  • MySQL 8.0+ arba MariaDB 10.6+. Darbuotojai rezervuoja užduotis ir laiku vykdytinus tvarkaraščius naudodami SELECT ... FOR UPDATE SKIP LOCKED, kurį senesni serveriai atmeta su sintaksės klaida.
  • mysqli arba pdo_mysql (žr. toliau)
  • Serveryje turi būti WP-CLI, jei naudojate dedikuotus darbuotojus su wp queuety work
  • pcntl ir posix PHP plėtiniai, jei darbuotojų telkinius naudojate su --workers arba --min-workers/--max-workers

Queuety reikia PHP vykdymo aplinkoje, kuri įkelia WordPress ir WP-CLI, turėti arba mysqli, arba pdo_mysql. Tvarkyklę jis pasirenka automatiškai: vykdymo aplinkose WordPress pirmenybę teikia mysqli, o pdo_mysql palieka atskirai arba tiesiogiai vykdymo aplinkai.

Jei norite naudoti duomenų baze pagrįstą vykdymo aplinką be WordPress papildinio sluoksnio, žr. Naudojimas atskirai. Šis būdas naudoja tą patį ryšį ir vykdymo aplinkos lenteles, bet neapima WordPress kabliukų sąsajų ar WP-CLI registracijos.

Iš leidimo ZIP archyvo

Kiekviename GitHub leidime yra queuety.zip išteklius: papildinys su jau įdiegtomis Composer priklausomybėmis. Įdiekite naujausią versiją naudodami WP-CLI:

Shell
wp plugin install https://github.com/inline0/queuety/releases/latest/download/queuety.zip --activate

Arba atsisiųskite ZIP archyvą ir įkelkite jį per Plugins > Add New > Upload Plugin. Tai paprasčiausias būdas įprastai WordPress svetainei.

Per Composer, skirtą Composer valdomai WordPress aplinkai

Shell
composer require queuety/queuety

Tada suaktyvinkite papildinį:

Shell
wp plugin activate queuety

Paketo tipas yra wordpress-plugin. Composer įdeda jį į papildinių katalogą tik tada, kai projektui reikia composer/installers ir šis tipas susietas su diegimo keliu, kaip tai daro Bedrock, o pats projektas turi įkelti savo vendor/autoload.php (tai daro ir Bedrock). Be composer/installers, Composer įdiegia jį į vendor/queuety/queuety, kur jo neranda WordPress, todėl įprastame WordPress dieginyje naudokite leidimo ZIP archyvą.

Iš pradinio kodo kuriant

Įdėkite saugyklą į wp-content/plugins/queuety, tada įdiekite PHP priklausomybes:

Shell
composer install
wp plugin activate queuety

Suaktyvinus Queuety, sukuriamos duomenų bazės lentelės (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), kad darbiniai procesai galėtų rezervuoti užduotis tiesiai iš MySQL.

Pagal numatytuosius nustatymus papildinys taip pat kas minutę suplanuoja vienkartinį darbuotojo paleidimą per WordPress cron, skirtą default eilei. Taip užtikrinamas pradinis užduočių ir darbo eigų vykdymas be apvalkalo, jei jos lieka default, o WordPress cron veikia. Kiekvieno paleidimo metu apdorojama ne daugiau kaip viena užduotis; pasikartojantys tvarkaraščiai nevykdomi, užstrigusios užduotys neatkuriamos ir darbo eigų terminai netikrinami. Visa tai vyksta tik ilgai veikiančiame wp queuety work procese (#14). Jei reikia pasirinktinių eilių, pasikartojančių tvarkaraščių, mažesnio delsos laiko ar didesnės apkrovos apdorojimo, naudokite dedikuotus wp queuety work procesus.

Konfigūracija

Visos konstantos yra neprivalomos. Apibrėžkite jas faile wp-config.php prieš įkeliant papildinį arba prieš paleidžiant Queuety įdėtoje, temos tipo aplinkoje:

Konstanta Numatytoji reikšmė Aprašymas
QUEUETY_RETENTION_DAYS 7 Numatytoji wp queuety purge ir Queuety::purge() saugojimo trukmė dienomis. Automatiškai niekas neišvaloma
QUEUETY_LOG_RETENTION_DAYS 0 Nuskaito Config::log_retention_days(), bet kol kas nenaudojama; žurnalai saugomi, kol iškviečiate Queuety::purge_logs() (#15)
QUEUETY_MAX_EXECUTION_TIME 300 Maksimalus vienos užduoties vykdymo laikas sekundėmis iki skirtasis laikas baigsis (dar netaikoma, žr. Užduotys)
QUEUETY_WORKER_SLEEP 1 Pauzės trukmė sekundėmis, kai eilė tuščia
QUEUETY_WORKER_MAX_JOBS 1000 Maksimalus užduočių skaičius iki darbuotojo paleidimo iš naujo
QUEUETY_WORKER_MAX_MEMORY 128 Maksimalus dydis MB iki darbuotojo paleidimo iš naujo
QUEUETY_RETRY_BACKOFF exponential Atsitraukimo strategija: exponential, linear arba fixed
QUEUETY_STALE_TIMEOUT 600 Laikas sekundėmis iki užstrigusių užduočių atkūrimo
QUEUETY_CACHE_TTL 5 Numatytoji podėlio galiojimo trukmė sekundėmis
QUEUETY_DEBUG false Įjungti išsamų darbuotojo žurnalų registravimą
QUEUETY_CLI_COMMAND queuety Pagrindinės WP-CLI komandos pavadinimas
QUEUETY_TABLE_PREFIX queuety_ Bendras visų Queuety lentelių bazinis pavadinimas po WordPress DB prefikso
QUEUETY_TABLE_JOBS queuety_jobs Užduočių lentelės pavadinimas
QUEUETY_TABLE_WORKFLOWS queuety_workflows Darbo eigų lentelės pavadinimas
QUEUETY_TABLE_LOGS queuety_logs Žurnalų lentelės pavadinimas
QUEUETY_TABLE_SCHEDULES queuety_schedules Tvarkaraščių lentelės pavadinimas
QUEUETY_TABLE_SIGNALS queuety_signals Signalų lentelės pavadinimas
QUEUETY_TABLE_WORKFLOW_DEPENDENCIES queuety_workflow_dependencies Darbo eigų priklausomybių laukimo lentelės pavadinimas
QUEUETY_TABLE_WORKFLOW_DISPATCH_KEYS queuety_workflow_dispatch_keys Patvarumo darbo eigų idempotentiškumo lentelės pavadinimas
QUEUETY_TABLE_CHUNKS queuety_chunks Srauto dalių lentelės pavadinimas
QUEUETY_TABLE_QUEUE_STATES queuety_queue_states Eilių būsenų lentelės pavadinimas
QUEUETY_TABLE_WEBHOOKS queuety_webhooks Žiniatinklio kabliukų lentelės pavadinimas
QUEUETY_TABLE_LOCKS queuety_locks Užraktų lentelės pavadinimas
QUEUETY_TABLE_BATCHES queuety_batches Paketų lentelės pavadinimas
QUEUETY_TABLE_WORKFLOW_EVENTS queuety_workflow_events Darbo eigos įvykių žurnalo lentelės pavadinimas
QUEUETY_TABLE_ARTIFACTS queuety_artifacts Darbo eigos artefaktų lentelės pavadinimas
QUEUETY_TABLE_STATE_MACHINES queuety_state_machines Būsenų automatų lentelės pavadinimas
QUEUETY_TABLE_STATE_MACHINE_EVENTS queuety_state_machine_events Būsenų automatų įvykių žurnalo lentelės pavadinimas
QUEUETY_DB_DRIVER auto MySQL tvarkyklė: auto, mysqli arba pdo. auto teikia pirmenybę mysqli, kai įkelta WordPress, kitu atveju – pdo_mysql, o tada mysqli

Išteklių priėmimo ir adaptyviojo telkinio konstantos (QUEUETY_RESOURCE_*, QUEUETY_WORKER_POOL_*) pateiktos puslapyje Darbuotojai.

QUEUETY_TABLE_PREFIX keičia tik lentelių pavadinimų Queuety dalį. Rezultatą vis tiek apgaubia WordPress duomenų bazės prefiksas, todėl $wpdb->prefix = 'wp_' ir QUEUETY_TABLE_PREFIX = 'themequeue_' sukuria tokias lenteles kaip wp_themequeue_jobs. Atskiroms lentelėms skirtos aiškios QUEUETY_TABLE_* konstantos turi pirmenybę.

Atskiruose ryšiuose taip pat galima nustatyti Queuety lentelės prefiksą kiekvienam ryšiui:

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

Taip išsaugomas WordPress duomenų bazės prefiksas ir pakeičiamas tik Queuety lentelės segmentas.

Pirmoji užduotis

Sukurkite apdorojimo klasę, įgyvendinančią sąsają 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,
        ];
    }
}

Užregistruokite ją ir išsiųskite:

PHP
use Queuety\Queuety;

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

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

Arba naudokite šiuolaikinę išsiunčiamos užduoties klasę:

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!' );

Pirmoji darbo eiga

Apibrėžkite veiksmų apdorojimo funkcijas, įgyvendinančias sąsają 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 [];
    }
}

Išsiųskite darbo eigą:

PHP
$workflow_id = Queuety::workflow( 'generate_report' )
    ->then( FetchDataHandler::class )
    ->then( CallLLMHandler::class )
    ->then( FormatOutputHandler::class )
    ->dispatch( [ 'user_id' => 42 ] );

Paleiskite darbuotoją

Shell
wp queuety work

Darbuotojas tikrina, ar yra laukiančių užduočių, jas vykdo, tęsia darbo eigas ir užmigdo procesą, kai eilė tuščia. Paspauskite Ctrl+C, kad sustabdytumėte; procesas baigiamas iškart, net jei užduotis vykdoma (žr. Darbuotojai).

Aukščiau pateiktas SendEmailHandler siunčia užduotis į emails eilę per config(), todėl default veikiantis darbuotojas jų nepaima. Nurodykite kiekvieną naudojamą eilę:

Shell
wp queuety work --queue=emails,default

Jei nenaudojate dedikuoto darbuotojo, Queuety vis tiek turi pirmiau aprašytą numatytąją WordPress cron atsarginę parinktį, veikiančią kartą per minutę. Ji taikoma tik default eilei ir apdoroja vieną užduotį per paleidimą. Dedikuotas darbuotojas užtikrina didesnį našumą ir mažesnį delsos laiką.

Gamybinėje aplinkoje paleiskite kelis darbuotojus:

Shell
wp queuety work --workers=4

Apdorokite kelias eiles pagal prioritetus:

Shell
wp queuety work --queue=high,default,low

Kas toliau