
# Başlarken

## Kurulum

### Gereksinimler

- PHP 8.2 veya üzeri ve WordPress 6.4 veya üzeri
- MySQL 8.0+ veya MariaDB 10.6+. Çalışanlar, işleri ve zamanı gelen zamanlamaları `SELECT ... FOR UPDATE SKIP LOCKED` ile alır; eski sunucular bunu söz dizimi hatasıyla reddeder.
- `mysqli` veya `pdo_mysql` (aşağıya bakın)
- WP-CLI ile özel çalışanlar çalıştırıyorsanız sunucuda `wp queuety work`
- `--workers` veya `--min-workers`/`--max-workers` ile çalışan havuzları çalıştırıyorsanız `pcntl` ve `posix` PHP uzantıları

Queuety için, WordPress ve WP-CLI dosyalarını yükleyen PHP çalışma ortamında `mysqli` veya `pdo_mysql` gerekir. Sürücüyü otomatik seçer; WordPress çalışma ortamlarında `mysqli` tercih eder ve tek başına/doğrudan çalışma zamanı kullanımında `pdo_mysql` seçeneğini kullanıma hazır tutar.

WordPress eklenti katmanı olmadan veritabanı destekli çalışma zamanını kullanmak istiyorsanız [Tek Başına Kullanım](https://queuety.inline0.dev/tr/docs/features/standalone-use) sayfasına bakın. Bu yol aynı bağlantıyı ve çalışma zamanı tablolarını kullanır, ancak WordPress kanca köprülerini veya WP-CLI kaydını içermez.

### Sürüm zip dosyasından

Her [GitHub sürüm](https://github.com/inline0/queuety/releases) dosyasında bir `queuety.zip` paketi bulunur: Composer bağımlılıkları önceden kurulmuş eklenti. En son sürümü WP-CLI ile kurun:

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

Alternatif olarak zip dosyasını indirip Eklentiler > Yeni Ekle > Eklenti Yükle bölümüne yükleyin. Bu, standart bir WordPress sitesi için en kolay yoldur.

### Composer ile Composer yönetimli WordPress için

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

Ardından eklentiyi etkinleştirin:

```bash
wp plugin activate queuety
```

Paket türü `wordpress-plugin` şeklindedir. Composer, projede `composer/installers` gerektiğinde paketi yalnızca eklentiler dizininize yerleştirir ve bu türü yükleyici yoluna eşler; Bedrock bunu yapar ve projenin kendi `vendor/autoload.php` öğesini yüklemesi gerekir (Bedrock de bunu yapar). `composer/installers` olmadan Composer paketi `vendor/queuety/queuety` içine kurar; burada WordPress paketi bulamaz. Bu nedenle standart bir WordPress kurulumunda sürüm zip dosyasını kullanın.

### Geliştirme sırasında kaynaktan

Depoyu `wp-content/plugins/queuety` içine yerleştirin, ardından PHP bağımlılıklarını yükleyin:

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

Etkinleştirildiğinde Queuety, çalışanların işleri doğrudan MySQL üzerinden alabilmesi için veritabanı tablolarını oluşturur (`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`).

Varsayılan olarak eklenti, `default` kuyruğu için her dakika WordPress cron üzerinden tek seferlik bir çalışan da zamanlar. Böylece `default` üzerinde kalan işler ve iş akışları için kabuk gerektirmeyen bir temel sunar; bunun için WordPress cron tetikleniyor olmalıdır. Her çalıştırma en fazla bir işi işler; yinelenen zamanlamaları çalıştırmaz, eski işleri kurtarmaz veya iş akışı son tarihlerini denetlemez. Bunlar yalnızca uzun süre çalışan bir `wp queuety work` sürecinde yürütülür ([No. 14](https://github.com/inline0/queuety/issues/14)). Özel kuyruklar, yinelenen zamanlamalar, daha düşük gecikme veya daha yoğun iş yükleri için özel `wp queuety work` süreçlerine geçin.

## Yapılandırma

Tüm sabitler isteğe bağlıdır. Eklenti yüklenmeden önce veya temaya gömülü kurulumda Queuety başlatılmadan önce bunları `wp-config.php` içinde tanımlayın:

| Sabit | Varsayılan | Açıklama |
|---|---|---|
| `QUEUETY_RETENTION_DAYS` | `7` | `wp queuety purge` ve `Queuety::purge()` için varsayılan gün yaşı. Otomatik temizleme yapılmaz |
| `QUEUETY_LOG_RETENTION_DAYS` | `0` | `Config::log_retention_days()` tarafından okunur ancak henüz kullanılmaz; `Queuety::purge_logs()` ([No. 15](https://github.com/inline0/queuety/issues/15)) çağrılana kadar günlükler tutulur |
| `QUEUETY_MAX_EXECUTION_TIME` | `300` | Zaman aşımından önce iş başına en fazla saniye sayısı (henüz uygulanmıyor, bkz. [İşler](https://queuety.inline0.dev/tr/docs/jobs#timeout)) |
| `QUEUETY_WORKER_SLEEP` | `1` | Kuyruk boşken beklenecek saniye sayısı |
| `QUEUETY_WORKER_MAX_JOBS` | `1000` | Çalışan yeniden başlatılmadan önceki en fazla iş sayısı |
| `QUEUETY_WORKER_MAX_MEMORY` | `128` | Çalışan yeniden başlatılmadan önceki en fazla MB miktarı |
| `QUEUETY_RETRY_BACKOFF` | `exponential` | Geri çekilme stratejisi: `exponential`, `linear` veya `fixed` |
| `QUEUETY_STALE_TIMEOUT` | `600` | Takılı kalan işler kurtarılmadan önceki saniye sayısı |
| `QUEUETY_CACHE_TTL` | `5` | Varsayılan önbellek TTL değeri (saniye) |
| `QUEUETY_DEBUG` | `false` | Ayrıntılı çalışan günlüklerini etkinleştir |
| `QUEUETY_CLI_COMMAND` | `queuety` | Kök WP-CLI komut adı |
| `QUEUETY_TABLE_PREFIX` | `queuety_` | WordPress DB önekinden sonra tüm Queuety tabloları için ortak temel ad |
| `QUEUETY_TABLE_JOBS` | `queuety_jobs` | İşler tablosunun adı |
| `QUEUETY_TABLE_WORKFLOWS` | `queuety_workflows` | İş akışları tablosunun adı |
| `QUEUETY_TABLE_LOGS` | `queuety_logs` | Günlükler tablosunun adı |
| `QUEUETY_TABLE_SCHEDULES` | `queuety_schedules` | Zamanlamalar tablosunun adı |
| `QUEUETY_TABLE_SIGNALS` | `queuety_signals` | Sinyaller tablosunun adı |
| `QUEUETY_TABLE_WORKFLOW_DEPENDENCIES` | `queuety_workflow_dependencies` | İş akışı bağımlılık beklemeleri tablosunun adı |
| `QUEUETY_TABLE_WORKFLOW_DISPATCH_KEYS` | `queuety_workflow_dispatch_keys` | Kalıcı iş akışı idempotensi tablosunun adı |
| `QUEUETY_TABLE_CHUNKS` | `queuety_chunks` | Akış parçaları tablosunun adı |
| `QUEUETY_TABLE_QUEUE_STATES` | `queuety_queue_states` | Kuyruk durumları tablosunun adı |
| `QUEUETY_TABLE_WEBHOOKS` | `queuety_webhooks` | Webhook'lar tablosunun adı |
| `QUEUETY_TABLE_LOCKS` | `queuety_locks` | Kilitler tablosunun adı |
| `QUEUETY_TABLE_BATCHES` | `queuety_batches` | Toplu işler tablosunun adı |
| `QUEUETY_TABLE_WORKFLOW_EVENTS` | `queuety_workflow_events` | İş akışı olay günlüğü tablosunun adı |
| `QUEUETY_TABLE_ARTIFACTS` | `queuety_artifacts` | İş akışı yapıtları tablosunun adı |
| `QUEUETY_TABLE_STATE_MACHINES` | `queuety_state_machines` | Durum makineleri tablosunun adı |
| `QUEUETY_TABLE_STATE_MACHINE_EVENTS` | `queuety_state_machine_events` | Durum makinesi olay günlüğü tablosunun adı |
| `QUEUETY_DB_DRIVER` | `auto` | MySQL sürücüsü: `auto`, `mysqli` veya `pdo`. `auto`, WordPress yüklüyse `mysqli`, aksi hâlde `pdo_mysql`, ardından `mysqli` seçeneğini tercih eder |

Kaynak kabulü ve uyarlanabilir havuz sabitleri (`QUEUETY_RESOURCE_*`, `QUEUETY_WORKER_POOL_*`) [Çalışanlar](https://queuety.inline0.dev/tr/docs/features/workers) sayfasında listelenmiştir.

`QUEUETY_TABLE_PREFIX` yalnızca tablo adlarının Queuety bölümünü değiştirir. WordPress veritabanı öneki sonucu sarmalamaya devam eder; bu nedenle `$wpdb->prefix = 'wp_'` ve `QUEUETY_TABLE_PREFIX = 'themequeue_'` gibi tablolar oluşur: `wp_themequeue_jobs`. Tek tek tablolar için açıkça tanımlanan `QUEUETY_TABLE_*` sabitleri yine önceliklidir.

Bağımsız bağlantılar da bağlantı başına Queuety tablo önekini ayarlayabilir:

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

Böylece WordPress veritabanı öneki korunur ve yalnızca Queuety
tablo bölümü değişir.

## İlk işiniz

`Handler` arayüzünü uygulayan bir işleyici sınıfı oluşturun:

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

Kaydedip dağıtın:

```php
use Queuety\Queuety;

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

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

Ya da modern dağıtılabilir iş sınıfını kullanın:

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

## İlk iş akışınız

`Step` arayüzünü uygulayan adım işleyicilerini tanımlayın:

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

İş akışını dağıtın:

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

## Çalışan başlatın

```bash
wp queuety work
```

Çalışan bekleyen işleri yoklar, yürütür, iş akışlarını ilerletir ve kuyruk boşken bekler. Durdurmak için `Ctrl+C` tuşuna basın; bu, işin ortasında bile süreci hemen sonlandırır (bkz. [Çalışanlar](https://queuety.inline0.dev/tr/docs/features/workers#worker-lifecycle)).

Yukarıdaki `SendEmailHandler`, işlerini `config()` üzerinden `emails` kuyruğuna gönderir; bu nedenle `default` üzerinde çalışan bir çalışan bu işleri almaz. Kullandığınız her kuyruğun adını belirtin:

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

Özel bir çalışan çalıştırmıyorsanız Queuety, yukarıda açıklanan varsayılan dakikada bir çalışan WordPress cron yedeğini sunmaya devam eder; bu seçenek yalnızca `default` kuyruğuyla ve çalıştırma başına tek işle sınırlıdır. Özel çalışan, daha yüksek verim ve daha düşük gecikme sunar.

Üretim ortamında birden fazla çalışan çalıştırın:

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

Öncelik sırasına göre birden fazla kuyruğu işleyin:

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

## Sırada ne var

- Tam dağıtım ve işleyici kılavuzu için [İşler](https://queuety.inline0.dev/tr/docs/jobs)
- Zincirler, paralel adımlar, koşullu dallanma ve run-workflows için [İş Akışları](https://queuety.inline0.dev/tr/docs/workflows)
- Hız sınırlama, kısıtlama ve özel işlem hattı mantığı için [Ara Katman Yazılımları](https://queuety.inline0.dev/tr/docs/features/middleware)
- Geri çağrılarla iş grupları dağıtmak için [Toplu İşleme](https://queuety.inline0.dev/tr/docs/features/batching)
- Akış verilerini parça parça kalıcı olarak saklamak için [Akış Adımları](https://queuety.inline0.dev/tr/docs/workflows/streaming)
- Yinelenen işler için [Zamanlama](https://queuety.inline0.dev/tr/docs/features/scheduling)
- Takılabilir önbellek katmanı için [Önbelleğe Alma](https://queuety.inline0.dev/tr/docs/features/caching)
- QueueFake ve test doğrulamaları için [Test Etme](https://queuety.inline0.dev/tr/docs/features/testing)
- Kullanılabilir tüm komutlar için [CLI Referansı](https://queuety.inline0.dev/tr/docs/cli)
- Programatik erişim için [PHP API](https://queuety.inline0.dev/tr/docs/api)
