Vieno failo darbo eigos
Darbo eiga gali būti visiškai aprašyta viename PHP faile. Apibrėžkite žingsnių klases ir kūrimo priemonę kartu, įdėkite failą į katalogą ir įkelkite tą katalogą naudodami Queuety::load_workflows() (kaip parodyta toliau). Queuety pati savaime nenuskaito jokių katalogų.
// workflows/onboard-user.php
use Queuety\Queuety;
class CreateAccount implements \Queuety\Step {
public function handle(array $state): array {
$user = create_user($state['email']);
return ['user_id' => $user->id, 'user_name' => $user->name];
}
public function config(): array {
return ['max_attempts' => 3];
}
}
class SendWelcome implements \Queuety\Step {
public function handle(array $state): array {
wp_mail($state['email'], 'Welcome ' . $state['user_name'], '...');
return ['welcomed' => true];
}
public function config(): array {
return [];
}
}
return Queuety::define_workflow('onboard_user')
->then(CreateAccount::class, 'create_account')
->then(SendWelcome::class, 'send_welcome');
Failas grąžina WorkflowBuilder. Kiekviena žingsnio klasė apibrėžta faile. Įkėlus failą, klasės tampa pasiekiamos, o darbo eiga užregistruojama kaip šablonas.
Darbo eigų įkėlimas
Įkelkite visus darbo eigos failus iš katalogo:
// Load all .php files from the workflows directory
$count = Queuety::load_workflows(__DIR__ . '/workflows/');
Arba įkelkite vieną failą:
$template = Queuety::load_workflow_file(__DIR__ . '/workflows/onboard-user.php');
Tada išsiųskite vykdyti pagal pavadinimą:
$workflow_id = Queuety::run_workflow('onboard_user', ['email' => 'user@example.com']);
Rekursyvus įkėlimas
Norėdami nuskaityti pakatalogius, kaip antrą argumentą perduokite true:
Queuety::load_workflows(__DIR__ . '/workflows/', recursive: true);
Taip darbo eigas galima suskirstyti į aplankus:
workflows/
├── onboarding/
│ ├── new-user.php
│ └── trial-upgrade.php
├── reports/
│ ├── daily-summary.php
│ └── weekly-digest.php
└── notifications/
└── digest-email.php
Visų darbo eigos funkcijų naudojimas
Darbo eigų failuose palaikoma viskas, ką palaiko kūrimo priemonė, išskyrus idempotency_key(), kuris šablone neišsaugomas; perduokite jį kiekvieno išsiuntimo vykdyti metu naudodami Queuety::run_workflow( $name, $payload, [ 'idempotency_key' => '...' ] ). Taip pat veikia delsos, signalai, lygiagretūs žingsniai, sąlyginis šakojimasis, darbo eigų vykdymas, atšaukimo apdorojimo funkcijos ir būsenos apkarpymas:
// workflows/approval-flow.php
use Queuety\Queuety;
class SubmitRequest implements \Queuety\Step {
public function handle(array $state): array {
return ['submitted_at' => date('Y-m-d H:i:s')];
}
public function config(): array { return []; }
}
class ProcessApproval implements \Queuety\Step {
public function handle(array $state): array {
return [
'approved_by' => $state['approved_by'],
'processed' => true,
];
}
public function config(): array { return []; }
}
class CleanupRequest implements \Queuety\Handler {
public function handle(array $payload): void {
delete_pending_request($payload['request_id']);
}
public function config(): array { return []; }
}
return Queuety::define_workflow('approval_flow')
->then(SubmitRequest::class)
->delay(hours: 24)
->wait_for_signal('approved')
->then(ProcessApproval::class)
->on_cancel(CleanupRequest::class)
->prune_state_after(2);
Kada naudoti darbo eigas failuose
Darbo eigos failuose ypač tinka, kai:
- LLM arba kodo generatorius programiškai kuria darbo eigas
- Darbo eiga pakankamai paprasta, kad tilptų į vieną failą
- Norite laikyti žingsnių logiką šalia darbo eigos apibrėžties
- Kuriate prototipą ir norite greitai kartoti pakeitimus
Didesnėms darbo eigoms su bendromis žingsnių klasėmis, sudėtinga tarpine programine įranga arba žingsniais, naudojamais keliose darbo eigose, lengviau prižiūrėti įprastą metodą: atskirus klasių failus su PSR-4 automatiniu įkėlimu.
Kaip tai veikia
Viduje darbo eigų failuose naudojamas lygiai tas pats variklis kaip ir kūrimo priemonėje API. Kiekvienas žingsnis duomenų bazėje yra atskira užduotis. Būsena perduodama per lentelę queuety_workflows. Pakartotinio vykdymo nėra, deterministiškumo reikalavimo nėra ir našumas nesiskiria.
Kiekvienas įkėlimo iškvietimas requireina failą (o ne require_once), todėl kiekvieną failą įkelkite tik kartą per užklausą; įkėlus jį dukart, klasės deklaruojamos iš naujo ir įvyksta klaida. Grąžintas WorkflowBuilder konvertuojamas į WorkflowTemplate ir išsaugomas WorkflowRegistry. Išsiuntimas vykdyti ir vykdymas veikia taip pat kaip bet kurioje kitoje darbo eigoje.