Перейти до вмісту

Експорт і відтворення процесу

Queuety може експортувати повну історію виконання процесу у переносному форматі JSON і відтворити її в іншому середовищі. Це корисно для локального відтворення помилок із робочого середовища, перенесення процесів між середовищами та аудиту.

Експорт процесу

PHP API

Викличте Queuety::export_workflow(), вказавши ID процесу. Метод повертає масив, сумісний із JSON:

PHP
use Queuety\Queuety;

$data = Queuety::export_workflow( $workflow_id );

Щоб одразу отримати рядок JSON:

PHP
$json = json_encode( $data, JSON_PRETTY_PRINT );
file_put_contents( '/tmp/workflow-42.json', $json );

CLI

Командна оболонка
wp queuety workflow export <id> [--output=<file>]
Опція Опис
<id> ID робочого процесу (обов’язково)
--output=<file> Шлях до файлу для запису JSON. За замовчуванням — стандартний вивід.
Командна оболонка
# Print to stdout
wp queuety workflow export 42

# Write to a file
wp queuety workflow export 42 --output=/tmp/workflow-42.json

Відтворення процесу

PHP API

Викличте Queuety::replay_workflow(), передавши дані експорту. Метод повертає ID нового процесу:

PHP
use Queuety\Queuety;

$json = file_get_contents( '/tmp/workflow-42.json' );
$data = json_decode( $json, true );

$new_id = Queuety::replay_workflow( $data );

CLI

Командна оболонка
wp queuety workflow replay <file>
Опція Опис
<file> Шлях до експортованого файлу JSON (обов’язково)
Командна оболонка
wp queuety workflow replay /tmp/workflow-42.json
# Success: Workflow replayed. New workflow ID: 85.

Структура JSON

Експорт містить повний стан процесу, пов'язані завдання, події трасування, записи журналу, збережені сигнали, артефакти, фрагменти та всі рядки очікування залежностей процесу:

JSON
{
    "workflow": {
        "id": 42,
        "name": "generate_report",
        "status": "failed",
        "state": { "user_id": 1, "_steps": [...], "_queue": "default" },
        "current_step": 2,
        "total_steps": 4,
        "parent_workflow_id": null,
        "parent_step_index": null,
        "started_at": "2026-03-28 10:00:00",
        "completed_at": null,
        "failed_at": "2026-03-28 10:05:00",
        "error_message": "API timeout",
        "deadline_at": null
    },
    "jobs": [
        {
            "id": 100,
            "queue": "default",
            "handler": "App\\Handlers\\FetchDataHandler",
            "payload": {},
            "status": "completed",
            "attempts": 1,
            "max_attempts": 3,
            "step_index": 0
        }
    ],
    "events": [
        {
            "id": 1,
            "job_id": 100,
            "step_index": 0,
            "step_name": "fetchData",
            "step_type": "single",
            "handler": "App\\Handlers\\FetchDataHandler",
            "event": "step_completed",
            "input": { "user_id": 1 },
            "output": { "records": 150 },
            "state_before": { "user_id": 1 },
            "state_after": { "user_id": 1, "records": 150 },
            "context": { "source": "api" },
            "error": null,
            "duration_ms": 230,
            "created_at": "2026-03-28 10:00:01"
        }
    ],
    "logs": [
        {
            "id": 1,
            "event": "workflow_started",
            "handler": "generate_report",
            "created_at": "2026-03-28 10:00:00"
        }
    ],
    "signals": [],
    "artifacts": [],
    "chunks": [],
    "wait_dependencies": [],
    "exported_at": "2026-03-28T12:00:00+00:00",
    "queuety_version": "0.22.0"
}

У наведеному вище прикладі деякі поля скорочено. Фактичний експорт містить усі стовпці трасування з кожного рядка події.

Експорти процесів також зберігають метадані процесу, як-от definition_version, definition_hash і idempotency_key, якщо їх було задано під час початкового запуску.

Як працює відтворення

Під час відтворення експортованого процесу:

  1. Створюється новий запис процесу з експортованим станом і визначеннями кроків
  2. Назва нового процесу — {original_name}_replay_{timestamp}
  3. Історичні події та записи журналу процесу повторно додаються в нове середовище
  4. Збережені сигнали та рядки залежностей очікування процесу відтворюються як історичний стан
  5. Якщо вихідний процес усе ще був running, поточний крок ставиться в чергу на виконання. Кроки Repeat і start_workflows() не ставляться в чергу повторно, тож відтворення, яке зупиняється на одному з них, залишається running без завдання (#17)
  6. Якщо вихідний процес мав статус waiting_for_signal, waiting_for_workflows, paused, failed, cancelled або completed, цей статус зберігається у відтвореному процесі

Відтворений процес отримує новий ID і працює незалежно. Він не впливає на вихідний процес.

Для відтворення waiting_for_workflows експортовані рядки залежностей створюються з тими самими ID процесів. Це корисно для аудиту та для середовищ, де також існують ці залежні процеси, але ID залежностей автоматично не зіставляються між середовищами.

Варіанти використання

Відтворення помилок із робочого середовища

Експортуйте процес із помилкою з робочого середовища та відтворіть його локально:

Командна оболонка
# On production
wp queuety workflow export 42 --output=/tmp/workflow-42.json

# Copy the file to your local environment

# On local
wp queuety workflow replay /tmp/workflow-42.json

Відтворений процес має точно такий самий стан і визначення кроків. Для запущених процесів поточний крок повторно ставиться в чергу, тож можна продовжити виконання з місця зупинки. Призупинені процеси або процеси в очікуванні відтворюються в тому самому заблокованому стані для перевірки.

Перенесення процесів між середовищами

Перенесіть процес із проміжного середовища у робоче (або навпаки), експортувавши та відтворивши його:

Командна оболонка
# On staging
wp queuety workflow export 15 --output=workflow.json

# On production
wp queuety workflow replay workflow.json

Аудит і архівування

Експортуйте завершені процеси для довгострокового зберігання або дотримання вимог. Файл JSON містить повну історію виконання, зокрема вхідні дані, результати, стан до й після, часові дані та відомості про помилки.

PHP
$data = Queuety::export_workflow( $workflow_id );
// Store $data in your archive system, S3, etc.