
# Zamanlama

Queuety, yinelenen işler için yerleşik destek sunar. `wp_cron` kullanmak yerine zamanlamalar veritabanında saklanır ve uzun süre çalışan bir `wp queuety work` süreci (veya çalışan havuzunun üst süreci) tarafından yaklaşık dakikada bir değerlendirilir. `wp queuety work --once`, `wp queuety flush` ve eklentinin yerleşik WP-Cron yedeği zamanlamaları değerlendirmez ([#14](https://github.com/inline0/queuety/issues/14)); uzun süre çalışan bir çalışan yoksa `wp queuety schedule run` komutunu kendiniz çalıştırın.

## Aralıkla zamanlama

Basit aralık tabanlı zamanlamalar için `every()` kullanın. İfade, PHP tarafından kullanılan `DateTimeImmutable::modify()` ile uyumlu herhangi bir dize olabilir:

```php
use Queuety\Queuety;

Queuety::schedule( 'cleanup_handler' )
    ->every( '1 hour' )
    ->on_queue( 'maintenance' );

Queuety::schedule( 'sync_inventory' )
    ->every( '30 minutes' )
    ->on_queue( 'sync' );

Queuety::schedule( 'daily_report', [ 'type' => 'summary' ] )
    ->every( '1 day' );
```

## Cron zamanlaması

Standart 5 alanlı cron ifadeleri için `cron()` kullanın:

```php
// Every day at 3am
Queuety::schedule( 'nightly_cleanup' )
    ->cron( '0 3 * * *' );

// Every Monday at 9am
Queuety::schedule( 'weekly_digest' )
    ->cron( '0 9 * * 1' )
    ->on_queue( 'emails' );

// Every 15 minutes
Queuety::schedule( 'health_check' )
    ->cron( '*/15 * * * *' );
```

## Zamanlama seçenekleri

`PendingSchedule` oluşturucusu şu yöntemleri destekler:

| Yöntem | Açıklama |
|---|---|
| `every( string $interval )` | Bir aralık ifadesi ayarlar |
| `cron( string $expression )` | Bir cron ifadesi ayarlar |
| `on_queue( string $queue )` | Hedef kuyruğu ayarlar (varsayılan: `'default'`) |
| `overlap( OverlapPolicy $policy )` | Çakışma politikasını ayarlar (varsayılan: `Allow`) |

Zamanlama dağıtılmadan önce `every()` veya `cron()` çağrılmalıdır. İkisi de ayarlanmazsa `RuntimeException` fırlatılır.

## Çakışma politikaları

Sonraki zamanlama anı geldiğinde zamanlanmış bir iş hâlâ çalışıyorsa (beklemede veya işleniyor), ne olacağını çakışma politikası belirler. Politikayı `overlap()` yöntemiyle ayarlayın:

```php
use Queuety\Queuety;
use Queuety\Enums\OverlapPolicy;

Queuety::schedule( 'sync_inventory' )
    ->every( '5 minutes' )
    ->overlap( OverlapPolicy::Skip )
    ->on_queue( 'sync' );
```

`OverlapPolicy` enum'u üç durum içerir:

| Politika | Değer | Davranış |
|---|---|---|
| `OverlapPolicy::Allow` | `allow` | Önceki çalıştırma hâlâ etkin olsa bile her zaman yeni bir iş dağıtılır. Bu varsayılan davranıştır. |
| `OverlapPolicy::Skip` | `skip` | İşleyicinin beklemede veya işlenmekte olan işleri varsa mevcut zamanlama anı atlanır. Zamanlamanın düzeni korunacak şekilde `next_run` normal biçimde güncellenir. |
| `OverlapPolicy::Buffer` | `buffer` | Skip'te olduğu gibi zamanlama anı dağıtılmaz ve `next_run` bir sonraki olağan zamana ilerler. Skip'ten farklı olarak `last_run` güncellenmez. |

### Allow (varsayılan)

Aynı işleyicinin birden fazla örneği eşzamanlı çalışabilir. Çakışmanın sorun yaratmadığı, yinelenmesi güvenli işleyiciler için bunu kullanın.

```php
Queuety::schedule( 'send_heartbeat_ping' )
    ->every( '1 minute' )
    ->overlap( OverlapPolicy::Allow );
```

### Skip

İşleyici hâlâ çalışıyorsa zamanlama anı sessizce atlanır. İkinci bir örneği çalıştırmanın kaynak israfına veya çakışmalara yol açacağı işleyiciler için bunu kullanın.

```php
Queuety::schedule( 'rebuild_search_index' )
    ->every( '10 minutes' )
    ->overlap( OverlapPolicy::Skip );
```

### Buffer

Şimdilik Skip gibi davranır: işleyicinin beklemede veya işlenmekte olan bir işi varsa zamanlama anı dağıtılmaz ve `next_run` bir sonraki olağan zamana ilerler. Tek fark, Buffer'ın `last_run` değerini değiştirmemesi, Skip'in ise atlanan zamanlama anını son çalıştırma olarak kaydetmesidir.

```php
Queuety::schedule( 'sync_inventory' )
    ->every( '5 minutes' )
    ->overlap( OverlapPolicy::Buffer );
```

## Nasıl çalışır

Bir zamanlama oluşturulduğunda Queuety; ifadeyi, işleyiciyi, yükü ve hesaplanan bir sonraki çalıştırma zamanını `queuety_schedules` tablosunda saklar.

Her zamanlayıcı adımında (uzun süre çalışan bir çalışanda yaklaşık dakikada bir veya `wp queuety schedule run` komutunu çalıştırdığınızda) zamanlayıcı, `next_run` zamanı geçmiş zamanlamaları denetler. Zamanı gelen her zamanlama için yeni bir iş dağıtır ve `next_run` değerini bir sonraki zamana günceller.

## Zamanlamaları CLI ile yönetme

```bash
# List all schedules
wp queuety schedule list

# Add a recurring schedule
wp queuety schedule add cleanup_handler --every="1 hour"
wp queuety schedule add nightly_report --cron="0 3 * * *" --queue=reports

# Remove a schedule
wp queuety schedule remove cleanup_handler

# Manually trigger the scheduler
wp queuety schedule run
```

## Zamanlamaları PHP ile yönetme

```php
// Get the scheduler instance
$scheduler = Queuety::scheduler();

// List all schedules
$schedules = $scheduler->list();

// Remove a schedule by handler name
$scheduler->remove( 'cleanup_handler' );

// Manually trigger a tick
$count = $scheduler->tick();
```

## Yük

Zamanlamalara, dağıtılan her işe aktarılacak statik bir yük eklenebilir:

```php
Queuety::schedule( 'generate_report', [ 'type' => 'daily', 'format' => 'pdf' ] )
    ->every( '1 day' )
    ->on_queue( 'reports' );
```

Zamanlama her tetiklendiğinde bu yükle yeni bir iş dağıtılır.
