
# Darba sākšana

## Instalēšana

### Prasības

- PHP 8.2 vai jaunāka versija un WordPress 6.4 vai jaunāka versija
- MySQL 8.0+ vai MariaDB 10.6+. Darbinieki pārņem darbus un izpildāmos grafikus, izmantojot `SELECT ... FOR UPDATE SKIP LOCKED`, ko vecāki serveri noraida ar sintakses kļūdu.
- `mysqli` vai `pdo_mysql` (skatiet tālāk)
- Serverī jābūt WP-CLI, ja darbinieki darbojas atsevišķi ar `wp queuety work`
- `pcntl` un `posix` PHP paplašinājumi, ja darbinieku kopas darbojas ar `--workers` vai `--min-workers`/`--max-workers`

Queuety nepieciešams vai nu `mysqli`, vai `pdo_mysql` izpildvidē, kas ielādē WordPress un WP-CLI PHP. Draiveri tas izvēlas automātiski, dodot priekšroku `mysqli` WordPress izpildvidēs un saglabājot `pdo_mysql` atsevišķai vai tiešai izpildvides lietošanai.

Ja nepieciešama DB atbalstīta izpildvide bez WordPress spraudņa slāņa, skatiet sadaļu [Atsevišķa izmantošana](https://queuety.inline0.dev/lv/docs/features/standalone-use). Šajā gadījumā tiek izmantots tas pats savienojums un izpildvides tabulas, taču nav iekļauti WordPress āķu tilti vai WP-CLI reģistrācija.

### No laidiena ZIP arhīva

Katram [GitHub laidienam](https://github.com/inline0/queuety/releases) ir `queuety.zip` fails: spraudnis, kuram Composer atkarības jau ir instalētas. Instalējiet jaunāko laidienu ar WP-CLI:

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

Varat arī lejupielādēt ZIP arhīvu un augšupielādēt to sadaļā Plugins > Add New > Upload Plugin. Šis ir vienkāršākais risinājums parastai WordPress vietnei.

### Ar Composer, izmantojot Composer pārvaldītu WordPress

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

Pēc tam aktivizējiet spraudni:

```bash
wp plugin activate queuety
```

Pakotnes tips ir `wordpress-plugin`. Composer ievieto to spraudņu mapē tikai tad, ja projektā nepieciešams `composer/installers` un šis tips ir piesaistīts instalācijas ceļam, kā to dara Bedrock; projektam jāielādē arī savs `vendor/autoload.php` (to dara arī Bedrock). Bez `composer/installers` Composer to instalē mapē `vendor/queuety/queuety`, kur to neatrod WordPress, tāpēc parastā WordPress instalācijā izmantojiet laidiena ZIP arhīvu.

### No avota koda izstrādes laikā

Ievietojiet repozitoriju mapē `wp-content/plugins/queuety` un pēc tam instalējiet PHP atkarības:

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

Aktivizēšanas laikā Queuety izveido savas datubāzes tabulas (`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`), lai darbinieki varētu pārņemt darbus tieši no MySQL.

Pēc noklusējuma spraudnis ik minūti ieplāno vienreizēju darbinieka palaišanu, izmantojot WordPress cron, rindai `default`. Tas nodrošina pamata darbu un darbplūsmu izpildi bez čaulas, ja tās darbojas `default` un tiek izsaukts WordPress cron. Katrā palaišanas reizē tiek apstrādāts ne vairāk kā viens darbs, un netiek palaisti periodiskie grafiki, atkoptie novecojušie darbi vai pārbaudīti darbplūsmu termiņi; tas viss notiek tikai ilgstoši darbojošā `wp queuety work` procesā ([#14](https://github.com/inline0/queuety/issues/14)). Pielāgotām rindām, periodiskiem grafikiem, mazākai aizkavei vai lielākai darba slodzei pārejiet uz atsevišķiem `wp queuety work` procesiem.

## Konfigurācija

Visas konstantes nav obligātas. Definējiet tās failā `wp-config.php` pirms spraudņa ielādes vai pirms Queuety palaišanas iegultā, tēmas tipa instalācijā:

| Konstante | Noklusējums | Apraksts |
|---|---|---|
| `QUEUETY_RETENTION_DAYS` | `7` | Noklusējuma vecums dienās priekš `wp queuety purge` un `Queuety::purge()`. Nekas netiek dzēsts automātiski |
| `QUEUETY_LOG_RETENTION_DAYS` | `0` | Nolasa `Config::log_retention_days()`, bet vēl neizmanto; žurnāli tiek saglabāti, līdz izsaucat `Queuety::purge_logs()` ([#15](https://github.com/inline0/queuety/issues/15)) |
| `QUEUETY_MAX_EXECUTION_TIME` | `300` | Maksimālais sekunžu skaits vienam uzdevumam pirms taimauta (vēl netiek piemērots; skatiet [Uzdevumi](https://queuety.inline0.dev/lv/docs/jobs#timeout)) |
| `QUEUETY_WORKER_SLEEP` | `1` | Sekunžu skaits, ko gaidīt, kad rinda ir tukša |
| `QUEUETY_WORKER_MAX_JOBS` | `1000` | Maksimālais uzdevumu skaits pirms darba process tiek restartēts |
| `QUEUETY_WORKER_MAX_MEMORY` | `128` | Maksimālais MB skaits pirms darba process tiek restartēts |
| `QUEUETY_RETRY_BACKOFF` | `exponential` | Atkāpšanās stratēģija: `exponential`, `linear` vai `fixed` |
| `QUEUETY_STALE_TIMEOUT` | `600` | Sekunžu skaits, pēc kura tiek atgūti iestrēguši uzdevumi |
| `QUEUETY_CACHE_TTL` | `5` | Noklusējuma kešatmiņas TTL sekundēs |
| `QUEUETY_DEBUG` | `false` | Iespējot detalizētu darba procesa žurnalēšanu |
| `QUEUETY_CLI_COMMAND` | `queuety` | Saknes WP-CLI komandas nosaukums |
| `QUEUETY_TABLE_PREFIX` | `queuety_` | Kopīgs bāzes nosaukums visām Queuety tabulām aiz WordPress DB prefiksa |
| `QUEUETY_TABLE_JOBS` | `queuety_jobs` | Uzdevumu tabulas nosaukums |
| `QUEUETY_TABLE_WORKFLOWS` | `queuety_workflows` | Darbplūsmu tabulas nosaukums |
| `QUEUETY_TABLE_LOGS` | `queuety_logs` | Žurnālu tabulas nosaukums |
| `QUEUETY_TABLE_SCHEDULES` | `queuety_schedules` | Grafiku tabulas nosaukums |
| `QUEUETY_TABLE_SIGNALS` | `queuety_signals` | Signālu tabulas nosaukums |
| `QUEUETY_TABLE_WORKFLOW_DEPENDENCIES` | `queuety_workflow_dependencies` | Darbplūsmu atkarību gaidīšanas tabulas nosaukums |
| `QUEUETY_TABLE_WORKFLOW_DISPATCH_KEYS` | `queuety_workflow_dispatch_keys` | Noturīgas darbplūsmas idempotences tabulas nosaukums |
| `QUEUETY_TABLE_CHUNKS` | `queuety_chunks` | Straumēšanas fragmentu tabulas nosaukums |
| `QUEUETY_TABLE_QUEUE_STATES` | `queuety_queue_states` | Rindu stāvokļu tabulas nosaukums |
| `QUEUETY_TABLE_WEBHOOKS` | `queuety_webhooks` | Tīmekļa āķu tabulas nosaukums |
| `QUEUETY_TABLE_LOCKS` | `queuety_locks` | Slēdzeņu tabulas nosaukums |
| `QUEUETY_TABLE_BATCHES` | `queuety_batches` | Partiju tabulas nosaukums |
| `QUEUETY_TABLE_WORKFLOW_EVENTS` | `queuety_workflow_events` | Darbplūsmas notikumu žurnāla tabulas nosaukums |
| `QUEUETY_TABLE_ARTIFACTS` | `queuety_artifacts` | Darbplūsmas artefaktu tabulas nosaukums |
| `QUEUETY_TABLE_STATE_MACHINES` | `queuety_state_machines` | Stāvokļu mašīnu tabulas nosaukums |
| `QUEUETY_TABLE_STATE_MACHINE_EVENTS` | `queuety_state_machine_events` | Stāvokļu mašīnu notikumu žurnāla tabulas nosaukums |
| `QUEUETY_DB_DRIVER` | `auto` | MySQL draiveris: `auto`, `mysqli` vai `pdo`. `auto` dod priekšroku `mysqli`, ja ir ielādēts WordPress, citādi `pdo_mysql` un pēc tam `mysqli` |

Resursu piešķiršanas un adaptīvā pūla konstantes (`QUEUETY_RESOURCE_*`, `QUEUETY_WORKER_POOL_*`) ir norādītas lapā [Workers](https://queuety.inline0.dev/lv/docs/features/workers).

`QUEUETY_TABLE_PREFIX` maina tikai tabulu nosaukumu daļu Queuety. WordPress datubāzes prefikss joprojām tiek pievienots rezultātam, tāpēc `$wpdb->prefix = 'wp_'` un `QUEUETY_TABLE_PREFIX = 'themequeue_'` veido tādas tabulas kā `wp_themequeue_jobs`. Atsevišķām tabulām joprojām ir prioritāte skaidri norādītajām konstantēm `QUEUETY_TABLE_*`.

Atsevišķiem savienojumiem var iestatīt arī tabulu prefiksu Queuety katram savienojumam:

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

Tādējādi tiek saglabāts WordPress datubāzes prefikss un mainīts tikai Queuety
tabulas segments.

## Jūsu pirmais uzdevums

Izveidojiet apdarinātāja klasi, kas implementē saskarni `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,
        ];
    }
}
```

Reģistrējiet to un nosūtiet:

```php
use Queuety\Queuety;

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

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

Vai izmantojiet mūsdienīgu nosūtāma uzdevuma klasi:

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

## Jūsu pirmā darbplūsma

Definējiet soļu apdarinātājus, kas implementē saskarni `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 [];
    }
}
```

Nosūtiet darbplūsmu:

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

## Palaidiet darba procesu

```bash
wp queuety work
```

Darba process pārbauda, vai ir neapstrādāti uzdevumi, izpilda tos, virza darbplūsmas uz priekšu un gaida, kad rinda ir tukša. Nospiediet `Ctrl+C`, lai apturētu; process beigsies nekavējoties, pat ja uzdevums vēl tiek izpildīts (skatiet [Workers](https://queuety.inline0.dev/lv/docs/features/workers#worker-lifecycle)).

Iepriekš minētais `SendEmailHandler` nosūta savus uzdevumus uz rindu `emails`, izmantojot `config()`, tāpēc darba process, kas darbojas ar `default`, tos nepaņems. Norādiet visu izmantoto rindu nosaukumus:

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

Ja nepalaižat īpašu darba procesu, Queuety joprojām izmanto iepriekš aprakstīto noklusējuma WordPress reizi minūtē cron rezerves mehānismu, kas darbojas tikai ar rindu `default` un apstrādā vienu uzdevumu katrā palaišanas reizē. Īpašs darba process nodrošina lielāku caurlaidspēju un mazāku latentumu.

Produkcijas vidē palaidiet vairākus darba procesus:

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

Apstrādājiet vairākas rindas, ievērojot prioritāšu secību:

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

## Kas tālāk

- [Uzdevumi](https://queuety.inline0.dev/lv/docs/jobs), lai iegūtu pilnu nosūtīšanas un apdarinātāju ceļvedi
- [Darbplūsmas](https://queuety.inline0.dev/lv/docs/workflows), lai uzzinātu par ķēdēm, paralēliem soļiem, nosacījumu sazarojumiem un darbplūsmu palaišanu
- [Starpprogrammatūra](https://queuety.inline0.dev/lv/docs/features/middleware), lai uzzinātu par ātruma ierobežošanu, slāpēšanu un pielāgotu konveijera loģiku
- [Partiju apstrāde](https://queuety.inline0.dev/lv/docs/features/batching), lai uzzinātu, kā nosūtīt uzdevumu grupas ar atzvanīšanas funkcijām
- [Straumēšanas soļi](https://queuety.inline0.dev/lv/docs/workflows/streaming), lai uzzinātu, kā saglabāt straumētus datus pa fragmentiem
- [Plānošana](https://queuety.inline0.dev/lv/docs/features/scheduling), lai uzzinātu par atkārtotiem uzdevumiem
- [Kešošana](https://queuety.inline0.dev/lv/docs/features/caching), lai uzzinātu par pievienojamo kešatmiņas slāni
- [Testēšana](https://queuety.inline0.dev/lv/docs/features/testing), lai uzzinātu par QueueFake un testu pārbaudēm
- [CLI Atsauce](https://queuety.inline0.dev/lv/docs/cli), lai uzzinātu par visām pieejamajām komandām
- [PHP API](https://queuety.inline0.dev/lv/docs/api), lai uzzinātu par piekļuvi programmatiski
