
# Ütemezés

A Queuety beépített támogatást nyújt az ismétlődő feladatokhoz. A `wp_cron` használata helyett az ütemezéseket az adatbázisban tárolja, és egy hosszú ideig futó `wp queuety work` folyamat (vagy egy workerpool szülőfolyamata) percenként nagyjából egyszer kiértékeli őket. A `wp queuety work --once`, a `wp queuety flush` és a bővítmény beépített WP-Cron tartalékmegoldása nem értékeli ki az ütemezéseket ([#14](https://github.com/inline0/queuety/issues/14)); hosszú ideig futó worker nélkül futtassa saját maga a `wp queuety schedule run` parancsot.

## Időköz alapú ütemezés

Egyszerű, időköz alapú ütemezéshez használja a `every()` értéket. A kifejezés bármely, a PHP `DateTimeImmutable::modify()` értékével kompatibilis karakterlánc lehet:

```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 alapú ütemezés

A szabványos, 5 mezős cron kifejezésekhez használja a `cron()` értéket:

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

## Ütemezési beállítások

A `PendingSchedule` builder a következő metódusokat támogatja:

| Metódus | Leírás |
|---|---|
| `every( string $interval )` | Időközkifejezés beállítása |
| `cron( string $expression )` | cron kifejezés beállítása |
| `on_queue( string $queue )` | Célvárólista beállítása (alapértelmezett: `'default'`) |
| `overlap( OverlapPolicy $policy )` | Átfedési szabály beállítása (alapértelmezett: `Allow`) |

Az ütemezés indítása előtt meg kell hívnia a `every()` vagy a `cron()` metódust. Ha egyiket sem állítja be, `RuntimeException` kivétel keletkezik.

## Átfedési szabályok

Ha az ütemezett feladat még fut (függőben van vagy feldolgozás alatt áll), amikor elérkezik a következő ütemezési időpont, az átfedési szabály határozza meg, mi történik. Beállításához használja a `overlap()` metódust:

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

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

A `OverlapPolicy` felsorolásnak három esete van:

| Szabály | Érték | Működés |
|---|---|---|
| `OverlapPolicy::Allow` | `allow` | Mindig új feladatot indít, még akkor is, ha az előző futás aktív. Ez az alapértelmezés. |
| `OverlapPolicy::Skip` | `skip` | Kihagyja az aktuális időpontot, ha a kezelőnek van függőben lévő vagy feldolgozás alatt álló feladata. A `next_run` szokásosan frissül, így az ütemezés tartja az ütemet. |
| `OverlapPolicy::Buffer` | `buffer` | A Skip szabályhoz hasonlóan nem indítja el a feladatot, a `next_run` pedig a következő szabályos időpontra lép. A Skip szabálytól eltérően a `last_run` nem frissül. |

### Engedélyezés (alapértelmezett)

Ugyanazon kezelő több példánya párhuzamosan is futhat. Idempotens kezelőknél használja, amelyeknél az átfedés nem okoz gondot.

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

### Kihagyás

Ha a kezelő még fut, az ütemezési időpont csendben kimarad. Olyan kezelőknél használja, amelyek második példányának futtatása pazarló lenne vagy ütközést okozna.

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

### Pufferelés

Jelenleg a Kihagyás szabályhoz hasonlóan működik: ha a kezelőnek van függőben lévő vagy feldolgozás alatt álló feladata, az időpont nem indít új feladatot, a `next_run` pedig a következő szabályos időpontra lép. A különbség az, hogy a Pufferelés változatlanul hagyja a `last_run` értékét, míg a Kihagyás az utolsó futásként rögzíti a kihagyott időpontot.

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

## Működés

Ütemezés létrehozásakor a Queuety az `queuety_schedules` táblában tárolja a kifejezéssel, kezelővel, adattal és a következő kiszámított futási időponttal együtt.

Minden ütemezői lépésnél (nagyjából percenként egy hosszú ideig futó workerben, vagy a `wp queuety schedule run` futtatásakor) az ütemező ellenőrzi, mely ütemezések `next_run` időpontja múlt el. Minden esedékes ütemezéshez új feladatot indít, és frissíti a `next_run` értékét a következő időpontra.

## Ütemezések kezelése a CLI segítségével

```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
```

## Ütemezések kezelése a PHP segítségével

```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();
```

## Adat

Az ütemezések statikus adatot is tartalmazhatnak, amely minden elindított feladatnak átadódik:

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

Az ütemezés minden aktiválásakor új feladat indul ezzel az adattal.
