Μετάβαση στο περιεχόμενο

Ακολουθίες βημάτων

Το πιο συνηθισμένο μοτίβο ροής εργασίας είναι μια γραμμική ακολουθία βημάτων. Κάθε βήμα εκτελείται αφού ολοκληρωθεί το προηγούμενο, ενώ η συσσωρευμένη κατάσταση μεταβιβάζεται στο επόμενο.

Η μέθοδος ->then()

Χρησιμοποιήστε το ->then() για να προσθέσετε διαδοχικά βήματα σε μια ροή εργασίας:

PHP
use Queuety\Queuety;

Queuety::workflow( 'onboarding' )
    ->then( CreateAccountHandler::class )
    ->then( SendWelcomeEmailHandler::class )
    ->then( NotifyAdminHandler::class )
    ->dispatch( [ 'email' => 'user@example.com' ] );

Τα βήματα εκτελούνται με τη σειρά που προστίθενται. Η ροή εργασίας προχωρά μόνο όταν ολοκληρωθεί επιτυχώς το τρέχον βήμα.

Η διεπαφή Step

Οι χειριστές βημάτων ροής εργασίας υλοποιούν τη διεπαφή Queuety\Step:

PHP
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) Δεδομένα προς συγχώνευση με την κατάσταση

Ροή κατάστασης

Κάθε βήμα λαμβάνει ολόκληρη τη συσσωρευμένη κατάσταση και επιστρέφει έναν πίνακα με νέα ζεύγη κλειδιού-τιμής. Τα δεδομένα που επιστρέφονται συγχωνεύονται με την κατάσταση για τα επόμενα βήματα:

PHP
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 με επεξεργασία δεδομένων:

PHP
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 [];
    }
}

Αποστείλετε τη διοχέτευση:

PHP
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 έχει ήδη αποθηκευτεί με ασφάλεια στην κατάσταση της ροής εργασίας.