
# Przycinanie stanu

W miarę przechodzenia przepływu pracy przez wiele kroków zgromadzony stan może znacznie urosnąć. Przycinanie stanu automatycznie usuwa wyniki starszych kroków, aby JSON ograniczyć rozmiar stanu i zachować ważne dane.

## Włączanie przycinania stanu

Wywołaj `prune_state_after()` w konstruktorze przepływu pracy. Argument określa liczbę ostatnich kroków, których wyniki mają zostać zachowane:

```php
use Queuety\Queuety;

Queuety::workflow( 'long_pipeline' )
    ->then( StepA::class )
    ->then( StepB::class )
    ->then( StepC::class )
    ->then( StepD::class )
    ->then( StepE::class )
    ->prune_state_after( 2 )
    ->dispatch( [ 'input' => $data ] );
```

Po użyciu `prune_state_after( 2 )`, gdy krok D zostanie ukończony, wyniki kroków A i B zostaną usunięte ze stanu. Kroki C i D (dwa najnowsze) zostaną zachowane.

## Jak działa przycinanie

Gdy przycinanie stanu jest włączone, Queuety śledzi klucze dodawane przez poszczególne kroki w zarezerwowanej tablicy `_step_outputs`. Po przejściu do nowego kroku usuwa klucze wprowadzone przez kroki starsze niż ustawiony próg.

Na przykład przy użyciu `prune_state_after( 2 )`:

```
After step 0 (StepA): state has keys from StepA + initial payload
After step 1 (StepB): state has keys from StepA + StepB + initial payload
After step 2 (StepC): state has keys from StepA + StepB + StepC + initial payload
  -> prune: StepA output removed (only 2 most recent kept)
After step 3 (StepD): state has keys from StepB + StepC + StepD + initial payload
  -> prune: StepB output removed
```

## Co zostaje zachowane

Queuety nigdy nie przycina zarezerwowanych kluczy zaczynających się od `_`, takich jak `_steps`, `_queue`, `_priority`, `_max_attempts`, `_on_cancel`, `_prune_state_after` i `_step_outputs`. Zachowywane są również początkowe klucze ładunku przekazane do `dispatch()`, ponieważ od początku nie są śledzone jako wyniki kroków. Ponadto Queuety zachowuje N najnowszych wyników kroków, zgodnie z ustawionym progiem.

## Kiedy używać

Przycinanie stanu przydaje się w przepływach pracy z wieloma krokami, w których każdy krok tworzy dane, których późniejsze kroki faktycznie nie potrzebują. Typowe przykłady to długie potoki, w których każdy krok potrzebuje tylko jednego lub dwóch poprzednich wyników, przepływy ETL tworzące duże struktury pośrednie oraz przepływy rekurencyjne lub powtarzające się, które w przeciwnym razie gromadziłyby powielające się dane stanu. Jeśli przepływ pracy składa się tylko z kilku kroków lub późniejsze kroki nadal zależą od wcześniejszych wyników, prawdopodobnie w ogóle nie potrzebujesz przycinania.

## Domyślne działanie

Przycinanie stanu jest domyślnie wyłączone. Metoda `prune_state_after()` przyjmuje argument będący liczbą całkowitą. Wywołanie jej bez argumentu ustawia domyślną wartość 2:

```php
->prune_state_after()     // keeps the 2 most recent step outputs
->prune_state_after( 5 )  // keeps the 5 most recent step outputs
```
