
# Ξεκινώντας

## Εγκατάσταση

### Απαιτήσεις

- PHP 8.2 ή μεταγενέστερη έκδοση και WordPress 6.4 ή μεταγενέστερη έκδοση
- MySQL 8.0+ ή MariaDB 10.6+. Οι εργάτες δεσμεύουν εργασίες και προγραμματισμένα συμβάντα με το `SELECT ... FOR UPDATE SKIP LOCKED`, το οποίο οι παλαιότεροι διακομιστές απορρίπτουν με συντακτικό σφάλμα.
- `mysqli` ή `pdo_mysql` (δείτε παρακάτω)
- WP-CLI στον διακομιστή, αν εκτελείτε αποκλειστικούς εργάτες με το `wp queuety work`
- Οι επεκτάσεις `pcntl` και `posix` PHP, αν εκτελείτε ομάδες εργατών με `--workers` ή `--min-workers`/`--max-workers`

Το Queuety απαιτεί είτε το `mysqli` είτε το `pdo_mysql` στο περιβάλλον εκτέλεσης PHP που φορτώνει τα WordPress και WP-CLI. Επιλέγει αυτόματα το πρόγραμμα οδήγησης, προτιμώντας το `mysqli` για περιβάλλοντα εκτέλεσης WordPress και διατηρώντας διαθέσιμο το `pdo_mysql` για αυτόνομη ή άμεση χρήση.

