Pāriet uz saturu

Secīgas ķēdes

Visbiežāk izmantotais darbplūsmas modelis ir lineāra darbību ķēde. Katra darbība tiek izpildīta pēc iepriekšējās pabeigšanas, un uzkrātais stāvoklis tiek nodots tālāk.

Metode ->then()

Izmantojiet ->then(), lai darbplūsmai pievienotu secīgas darbības:

PHP
use Queuety\Queuety;

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

Darbības tiek izpildītas to pievienošanas secībā. Darbplūsma turpinās tikai tad, kad pašreizējā darbība ir sekmīgi pabeigta.

Step saskarne

Darbplūsmas darbību apstrādātāji implementē saskarni 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,
        ];
    }
}

Galvenās atšķirības no saskarnes Handler:

Handler (darbvietas) Step (darbplūsmas)
Metodes paraksts handle(array $payload): void handle(array $state): array
Ievade Darbvietas dati Uzkrātais darbplūsmas stāvoklis
Izvade Nekas (void) Dati, kas jāpievieno stāvoklim

Stāvokļa plūsma

Katra darbība saņem visu uzkrāto stāvokli un atgriež jaunu atslēgu un vērtību pāri masīvu. Atgrieztie dati tiek apvienoti ar stāvokli turpmākajām darbībām:

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

Darbību konfigurēšana

Metode config() atbalsta šādas atslēgas:

Atslēga Tips Noklusējums Apraksts
max_attempts int 3 Maksimālais šīs darbības atkārtošanas mēģinājumu skaits
backoff string exponential Atkārtošanas aiztures stratēģija

LLM konveijera piemērs

Bieži izmanto LLM API izsaukumu ķēdi kopā ar datu apstrādi:

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

Palaidiet konveijeru:

PHP
Queuety::workflow( 'summarize_author' )
    ->then( BuildPromptHandler::class )
    ->then( CallOpenAIHandler::class )
    ->then( SaveSummaryHandler::class )
    ->on_queue( 'llm' )
    ->max_attempts( 5 )
    ->dispatch( [ 'user_id' => 42 ] );

Ja OpenAI izsaukums beidzas pēc noildzes, darbinieks atkārto tikai šo darbību. Uzvedne, kas izveidota 0. darbībā, jau ir droši saglabāta darbplūsmas stāvoklī.