
# Plānošana

Queuety ir iebūvēts atbalsts periodiskiem uzdevumiem. Tā vietā, lai paļautos uz `wp_cron`, grafiki tiek glabāti datubāzē un aptuveni reizi minūtē tos izvērtē ilgstoši darbojošs `wp queuety work` process (vai darbinieku kopuma vecākprocess). `wp queuety work --once`, `wp queuety flush` un spraudņa iebūvētā WP-Cron rezerves iespēja grafikus neizvērtē ([#14](https://github.com/inline0/queuety/issues/14)); ja ilgstoši darbojoša darbinieka nav, palaidiet `wp queuety schedule run` paši.

## Plānošana pēc intervāla

Izmantojiet `every()` vienkāršiem grafikiem, kuru pamatā ir intervāli. Izteiksme var būt jebkura virkne, kas ir saderīga ar PHP `DateTimeImmutable::modify()`:

```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 plānošana

Izmantojiet `cron()` standarta 5 lauku cron izteiksmēm:

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

## Grafika opcijas

`PendingSchedule` veidotājs atbalsta šīs metodes:

| Metode | Apraksts |
|---|---|
| `every( string $interval )` | Iestatīt intervāla izteiksmi |
| `cron( string $expression )` | Iestatīt cron izteiksmi |
| `on_queue( string $queue )` | Iestatīt mērķa rindu (noklusējums: `'default'`) |
| `overlap( OverlapPolicy $policy )` | Iestatīt pārklāšanās politiku (noklusējums: `Allow`) |

Pirms grafiks sāk uzdevuma izpildi, jāizsauc vai nu `every()`, vai `cron()`. Ja nav iestatīta neviena no tām, tiek izmests `RuntimeException`.

## Pārklāšanās politikas

Ja nākamā atzīme pienāk brīdī, kad ieplānotais uzdevums vēl darbojas (gaida vai tiek apstrādāts), pārklāšanās politika nosaka, kas notiks. Iestatiet to ar metodi `overlap()`:

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

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

`OverlapPolicy` uzskaitījumā ir trīs varianti:

| Politika | Vērtība | Darbība |
|---|---|---|
| `OverlapPolicy::Allow` | `allow` | Vienmēr palaist jaunu uzdevumu, pat ja iepriekšējā izpilde vēl turpinās. Šī ir noklusējuma politika. |
| `OverlapPolicy::Skip` | `skip` | Izlaist pašreizējo atzīmi, ja apdarinātājam ir gaidoši vai apstrādes stadijā esoši uzdevumi. `next_run` tiek atjaunināts kā parasti, lai grafiks saglabātu ritmu. |
| `OverlapPolicy::Buffer` | `buffer` | Tāpat kā Skip gadījumā, atzīme netiek palaista un `next_run` pāriet uz nākamo regulāro izpildes reizi. Atšķirībā no Skip, `last_run` netiek atjaunināts. |

### Allow (noklusējums)

Vienlaikus var darboties vairākas viena apdarinātāja instances. Izmantojiet šo iespēju idempotentiem apdarinātājiem, kuriem pārklāšanās nav kaitīga.

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

### Skip

Ja apdarinātājs joprojām darbojas, atzīme tiek klusi izlaista. Izmantojiet šo iespēju apdarinātājiem, kuriem otras instances palaišana būtu nelietderīga vai radītu konfliktus.

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

### Buffer

Pašlaik darbojas tāpat kā Skip: ja apdarinātājam vēl ir gaidošs vai apstrādes stadijā esošs uzdevums, atzīme netiek palaista un `next_run` pāriet uz nākamo regulāro izpildes reizi. Vienīgā atšķirība: Buffer atstāj `last_run` nemainītu, bet Skip reģistrē izlaisto atzīmi kā pēdējo izpildi.

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

## Kā tas darbojas

Kad grafiks tiek izveidots, Queuety to saglabā tabulā `queuety_schedules` kopā ar izteiksmi, apdarinātāju, datiem un nākamo aprēķināto izpildes laiku.

Katrā plānotāja atzīmē (aptuveni reizi minūtē ilgstoši darbojošā darbiniekā vai palaižot `wp queuety schedule run`) plānotājs pārbauda grafikus, kuru `next_run` laiks ir pienācis. Katram pienākušajam grafikam tas palaiž jaunu uzdevumu un atjaunina `next_run` uz nākamo izpildes reizi.

## Grafiku pārvaldība, izmantojot CLI

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

## Grafiku pārvaldība, izmantojot PHP

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

## Dati

Grafikos var iekļaut statiskus datus, kas tiek nodoti katram palaistajam uzdevumam:

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

Ikreiz, kad grafiks tiek izpildīts, tiek palaists jauns uzdevums ar šiem datiem.
