
# Kezdő lépések

## Telepítés

### Követelmények

- PHP 8.2 vagy újabb és WordPress 6.4 vagy újabb
- MySQL 8.0+ vagy MariaDB 10.6+. A workerek `SELECT ... FOR UPDATE SKIP LOCKED` segítségével veszik át a feladatokat és az esedékes ütemezéseket; a régebbi szerverek ezt szintaktikai hibával utasítják el.
- `mysqli` vagy `pdo_mysql` (lásd alább)
- WP-CLI a szerveren, ha dedikált workereket futtat `wp queuety work` segítségével
- A `pcntl` és `posix` PHP bővítmények, ha worker-készleteket futtat `--workers` vagy `--min-workers`/`--max-workers` segítségével

A Queuety használatához a WordPress és WP-CLI elemeket betöltő PHP futtatókörnyezetben vagy `mysqli`, vagy `pdo_mysql` szükséges. A rendszer automatikusan választ meghajtót: a WordPress futtatókörnyezetekben a `mysqli` megoldást részesíti előnyben, az önálló vagy közvetlen futtatókörnyezeti használathoz pedig elérhetővé teszi a `pdo_mysql` megoldást.

Ha az adatbázis-alapú futtatókörnyezetet a WordPress bővítményréteg nélkül szeretné használni, lásd az [Önálló használat](https://queuety.inline0.dev/hu/docs/features/standalone-use) oldalt. Ez az útvonal ugyanazt a kapcsolatot és futásidejű táblákat használja, de nem tartalmazza a WordPress hookhidakat és a WP-CLI regisztrációt.

### A kiadási zipből

Minden [GitHub kiadás](https://github.com/inline0/queuety/releases) tartalmaz egy `queuety.zip` csomagot: a bővítményt, amelynek Composer függőségei már telepítve vannak. Telepítse a legfrissebbet a WP-CLI paranccsal:

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

Vagy töltse le a zipfájlt, és töltse fel a Bővítmények > Új hozzáadása > Bővítmény feltöltése oldalon. Ez a legegyszerűbb megoldás egy hagyományos WordPress webhelyhez.

### Composer használatával, Composer által kezelt WordPress-hez

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

Ezután aktiválja a bővítményt:

```bash
wp plugin activate queuety
```

A csomag típusa `wordpress-plugin`. A Composer csak akkor helyezi el a bővítménykönyvtárban, ha a projektnek szüksége van a `composer/installers` elemre, és ezt a típust telepítési útvonalhoz rendeli, ahogy a Bedrock teszi; emellett a projektnek be kell töltenie a saját `vendor/autoload.php` elemét (ezt a Bedrock is megteszi). `composer/installers` nélkül a Composer a `vendor/queuety/queuety` könyvtárba telepíti, ahol a WordPress nem találja meg, ezért egyszerű WordPress telepítés esetén használja a kiadási zipet.

### Forráskódból fejlesztés közben

Helyezze az adattárat ide: `wp-content/plugins/queuety`, majd telepítse a PHP függőségeket:

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

Aktiváláskor a Queuety létrehozza az adatbázistábláit (`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`), hogy a workerek közvetlenül a MySQL rendszerből vehessék át a feladatokat.

Alapértelmezés szerint a bővítmény percenként egy egyszeri workert is ütemez a WordPress cron segítségével, a `default` sorhoz. Ez parancsértelmező nélküli alapmegoldást kínál a `default` rendszeren maradó feladatokhoz és munkafolyamatokhoz, amennyiben a WordPress cron rendszeresen lefut. Minden futás legfeljebb egy feladatot dolgoz fel, és nem futtat ismétlődő ütemezéseket, nem állítja helyre az elakadt feladatokat, és nem ellenőrzi a munkafolyamatok határidejét; ezek csak egy hosszú ideig futó `wp queuety work` folyamatban futnak ([#14](https://github.com/inline0/queuety/issues/14)). Egyéni sorokhoz, ismétlődő ütemezésekhez, kisebb késleltetéshez vagy nagyobb terheléshez váltson dedikált `wp queuety work` folyamatokra.

## Konfiguráció

Minden állandó megadása opcionális. Definiálja őket a `wp-config.php` fájlban a bővítmény betöltése előtt, vagy egy beágyazott, sablonstílusú telepítésben a Queuety indulása előtt:

| Állandó | Alapérték | Leírás |
|---|---|---|
| `QUEUETY_RETENTION_DAYS` | `7` | A `wp queuety purge` és `Queuety::purge()` alapértelmezett kora napokban. Automatikus törlés nincs |
| `QUEUETY_LOG_RETENTION_DAYS` | `0` | A `Config::log_retention_days()` beolvassa, de még nem használja; a naplók megmaradnak, amíg meg nem hívja a `Queuety::purge_logs()` függvényt ([#15](https://github.com/inline0/queuety/issues/15)) |
| `QUEUETY_MAX_EXECUTION_TIME` | `300` | Feladatonkénti maximális időtartam másodpercben a túllépés előtt (még nincs kikényszerítve, lásd a [Feladatok](https://queuety.inline0.dev/hu/docs/jobs#timeout) oldalt) |
| `QUEUETY_WORKER_SLEEP` | `1` | Várakozás másodpercben, ha a sor üres |
| `QUEUETY_WORKER_MAX_JOBS` | `1000` | Feladatok maximális száma a worker újraindítása előtt |
| `QUEUETY_WORKER_MAX_MEMORY` | `128` | Maximális memóriahasználat MB-ban a worker újraindítása előtt |
| `QUEUETY_RETRY_BACKOFF` | `exponential` | Késleltetési stratégia: `exponential`, `linear` vagy `fixed` |
| `QUEUETY_STALE_TIMEOUT` | `600` | Várakozás másodpercben az elakadt feladatok helyreállítása előtt |
| `QUEUETY_CACHE_TTL` | `5` | Alapértelmezett gyorsítótár-élettartam másodpercben |
| `QUEUETY_DEBUG` | `false` | Részletes worker-naplózás engedélyezése |
| `QUEUETY_CLI_COMMAND` | `queuety` | A gyökér WP-CLI parancs neve |
| `QUEUETY_TABLE_PREFIX` | `queuety_` | Az összes Queuety tábla közös alapneve a WordPress adatbázis-előtag után |
| `QUEUETY_TABLE_JOBS` | `queuety_jobs` | A feladatok táblájának neve |
| `QUEUETY_TABLE_WORKFLOWS` | `queuety_workflows` | A munkafolyamatok táblájának neve |
| `QUEUETY_TABLE_LOGS` | `queuety_logs` | A naplók táblájának neve |
| `QUEUETY_TABLE_SCHEDULES` | `queuety_schedules` | Az ütemezések táblájának neve |
| `QUEUETY_TABLE_SIGNALS` | `queuety_signals` | A jelek táblájának neve |
| `QUEUETY_TABLE_WORKFLOW_DEPENDENCIES` | `queuety_workflow_dependencies` | A munkafolyamat-függőségi várakozások táblájának neve |
| `QUEUETY_TABLE_WORKFLOW_DISPATCH_KEYS` | `queuety_workflow_dispatch_keys` | A tartós munkafolyamat-azonosítók kezelésére szolgáló tábla neve |
| `QUEUETY_TABLE_CHUNKS` | `queuety_chunks` | A streamelt adatrészek táblájának neve |
| `QUEUETY_TABLE_QUEUE_STATES` | `queuety_queue_states` | A sorállapotok táblájának neve |
| `QUEUETY_TABLE_WEBHOOKS` | `queuety_webhooks` | A webhookok táblájának neve |
| `QUEUETY_TABLE_LOCKS` | `queuety_locks` | A zárolások táblájának neve |
| `QUEUETY_TABLE_BATCHES` | `queuety_batches` | A kötegek táblájának neve |
| `QUEUETY_TABLE_WORKFLOW_EVENTS` | `queuety_workflow_events` | A munkafolyamat-eseménynapló táblájának neve |
| `QUEUETY_TABLE_ARTIFACTS` | `queuety_artifacts` | A munkafolyamat-összetevők táblájának neve |
| `QUEUETY_TABLE_STATE_MACHINES` | `queuety_state_machines` | Az állapotgépek táblájának neve |
| `QUEUETY_TABLE_STATE_MACHINE_EVENTS` | `queuety_state_machine_events` | Az állapotgép eseménynapló táblájának neve |
| `QUEUETY_DB_DRIVER` | `auto` | MySQL meghajtó: `auto`, `mysqli` vagy `pdo`. A `auto` a WordPress betöltésekor a `mysqli` megoldást részesíti előnyben; ellenkező esetben a `pdo_mysql`, majd a `mysqli` következik |

Az erőforrás-engedélyezés és az adaptív pool állandói (`QUEUETY_RESOURCE_*`, `QUEUETY_WORKER_POOL_*`) a [Workerek](https://queuety.inline0.dev/hu/docs/features/workers) oldalon vannak felsorolva.

A `QUEUETY_TABLE_PREFIX` csak a táblanevek Queuety részét módosítja. A WordPress adatbázis-előtag továbbra is körülveszi az eredményt, ezért a `$wpdb->prefix = 'wp_'` és `QUEUETY_TABLE_PREFIX = 'themequeue_'` például `wp_themequeue_jobs` táblákat eredményez. Az egyes táblákhoz megadott `QUEUETY_TABLE_*` állandók továbbra is elsőbbséget élveznek.

Az önálló kapcsolatok kapcsolatonként is beállíthatják a Queuety táblák előtagját:

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

Így a WordPress adatbázis-előtag változatlan marad, és csak a Queuety
táblarész módosul.

## Az első feladat

Hozzon létre egy kezelőosztályt, amely megvalósítja a `Handler` interfészt:

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

Regisztrálja, majd indítsa el:

```php
use Queuety\Queuety;

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

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

Vagy használja a modern, közvetlenül indítható feladatosztályt:

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

## Az első munkafolyamat

Adjon meg olyan lépéskezelőket, amelyek megvalósítják a `Step` interfészt:

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

Indítsa el a munkafolyamatot:

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

## Worker indítása

```bash
wp queuety work
```

A worker lekéri a függőben lévő feladatokat, végrehajtja őket, továbbviszi a munkafolyamatokat, és várakozik, ha a sor üres. Leállításhoz nyomja meg a `Ctrl+C` billentyűt; ezzel a folyamat azonnal véget ér, akár egy feladat közepén is (lásd a [Workerek](https://queuety.inline0.dev/hu/docs/features/workers#worker-lifecycle) oldalt).

A fenti `SendEmailHandler` a `config()` segítségével a `emails` sorba küldi a feladatokat, így a `default` soron futó worker nem veszi fel őket. Nevezzen meg minden használt sort:

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

Ha nem futtat dedikált workert, a Queuety továbbra is használja a fent leírt, percenként egyszer futó alapértelmezett WordPress cron megoldást, amely csak a `default` sorra és futásonként egy feladatra korlátozódik. A dedikált worker nagyobb teljesítményt és kisebb késleltetést biztosít.

Éles használat esetén futtasson több workert:

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

Több sor feldolgozása prioritási sorrendben:

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

## Merre tovább

- [Feladatok](https://queuety.inline0.dev/hu/docs/jobs) a feladatindítás és -kezelés teljes útmutatójához
- [Munkafolyamatok](https://queuety.inline0.dev/hu/docs/workflows) a láncok, párhuzamos lépések, feltételes elágazások és a munkafolyamatok futtatásának leírásához
- [Middleware](https://queuety.inline0.dev/hu/docs/features/middleware) a sebességkorlátozáshoz, a terhelésszabályozáshoz és az egyéni folyamatlogikához
- [Kötegelt feldolgozás](https://queuety.inline0.dev/hu/docs/features/batching) visszahívásokkal indítható feladatcsoportokhoz
- [Streamelt lépések](https://queuety.inline0.dev/hu/docs/workflows/streaming) a streamelt adatok részenkénti megőrzéséhez
- [Ütemezés](https://queuety.inline0.dev/hu/docs/features/scheduling) az ismétlődő feladatokhoz
- [Gyorsítótárazás](https://queuety.inline0.dev/hu/docs/features/caching) a bővíthető gyorsítótárréteghez
- [Tesztelés](https://queuety.inline0.dev/hu/docs/features/testing) a QueueFake használatához és a tesztállításokhoz
- [CLI hivatkozás](https://queuety.inline0.dev/hu/docs/cli) az összes elérhető parancshoz
- [PHP API](https://queuety.inline0.dev/hu/docs/api) a programozott hozzáféréshez
