
# 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](https://queuety.inline0.dev/lt/docs/features/standalone-use). Š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](https://github.com/inline0/queuety/releases) yra `queuety.zip` išteklius: papildinys su jau įdiegtomis Composer priklausomybėmis. Įdiekite naujausią versiją naudodami WP-CLI:

```bash
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

```bash
composer require queuety/queuety
```

Tada suaktyvinkite papildinį:

```bash
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:

```bash
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](https://github.com/inline0/queuety/issues/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](https://github.com/inline0/queuety/issues/15)) |
| `QUEUETY_MAX_EXECUTION_TIME` | `300` | Maksimalus vienos užduoties vykdymo laikas sekundėmis iki skirtasis laikas baigsis (dar netaikoma, žr. [Užduotys](https://queuety.inline0.dev/lt/docs/jobs#timeout)) |
| `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](https://queuety.inline0.dev/lt/docs/features/workers).

`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ą

```bash
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](https://queuety.inline0.dev/lt/docs/features/workers#worker-lifecycle)).

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

```bash
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:

```bash
wp queuety work --workers=4
```

Apdorokite kelias eiles pagal prioritetus:

```bash
wp queuety work --queue=high,default,low
```

## Kas toliau

- [Užduotys](https://queuety.inline0.dev/lt/docs/jobs) – išsamus siuntimo ir apdorojimo vadovas
- [Darbo eigos](https://queuety.inline0.dev/lt/docs/workflows) – grandinės, lygiagretūs veiksmai, sąlyginės šakos ir darbo eigų vykdymas
- [Tarpinė programinė įranga](https://queuety.inline0.dev/lt/docs/features/middleware) – dažnio ribojimas, apkrovos ribojimas ir pasirinktinė konvejerio logika
- [Grupavimas](https://queuety.inline0.dev/lt/docs/features/batching) – užduočių grupių siuntimas su atgalinio iškvietimo funkcijomis
- [Srautinės veiksmų sekos](https://queuety.inline0.dev/lt/docs/workflows/streaming) – srautinio perdavimo duomenų išsaugojimas dalimis
- [Planavimas](https://queuety.inline0.dev/lt/docs/features/scheduling) – pasikartojančios užduotys
- [Podėliavimas](https://queuety.inline0.dev/lt/docs/features/caching) – prijungiamasis podėlio sluoksnis
- [Testavimas](https://queuety.inline0.dev/lt/docs/features/testing) – QueueFake ir testų patvirtinimai
- [CLI Žinynas](https://queuety.inline0.dev/lt/docs/cli) – visos galimos komandos
- [PHP API](https://queuety.inline0.dev/lt/docs/api) – programinė prieiga
