
# Очистка состояния

По мере прохождения рабочих последовательностей через множество шагов накопленное состояние может сильно разрастись. Очистка состояния автоматически удаляет результаты старых шагов, сохраняя состояние в разумных пределах JSON и оставляя важные данные.

## Включение очистки состояния

Вызовите `prune_state_after()` у построителя рабочей последовательности. Аргумент задает количество последних шагов, результаты которых следует сохранить:

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

При `prune_state_after( 2 )` после завершения шага D из состояния удаляются результаты шагов A и B. Шаги C и D — два последних — сохраняются.

## Как работает очистка

Когда очистка состояния включена, Queuety отслеживает, какие ключи каждый шаг добавляет в состояние, в зарезервированном массиве `_step_outputs`. После перехода к новому шагу удаляются ключи, добавленные шагами, вышедшими за установленный порог давности.

Например, при `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
```

## Что сохраняется

Queuety никогда не удаляет зарезервированные ключи, начинающиеся с `_`, например `_steps`, `_queue`, `_priority`, `_max_attempts`, `_on_cancel`, `_prune_state_after` и `_step_outputs`. Исходные ключи данных, переданные в `dispatch()`, также сохраняются, поскольку изначально не отслеживаются как результаты шагов. Кроме того, Queuety сохраняет N результатов последних шагов в соответствии с заданным порогом.

## Когда использовать

Очистка состояния полезна для рабочих последовательностей со множеством шагов, где каждый шаг создает данные, которые на самом деле не нужны последующим шагам. Типичные примеры — длинные цепочки обработки, где каждому шагу нужны результаты только одного или двух предыдущих, рабочие последовательности ETL, создающие объемные промежуточные структуры, а также рекурсивные или повторяющиеся рабочие последовательности, в которых иначе накапливалось бы избыточное состояние. Если в вашей рабочей последовательности всего несколько шагов или поздние шаги зависят от результатов ранних, очистка, скорее всего, не нужна.

## Поведение по умолчанию

По умолчанию очистка состояния выключена. Метод `prune_state_after()` принимает целочисленный аргумент. Если вызвать его без аргумента, по умолчанию используется значение 2:

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