
# Alustamine

## Paigaldamine

### Nõuded

- PHP 8.2 või uuem ja WordPress 6.4 või uuem
- MySQL 8.0+ või MariaDB 10.6+. Töötlejad võtavad töid ja saabunud ajastusi `SELECT ... FOR UPDATE SKIP LOCKED` abil, mille vanemad serverid süntaksiveaga tagasi lükkavad.
- `mysqli` või `pdo_mysql` (vt allpool)
- Serveris peab olema WP-CLI, kui kasutate spetsiaalseid töötlejaid koos `wp queuety work`-ga
- Laiendused `pcntl` ja `posix` PHP, kui kasutate töötlejate kogumeid koos `--workers` või suvanditega `--min-workers`/`--max-workers`

Queuety vajab PHP käituskeskkonnas, mis laadib WordPress ja WP-CLI, kas `mysqli` või `pdo_mysql`. See valib draiveri automaatselt, eelistades `mysqli`-i WordPress käituskeskkondades ja jättes `pdo_mysql` eraldiseisvaks või otseseks käituseks.

Kui soovite andmebaasipõhist käituskeskkonda ilma WordPress plugina kihita, vaadake [Iseseisev kasutus](https://queuety.inline0.dev/et/docs/features/standalone-use). See kasutab sama ühendust ja käituskeskkonna tabeleid, kuid ei sisalda WordPress konksusildu ega WP-CLI registreerimist.

### Väljalaske ZIP-failist

Iga [GitHub väljalaske](https://github.com/inline0/queuety/releases) juures on saadaval `queuety.zip` fail: plugin koos juba installitud Composer sõltuvustega. Installige uusim versioon käsuga WP-CLI:

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

Või laadige ZIP-fail alla ja laadige see üles menüüst Plugins > Add New > Upload Plugin. See on tavalise WordPress saidi jaoks lihtsaim viis.

### Composer kaudu Composer-i hallatava WordPress jaoks

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

Seejärel aktiveerige plugin:

```bash
wp plugin activate queuety
```

Paketi tüüp on `wordpress-plugin`. Composer paigutab selle pluginate kataloogi ainult siis, kui projekt nõuab `composer/installers` ja seostab selle tüübi paigaldaja teega, nagu teeb Bedrock, ning projekt peab laadima oma `vendor/autoload.php` (seda teeb ka Bedrock). Ilma `composer/installers`-ta paigaldab Composer selle asukohta `vendor/queuety/queuety`, kust WordPress seda ei leia, seega kasuta tavalisel WordPress-paigaldusel väljalaske ZIP-faili.

### Lähtekoodist arenduse ajal

Paiguta hoidla asukohta `wp-content/plugins/queuety` ja seejärel paigalda PHP sõltuvused:

```bash
composer install
wp plugin activate queuety
```

Aktiveerimisel loob Queuety oma andmebaasitabelid (`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`), et töölised saaksid töid otse kohast MySQL võtta.

Vaikimisi ajastab plugin iga minut ka ühekordse töölise, kasutades WordPress cron-i järjekorra `default` jaoks. See annab shellita baaslahenduse töödele ja töövoogudele, mis jäävad `default`-i, eeldusel et WordPress cron käivitub. Iga käivitus töötleb kõige rohkem ühe töö ega käivita korduvaid ajastusi, taasta aegunud töid ega kontrolli töövoogude tähtaegu; need toimingud käivad ainult kaua töötavas `wp queuety work` protsessis ([#14](https://github.com/inline0/queuety/issues/14)). Kohandatud järjekordade, korduvate ajastuste, väiksema viivituse või suurema koormuse jaoks kasuta spetsiaalseid `wp queuety work` protsesse.

## Konfiguratsioon

Kõik konstandid on valikulised. Määra need failis `wp-config.php` enne plugina laadimist või enne, kui Queuety käivitub manustatud teemastiilis paigalduse korral:

| Konstant | Vaikeväärtus | Kirjeldus |
|---|---|---|
| `QUEUETY_RETENTION_DAYS` | `7` | `wp queuety purge` ja `Queuety::purge()` vaikimisi vanus päevades. Midagi ei kustutata automaatselt |
| `QUEUETY_LOG_RETENTION_DAYS` | `0` | `Config::log_retention_days()` loeb seda, kuid veel ei kasuta; logisid säilitatakse, kuni kutsud välja `Queuety::purge_logs()` ([#15](https://github.com/inline0/queuety/issues/15)) |
| `QUEUETY_MAX_EXECUTION_TIME` | `300` | Töö maksimaalne kestus sekundites enne ajalõppu (veel ei jõustata, vt [Jobs](https://queuety.inline0.dev/et/docs/jobs#timeout)) |
| `QUEUETY_WORKER_SLEEP` | `1` | Ooteaeg sekundites, kui järjekord on tühi |
| `QUEUETY_WORKER_MAX_JOBS` | `1000` | Tööde arv, mille järel tööline taaskäivitub |
| `QUEUETY_WORKER_MAX_MEMORY` | `128` | Töömälu maksimum MB-des enne töölise taaskäivitumist |
| `QUEUETY_RETRY_BACKOFF` | `exponential` | Ooteaja strateegia: `exponential`, `linear` või `fixed` |
| `QUEUETY_STALE_TIMEOUT` | `600` | Ooteaeg sekundites, enne kui takerdunud tööd taastatakse |
| `QUEUETY_CACHE_TTL` | `5` | Vahemälu vaikeväärtuse TTL sekundites |
| `QUEUETY_DEBUG` | `false` | Luba üksikasjalik töölise logimine |
| `QUEUETY_CLI_COMMAND` | `queuety` | Juurkataloogi WP-CLI käsu nimi |
| `QUEUETY_TABLE_PREFIX` | `queuety_` | Kõigi Queuety tabelite ühine põhinimi pärast WordPress DB-prefiksit |
| `QUEUETY_TABLE_JOBS` | `queuety_jobs` | Tööde tabeli nimi |
| `QUEUETY_TABLE_WORKFLOWS` | `queuety_workflows` | Töövoogude tabeli nimi |
| `QUEUETY_TABLE_LOGS` | `queuety_logs` | Logide tabeli nimi |
| `QUEUETY_TABLE_SCHEDULES` | `queuety_schedules` | Ajastuste tabeli nimi |
| `QUEUETY_TABLE_SIGNALS` | `queuety_signals` | Signaalide tabeli nimi |
| `QUEUETY_TABLE_WORKFLOW_DEPENDENCIES` | `queuety_workflow_dependencies` | Töövoogude sõltuvuste ootetabeli nimi |
| `QUEUETY_TABLE_WORKFLOW_DISPATCH_KEYS` | `queuety_workflow_dispatch_keys` | Püsivate töövoogude idempotentsustabeli nimi |
| `QUEUETY_TABLE_CHUNKS` | `queuety_chunks` | Voogedastatavate osade tabeli nimi |
| `QUEUETY_TABLE_QUEUE_STATES` | `queuety_queue_states` | Järjekordade olekute tabeli nimi |
| `QUEUETY_TABLE_WEBHOOKS` | `queuety_webhooks` | Veebihaakide tabeli nimi |
| `QUEUETY_TABLE_LOCKS` | `queuety_locks` | Lukkude tabeli nimi |
| `QUEUETY_TABLE_BATCHES` | `queuety_batches` | Partiide tabeli nimi |
| `QUEUETY_TABLE_WORKFLOW_EVENTS` | `queuety_workflow_events` | Töövoo sündmuslogi tabeli nimi |
| `QUEUETY_TABLE_ARTIFACTS` | `queuety_artifacts` | Töövoo artefaktide tabeli nimi |
| `QUEUETY_TABLE_STATE_MACHINES` | `queuety_state_machines` | Olekumasinate tabeli nimi |
| `QUEUETY_TABLE_STATE_MACHINE_EVENTS` | `queuety_state_machine_events` | Olekumasina sündmuslogi tabeli nimi |
| `QUEUETY_DB_DRIVER` | `auto` | MySQL draiver: `auto`, `mysqli` või `pdo`. `auto` eelistab `mysqli`, kui WordPress on laaditud, muul juhul `pdo_mysql` ja seejärel `mysqli` |

Ressursside vastuvõtu ja kohanduva töötlusjõudluse konstandid (`QUEUETY_RESOURCE_*`, `QUEUETY_WORKER_POOL_*`) on loetletud lehel [Workers](https://queuety.inline0.dev/et/docs/features/workers).

`QUEUETY_TABLE_PREFIX` muudab ainult tabelinimede osa Queuety. Andmebaasi prefiks WordPress ümbritseb tulemust endiselt, seega `$wpdb->prefix = 'wp_'` ja `QUEUETY_TABLE_PREFIX = 'themequeue_'` loovad näiteks selliseid tabeleid nagu `wp_themequeue_jobs`. Üksikute tabelite puhul on selgesõnalistel konstantidel `QUEUETY_TABLE_*` endiselt eelis.

Eraldiseisvate ühenduste puhul saab ka määrata ühendusepõhise tabeliprefiksi Queuety:

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

See säilitab andmebaasiprefiksi WordPress ja muudab ainult tabeli Queuety segmenti.

## Sinu esimene töö

Loo käsitlejaklass, mis rakendab liidest `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,
        ];
    }
}
```

Registreeri see ja saada töö järjekorda:

```php
use Queuety\Queuety;

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

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

Või kasuta tänapäevast väljakutsutava töö klassi:

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

## Sinu esimene töövoog

Määra sammu käsitlejad, mis rakendavad liidest `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 [];
    }
}
```

Saada töövoog järjekorda:

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

## Käivita tööline

```bash
wp queuety work
```

Tööline otsib ootel töid, käivitab need, viib töövooge edasi ja jääb tühja järjekorra korral ootama. Peatamiseks vajuta `Ctrl+C`; see lõpetab protsessi kohe, ka keset tööd (vt [Workers](https://queuety.inline0.dev/et/docs/features/workers#worker-lifecycle)).

Ülaltoodud `SendEmailHandler` saadab oma tööd järjekorda `emails`, kasutades `config()`, seega järjekorda `default` jälgiv tööline neid kätte ei saa. Nimeta kõik kasutatavad järjekorrad:

```bash
wp queuety work --queue=emails,default
```

Kui sa spetsiaalset töölist ei käivita, on Queuety-il endiselt eespool kirjeldatud kord minutis käivitatav vaikimisi varulahendus WordPress cron, mis on piiratud järjekorraga `default` ja ühe tööga käivituse kohta. Spetsiaalne tööline pakub suuremat läbilaskevõimet ja väiksemat viivitust.

Tootmiskeskkonnas käivita mitu töölist:

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

Töötle mitut järjekorda prioriteetsuse järjekorras:

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

## Mis edasi

- [Jobs](https://queuety.inline0.dev/et/docs/jobs) täieliku järjekorda saatmise ja käsitlemise juhendi jaoks
- [Workflows](https://queuety.inline0.dev/et/docs/workflows) ahelate, paralleelsete sammude, tingimuslike harude ja töövoogude käivitamise kohta
- [Middleware](https://queuety.inline0.dev/et/docs/features/middleware) piirkiiruse, pärssimise ja kohandatud töötlusahela loogika jaoks
- [Batching](https://queuety.inline0.dev/et/docs/features/batching) töögruppide saatmiseks koos tagasihelistustega
- [Streaming Steps](https://queuety.inline0.dev/et/docs/workflows/streaming) voogedastatud andmete salvestamiseks osade kaupa
- [Scheduling](https://queuety.inline0.dev/et/docs/features/scheduling) korduvate tööde jaoks
- [Caching](https://queuety.inline0.dev/et/docs/features/caching) ühendatava vahemälukihi jaoks
- [Testing](https://queuety.inline0.dev/et/docs/features/testing) QueueFake'i ja testiväidete jaoks
- [CLI Reference](https://queuety.inline0.dev/et/docs/cli) kõigi saadaolevate käskude jaoks
- [PHP API](https://queuety.inline0.dev/et/docs/api) programmiliseks juurdepääsuks