Αν θέλετε το περιβάλλον εκτέλεσης με βάση τη βάση δεδομένων χωρίς το επίπεδο πρόσθετου WordPress, ανατρέξτε στην ενότητα [Αυτόνομη χρήση](https://queuety.inline0.dev/el/docs/features/standalone-use). Αυτή η διαδρομή χρησιμοποιεί την ίδια σύνδεση και τους ίδιους πίνακες περιβάλλοντος εκτέλεσης, αλλά δεν περιλαμβάνει τις γέφυρες hooks WordPress ή την καταχώριση WP-CLI.

### Από το αρχείο zip της έκδοσης

Κάθε [έκδοση GitHub](https://github.com/inline0/queuety/releases) έχει ένα αρχείο `queuety.zip`: το πρόσθετο με τις εξαρτήσεις Composer ήδη εγκατεστημένες. Εγκαταστήστε την πιο πρόσφατη έκδοση με το WP-CLI:

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

Ή κατεβάστε το αρχείο zip και μεταφορτώστε το από την επιλογή Πρόσθετα > Προσθήκη νέου > Μεταφόρτωση πρόσθετου. Αυτή είναι η απλούστερη διαδρομή για έναν συνηθισμένο ιστότοπο WordPress.

### Μέσω του Composer για περιβάλλον WordPress με διαχείριση Composer

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

Στη συνέχεια, ενεργοποιήστε το πρόσθετο:

```bash
wp plugin activate queuety
```

Ο τύπος του πακέτου είναι `wordpress-plugin`. Το Composer το τοποθετεί στον κατάλογο πρόσθετων μόνο όταν το έργο απαιτεί `composer/installers` και αντιστοιχίζει αυτόν τον τύπο σε μια διαδρομή εγκατάστασης, όπως κάνει το Bedrock, ενώ το έργο πρέπει να φορτώνει το δικό του `vendor/autoload.php` (το κάνει και το Bedrock). Χωρίς το `composer/installers`, το Composer το εγκαθιστά στο `vendor/queuety/queuety`, όπου το WordPress δεν το εντοπίζει, οπότε χρησιμοποιήστε το zip της έκδοσης σε μια απλή εγκατάσταση WordPress.

### Από τον πηγαίο κώδικα κατά την ανάπτυξη

Τοποθετήστε το αποθετήριο στο `wp-content/plugins/queuety` και, στη συνέχεια, εγκαταστήστε τις εξαρτήσεις του PHP:

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

Κατά την ενεργοποίηση, το Queuety δημιουργεί τους πίνακες της βάσης δεδομένων του (`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`), ώστε οι workers να μπορούν να αναλαμβάνουν εργασίες απευθείας από το MySQL.

Από προεπιλογή, το πρόσθετο προγραμματίζει επίσης έναν worker μίας εκτέλεσης μέσω του WordPress cron κάθε λεπτό για την ουρά `default`. Έτσι έχετε μια βασική λύση χωρίς shell για εργασίες και ροές εργασίας που εκτελούνται στο `default`, εφόσον ενεργοποιείται το WordPress cron. Κάθε εκτέλεση επεξεργάζεται το πολύ μία εργασία και δεν ενεργοποιεί επαναλαμβανόμενα προγράμματα, δεν ανακτά παλιές εργασίες ούτε ελέγχει προθεσμίες ροών εργασίας· αυτά εκτελούνται μόνο μέσα σε μια διεργασία `wp queuety work` μεγάλης διάρκειας ([#14](https://github.com/inline0/queuety/issues/14)). Για προσαρμοσμένες ουρές, επαναλαμβανόμενα προγράμματα, μικρότερη καθυστέρηση ή μεγαλύτερο φόρτο, χρησιμοποιήστε αποκλειστικές διεργασίες `wp queuety work`.

## Διαμόρφωση

Όλες οι σταθερές είναι προαιρετικές. Ορίστε τις στο `wp-config.php` πριν φορτωθεί το πρόσθετο ή πριν εκκινηθεί το Queuety σε ενσωματωμένη εγκατάσταση τύπου θέματος:

| Σταθερά | Προεπιλογή | Περιγραφή |
|---|---|---|
| `QUEUETY_RETENTION_DAYS` | `7` | Προεπιλεγμένη ηλικία σε ημέρες για τα `wp queuety purge` και `Queuety::purge()`. Δεν διαγράφεται τίποτα αυτόματα |
| `QUEUETY_LOG_RETENTION_DAYS` | `0` | Διαβάζεται από το `Config::log_retention_days()` αλλά δεν χρησιμοποιείται ακόμη· τα αρχεία καταγραφής διατηρούνται μέχρι να καλέσετε το `Queuety::purge_logs()` ([#15](https://github.com/inline0/queuety/issues/15)) |
| `QUEUETY_MAX_EXECUTION_TIME` | `300` | Μέγιστα δευτερόλεπτα ανά εργασία πριν από τη λήξη του χρονικού ορίου (δεν εφαρμόζεται ακόμη, δείτε [Εργασίες](https://queuety.inline0.dev/el/docs/jobs#timeout)) |
| `QUEUETY_WORKER_SLEEP` | `1` | Δευτερόλεπτα αναμονής όταν η ουρά είναι κενή |
| `QUEUETY_WORKER_MAX_JOBS` | `1000` | Μέγιστος αριθμός εργασιών πριν από την επανεκκίνηση του worker |
| `QUEUETY_WORKER_MAX_MEMORY` | `128` | Μέγιστα MB πριν από την επανεκκίνηση του worker |
| `QUEUETY_RETRY_BACKOFF` | `exponential` | Στρατηγική αναμονής: `exponential`, `linear` ή `fixed` |
| `QUEUETY_STALE_TIMEOUT` | `600` | Δευτερόλεπτα μέχρι την ανάκτηση κολλημένων εργασιών |
| `QUEUETY_CACHE_TTL` | `5` | Προεπιλεγμένος χρόνος ζωής της cache σε δευτερόλεπτα |
| `QUEUETY_DEBUG` | `false` | Ενεργοποίηση αναλυτικής καταγραφής από τον worker |
| `QUEUETY_CLI_COMMAND` | `queuety` | Όνομα ριζικής εντολής WP-CLI |
| `QUEUETY_TABLE_PREFIX` | `queuety_` | Κοινό βασικό όνομα για όλους τους πίνακες Queuety μετά το πρόθεμα βάσης δεδομένων WordPress |
| `QUEUETY_TABLE_JOBS` | `queuety_jobs` | Όνομα πίνακα εργασιών |
| `QUEUETY_TABLE_WORKFLOWS` | `queuety_workflows` | Όνομα πίνακα ροών εργασίας |
| `QUEUETY_TABLE_LOGS` | `queuety_logs` | Όνομα πίνακα αρχείων καταγραφής |
| `QUEUETY_TABLE_SCHEDULES` | `queuety_schedules` | Όνομα πίνακα προγραμμάτων |
| `QUEUETY_TABLE_SIGNALS` | `queuety_signals` | Όνομα πίνακα σημάτων |
| `QUEUETY_TABLE_WORKFLOW_DEPENDENCIES` | `queuety_workflow_dependencies` | Όνομα πίνακα αναμονών εξαρτήσεων ροών εργασίας |
| `QUEUETY_TABLE_WORKFLOW_DISPATCH_KEYS` | `queuety_workflow_dispatch_keys` | Όνομα πίνακα ιδιοδυναμίας διαρκών ροών εργασίας |
| `QUEUETY_TABLE_CHUNKS` | `queuety_chunks` | Όνομα πίνακα τμημάτων ροής δεδομένων |
| `QUEUETY_TABLE_QUEUE_STATES` | `queuety_queue_states` | Όνομα πίνακα καταστάσεων ουράς |
| `QUEUETY_TABLE_WEBHOOKS` | `queuety_webhooks` | Όνομα πίνακα webhook |
| `QUEUETY_TABLE_LOCKS` | `queuety_locks` | Όνομα πίνακα κλειδωμάτων |
| `QUEUETY_TABLE_BATCHES` | `queuety_batches` | Όνομα πίνακα δεσμών εργασιών |
| `QUEUETY_TABLE_WORKFLOW_EVENTS` | `queuety_workflow_events` | Όνομα πίνακα αρχείου συμβάντων ροής εργασίας |
| `QUEUETY_TABLE_ARTIFACTS` | `queuety_artifacts` | Όνομα πίνακα τεχνουργημάτων ροής εργασίας |
| `QUEUETY_TABLE_STATE_MACHINES` | `queuety_state_machines` | Όνομα πίνακα μηχανών καταστάσεων |
| `QUEUETY_TABLE_STATE_MACHINE_EVENTS` | `queuety_state_machine_events` | Όνομα πίνακα αρχείου συμβάντων μηχανής καταστάσεων |
| `QUEUETY_DB_DRIVER` | `auto` | Οδηγός MySQL: `auto`, `mysqli` ή `pdo`. Το `auto` προτιμά το `mysqli` όταν έχει φορτωθεί το WordPress, διαφορετικά το `pdo_mysql` και έπειτα το `mysqli` |

Οι σταθερές αποδοχής πόρων και προσαρμοστικής ομάδας διεργασιών (`QUEUETY_RESOURCE_*`, `QUEUETY_WORKER_POOL_*`) παρατίθενται στη σελίδα [Workers](https://queuety.inline0.dev/el/docs/features/workers).

Το `QUEUETY_TABLE_PREFIX` αλλάζει μόνο το τμήμα Queuety των ονομάτων πινάκων. Το πρόθεμα βάσης δεδομένων WordPress εξακολουθεί να περιβάλλει το αποτέλεσμα, επομένως τα `$wpdb->prefix = 'wp_'` και `QUEUETY_TABLE_PREFIX = 'themequeue_'` δημιουργούν πίνακες όπως το `wp_themequeue_jobs`. Οι ρητές σταθερές `QUEUETY_TABLE_*` εξακολουθούν να υπερισχύουν για μεμονωμένους πίνακες.

Οι αυτόνομες συνδέσεις μπορούν επίσης να ορίσουν το πρόθεμα πινάκων Queuety ανά σύνδεση:

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

Έτσι διατηρείται ανέπαφο το πρόθεμα βάσης δεδομένων WordPress και αλλάζει μόνο το τμήμα πίνακα Queuety.

## Η πρώτη σας εργασία

Δημιουργήστε μια κλάση χειριστή που υλοποιεί τη διεπαφή `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,
        ];
    }
}
```

Καταχωρίστε την και αποστείλετε την εργασία:

```php
use Queuety\Queuety;

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

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

Ή χρησιμοποιήστε τη σύγχρονη κλάση εργασίας με δυνατότητα αποστολής:

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

## Η πρώτη σας ροή εργασίας

Ορίστε χειριστές βημάτων που υλοποιούν τη διεπαφή `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 [];
    }
}
```

Αποστείλετε τη ροή εργασίας:

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

## Εκκίνηση worker

```bash
wp queuety work
```

Ο worker αναζητά εκκρεμείς εργασίες, τις εκτελεί, προχωρά τις ροές εργασίας και περιμένει όταν η ουρά είναι κενή. Πατήστε `Ctrl+C` για διακοπή· η διεργασία τερματίζεται αμέσως, ακόμη και στη μέση μιας εργασίας (δείτε [Workers](https://queuety.inline0.dev/el/docs/features/workers#worker-lifecycle)).

Η παραπάνω `SendEmailHandler` στέλνει τις εργασίες της στην ουρά `emails` μέσω του `config()`, οπότε ένας worker στην `default` δεν τις αναλαμβάνει. Ονομάστε κάθε ουρά που χρησιμοποιείτε:

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

Αν δεν εκτελείτε αποκλειστικό worker, το Queuety εξακολουθεί να διαθέτει την προεπιλεγμένη εναλλακτική WordPress cron ανά λεπτό που περιγράφηκε παραπάνω, περιορισμένη στην ουρά `default` και σε μία εργασία ανά εκτέλεση. Ο αποκλειστικός worker προσφέρει μεγαλύτερη διεκπεραιωτική ικανότητα και μικρότερη καθυστέρηση.

Για περιβάλλον παραγωγής, εκτελέστε πολλούς workers:

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

Επεξεργαστείτε πολλές ουρές με σειρά προτεραιότητας:

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

## Τι ακολουθεί

- [Εργασίες](https://queuety.inline0.dev/el/docs/jobs) για τον πλήρη οδηγό αποστολής και χειρισμού
- [Ροές εργασίας](https://queuety.inline0.dev/el/docs/workflows) για αλυσίδες, παράλληλα βήματα, διακλάδωση υπό όρους και ροές εργασίας εκτέλεσης
- [Ενδιάμεσο λογισμικό](https://queuety.inline0.dev/el/docs/features/middleware) για περιορισμό ρυθμού, περιορισμό συχνότητας και προσαρμοσμένη λογική αγωγού
- [Ομαδοποίηση](https://queuety.inline0.dev/el/docs/features/batching) για αποστολή ομάδων εργασιών με συναρτήσεις επανάκλησης
- [Βήματα ροής δεδομένων](https://queuety.inline0.dev/el/docs/workflows/streaming) για αποθήκευση δεδομένων ροής τμηματικά
- [Προγραμματισμός](https://queuety.inline0.dev/el/docs/features/scheduling) για επαναλαμβανόμενες εργασίες
- [Προσωρινή αποθήκευση](https://queuety.inline0.dev/el/docs/features/caching) για την επεκτάσιμη βαθμίδα cache
- [Δοκιμές](https://queuety.inline0.dev/el/docs/features/testing) για το QueueFake και τις επιβεβαιώσεις δοκιμών
- [ΑναφοράCLI ](https://queuety.inline0.dev/el/docs/cli) για όλες τις διαθέσιμες εντολές
- [PHP API](https://queuety.inline0.dev/el/docs/api) για προγραμματική πρόσβαση
