Lewati ke konten

Rangkaian Berurutan

Pola alur kerja yang paling umum adalah rangkaian langkah linear. Setiap langkah dijalankan setelah langkah sebelumnya selesai, dengan akumulasi status diteruskan.

Metode ->then()

Gunakan ->then() untuk menambahkan langkah berurutan ke alur kerja:

PHP
use Queuety\Queuety;

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

Langkah dijalankan sesuai urutan penambahannya. Alur kerja hanya berlanjut setelah langkah saat ini berhasil diselesaikan.

Antarmuka Step

Handler langkah alur kerja mengimplementasikan antarmuka 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,
        ];
    }
}

Perbedaan utama dari antarmuka Handler:

Handler (tugas) Step (alur kerja)
Tanda tangan metode handle(array $payload): void handle(array $state): array
Input Payload tugas Akumulasi status alur kerja
Output Tidak ada (void) Data untuk digabungkan ke status

Alur status

Setiap langkah menerima seluruh akumulasi status dan mengembalikan larik berisi pasangan kunci-nilai baru. Data yang dikembalikan digabungkan ke status untuk langkah berikutnya:

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

Konfigurasi langkah

Metode config() mendukung kunci berikut:

Kunci Jenis Default Deskripsi
max_attempts int 3 Jumlah percobaan ulang maksimum untuk langkah ini
backoff string exponential Strategi jeda untuk percobaan ulang

Contoh pipeline LLM

Kasus penggunaan yang umum adalah merangkai panggilan API LLM dengan pemrosesan data:

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

Kirim pipeline:

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

Jika panggilan OpenAI mengalami timeout, worker hanya mencoba ulang langkah tersebut. Prompt yang dibuat pada langkah 0 sudah tersimpan dengan aman di status alur kerja.