Ακολουθίες βημάτων
Το πιο συνηθισμένο μοτίβο ροής εργασίας είναι μια γραμμική ακολουθία βημάτων. Κάθε βήμα εκτελείται αφού ολοκληρωθεί το προηγούμενο, ενώ η συσσωρευμένη κατάσταση μεταβιβάζεται στο επόμενο.
Η μέθοδος ->then()
Χρησιμοποιήστε το ->then() για να προσθέσετε διαδοχικά βήματα σε μια ροή εργασίας:
use Queuety\Queuety;
Queuety::workflow( 'onboarding' )
->then( CreateAccountHandler::class )
->then( SendWelcomeEmailHandler::class )
->then( NotifyAdminHandler::class )
->dispatch( [ 'email' => 'user@example.com' ] );
Τα βήματα εκτελούνται με τη σειρά που προστίθενται. Η ροή εργασίας προχωρά μόνο όταν ολοκληρωθεί επιτυχώς το τρέχον βήμα.
Η διεπαφή Step
Οι χειριστές βημάτων ροής εργασίας υλοποιούν τη διεπαφή Queuety\Step:
use Queuety\Step;
class CreateAccountHandler implements Step {
public function handle( array $state ): array {
$user_id = wp_create_user( $state['email'], wp_generate_password() );
return [ 'user_id' => $user_id ];
}
public function config(): array {
return [
'max_attempts' => 3,
];
}
}
Βασικές διαφορές από τη διεπαφή Handler:
Handler (εργασίες) |
Step (ροές εργασίας) |
|
|---|---|---|
| Υπογραφή μεθόδου | handle(array $payload): void |
handle(array $state): array |
| Είσοδος | Ωφέλιμο φορτίο εργασίας | Συσσωρευμένη κατάσταση ροής εργασίας |
| Έξοδος | Καμία (void) | Δεδομένα προς συγχώνευση με την κατάσταση |
Ροή κατάστασης
Κάθε βήμα λαμβάνει ολόκληρη τη συσσωρευμένη κατάσταση και επιστρέφει έναν πίνακα με νέα ζεύγη κλειδιού-τιμής. Τα δεδομένα που επιστρέφονται συγχωνεύονται με την κατάσταση για τα επόμενα βήματα:
class FetchUserHandler implements Step {
public function handle( array $state ): array {
// $state contains: ['user_id' => 42]
$user = get_user_by( 'ID', $state['user_id'] );
return [ 'user_name' => $user->display_name, 'user_email' => $user->user_email ];
}
public function config(): array {
return [];
}
}
class GenerateReportHandler implements Step {
public function handle( array $state ): array {
// $state contains: ['user_id' => 42, 'user_name' => 'Alice', 'user_email' => 'alice@example.com']
$report = build_report( $state['user_name'] );
return [ 'report_url' => $report->url ];
}
public function config(): array {
return [];
}
}
Διαμόρφωση βημάτων
Η μέθοδος config() υποστηρίζει τα εξής κλειδιά:
| Κλειδί | Τύπος | Προεπιλογή | Περιγραφή |
|---|---|---|---|
max_attempts |
int |
3 |
Μέγιστος αριθμός προσπαθειών επανάληψης για αυτό το βήμα |
backoff |
string |
exponential |
Στρατηγική αναμονής μεταξύ των προσπαθειών επανάληψης |
Παράδειγμα διοχέτευσης LLM
Μια συνηθισμένη περίπτωση χρήσης είναι η σύνδεση κλήσεων LLM API με επεξεργασία δεδομένων:
use Queuety\Step;
class BuildPromptHandler implements Step {
public function handle( array $state ): array {
$user = get_user_by( 'ID', $state['user_id'] );
$posts = get_posts( [ 'author' => $user->ID, 'numberposts' => 10 ] );
$context = implode( "\n", array_map( fn( $p ) => $p->post_content, $posts ) );
return [
'prompt' => "Summarize this author's recent work:\n\n{$context}",
];
}
public function config(): array {
return [];
}
}
class CallOpenAIHandler implements Step {
public function handle( array $state ): array {
$response = wp_remote_post( 'https://api.openai.com/v1/chat/completions', [
'timeout' => 120,
'headers' => [
'Authorization' => 'Bearer ' . OPENAI_API_KEY,
'Content-Type' => 'application/json',
],
'body' => json_encode( [
'model' => 'gpt-4',
'messages' => [ [ 'role' => 'user', 'content' => $state['prompt'] ] ],
] ),
] );
$body = json_decode( wp_remote_retrieve_body( $response ), true );
return [ 'summary' => $body['choices'][0]['message']['content'] ];
}
public function config(): array {
return [ 'max_attempts' => 5 ];
}
}
class SaveSummaryHandler implements Step {
public function handle( array $state ): array {
$post_id = wp_insert_post( [
'post_title' => "Summary for user #{$state['user_id']}",
'post_content' => $state['summary'],
'post_status' => 'publish',
] );
return [ 'summary_post_id' => $post_id ];
}
public function config(): array {
return [];
}
}
Αποστείλετε τη διοχέτευση:
Queuety::workflow( 'summarize_author' )
->then( BuildPromptHandler::class )
->then( CallOpenAIHandler::class )
->then( SaveSummaryHandler::class )
->on_queue( 'llm' )
->max_attempts( 5 )
->dispatch( [ 'user_id' => 42 ] );
Αν λήξει το χρονικό όριο της κλήσης OpenAI, ο εργάτης επαναλαμβάνει μόνο εκείνο το βήμα. Το prompt που δημιουργήθηκε στο βήμα 0 έχει ήδη αποθηκευτεί με ασφάλεια στην κατάσταση της ροής εργασίας.