はじめに
インストール
要件
- PHP 8.2以降、WordPress 6.4以降
- MySQL 8.0+ または MariaDB 10.6+。ワーカーは
SELECT ... FOR UPDATE SKIP LOCKEDを使ってジョブと期限到来済みのスケジュールを取得します。古いサーバーでは構文エラーになります。 mysqliまたはpdo_mysql(下記を参照)wp queuety workを使って専用ワーカーを実行する場合、サーバーに WP-CLI が必要--workersまたは--min-workers/--max-workersを使ってワーカープールを実行する場合、pcntlとposixの PHP 拡張機能が必要
Queuety は、WordPress と WP-CLI を読み込む PHP ランタイムに mysqli または pdo_mysql のいずれかを必要とします。ドライバーは自動的に選択され、WordPress ランタイムでは mysqli が優先され、スタンドアロンまたは直接のランタイム使用では pdo_mysql も利用できます。
WordPress プラグイン層を使わずにDBバックエンドのランタイムを使用する場合は、スタンドアロンでの使用を参照してください。この方法では同じ接続とランタイムテーブルを使用しますが、WordPress フックブリッジと WP-CLI 登録は含まれません。
リリースzipから
各GitHub リリースには queuety.zip アセットがあります。Composerの依存関係をインストール済みのプラグインです。WP-CLI で最新のものをインストールします。
wp plugin install https://github.com/inline0/queuety/releases/latest/download/queuety.zip --activate
zipをダウンロードして、プラグイン > 新規追加 > プラグインのアップロードからアップロードすることもできます。一般的な WordPress サイトには、これが最も簡単な方法です。
Composer管理の WordPress にComposer経由でインストールする
composer require queuety/queuety
次にプラグインを有効化します:
wp plugin activate queuety
パッケージタイプは wordpress-plugin です。Composerがプラグインディレクトリに配置するのは、プロジェクトが composer/installers を要求し、そのタイプをBedrockのようにインストール先のパスへマッピングしている場合のみです。また、プロジェクト独自の vendor/autoload.php を読み込む必要があります(Bedrockではこの処理も行われます)。composer/installers がない場合、Composerは vendor/queuety/queuety にインストールしますが、WordPress はそこを認識できません。そのため、通常の WordPress インストールではリリースzipを使ってください。
開発中にソースからインストールする
リポジトリを wp-content/plugins/queuety に配置し、PHP の依存関係をインストールします:
composer install
wp plugin activate queuety
有効化すると、Queuety はデータベーステーブル(queuety_jobs、queuety_workflows、queuety_logs、queuety_schedules、queuety_queue_states、queuety_webhooks、queuety_locks、queuety_signals、queuety_workflow_dependencies、queuety_workflow_dispatch_keys、queuety_batches、queuety_chunks、queuety_workflow_events、queuety_artifacts、queuety_state_machines、queuety_state_machine_events)を作成し、ワーカーがMySQLから直接ジョブを取得できるようにします。
既定では、プラグインは default キュー用に WordPress cron を使い、毎分ワンショットのワーカーもスケジュールします。WordPress cron が実行されていれば、default 上で動作するジョブとワークフローを、シェルを使わずに実行できます。各実行で処理されるジョブは最大1つで、繰り返しスケジュールの実行、古いジョブの復旧、ワークフローの期限チェックは行いません。これらは長時間稼働する wp queuety work プロセス内でのみ実行されます(#14)。独自のキュー、繰り返しスケジュール、低レイテンシ、または高負荷のワークロードには、専用の wp queuety work プロセスに移行してください。
設定
すべての定数は任意です。プラグインの読み込み前、またはテーマに埋め込む形式でインストールした場合は Queuety の起動前に、wp-config.php で定義します:
| 定数 | デフォルト | 説明 |
|---|---|---|
QUEUETY_RETENTION_DAYS |
7 |
wp queuety purgeおよびQueuety::purge()のデフォルトの保持日数。自動削除は行われません |
QUEUETY_LOG_RETENTION_DAYS |
0 |
Config::log_retention_days()で読み取られますが、まだ使用されていません。Queuety::purge_logs()を呼び出すまでログは保持されます(#15) |
QUEUETY_MAX_EXECUTION_TIME |
300 |
タイムアウトまでのジョブごとの最大秒数(まだ適用されません。ジョブを参照) |
QUEUETY_WORKER_SLEEP |
1 |
キューが空のときにスリープする秒数 |
QUEUETY_WORKER_MAX_JOBS |
1000 |
ワーカーが再起動するまでの最大ジョブ数 |
QUEUETY_WORKER_MAX_MEMORY |
128 |
ワーカーが再起動するまでの最大MB数 |
QUEUETY_RETRY_BACKOFF |
exponential |
バックオフ戦略: exponential、linear、またはfixed |
QUEUETY_STALE_TIMEOUT |
600 |
停滞したジョブが復旧されるまでの秒数 |
QUEUETY_CACHE_TTL |
5 |
デフォルトのキャッシュTTL(秒) |
QUEUETY_DEBUG |
false |
ワーカーの詳細ログを有効にする |
QUEUETY_CLI_COMMAND |
queuety |
WP-CLIのルートコマンド名 |
QUEUETY_TABLE_PREFIX |
queuety_ |
WordPressデータベースプレフィックスの後に続く、すべてのQueuetyテーブル共通のベース名 |
QUEUETY_TABLE_JOBS |
queuety_jobs |
ジョブテーブル名 |
QUEUETY_TABLE_WORKFLOWS |
queuety_workflows |
ワークフローテーブル名 |
QUEUETY_TABLE_LOGS |
queuety_logs |
ログテーブル名 |
QUEUETY_TABLE_SCHEDULES |
queuety_schedules |
スケジュールテーブル名 |
QUEUETY_TABLE_SIGNALS |
queuety_signals |
シグナルテーブル名 |
QUEUETY_TABLE_WORKFLOW_DEPENDENCIES |
queuety_workflow_dependencies |
ワークフロー依存関係待機テーブル名 |
QUEUETY_TABLE_WORKFLOW_DISPATCH_KEYS |
queuety_workflow_dispatch_keys |
永続ワークフローの冪等性テーブル名 |
QUEUETY_TABLE_CHUNKS |
queuety_chunks |
ストリーミングチャンクテーブル名 |
QUEUETY_TABLE_QUEUE_STATES |
queuety_queue_states |
キュー状態テーブル名 |
QUEUETY_TABLE_WEBHOOKS |
queuety_webhooks |
Webhookテーブル名 |
QUEUETY_TABLE_LOCKS |
queuety_locks |
ロックテーブル名 |
QUEUETY_TABLE_BATCHES |
queuety_batches |
バッチテーブル名 |
QUEUETY_TABLE_WORKFLOW_EVENTS |
queuety_workflow_events |
ワークフローイベントログテーブル名 |
QUEUETY_TABLE_ARTIFACTS |
queuety_artifacts |
ワークフロー成果物テーブル名 |
QUEUETY_TABLE_STATE_MACHINES |
queuety_state_machines |
ステートマシンテーブル名 |
QUEUETY_TABLE_STATE_MACHINE_EVENTS |
queuety_state_machine_events |
ステートマシンイベントログテーブル名 |
QUEUETY_DB_DRIVER |
auto |
MySQLドライバー: auto、mysqli、またはpdo。autoはWordPressが読み込まれている場合はmysqliを優先し、そうでなければpdo_mysql、次にmysqliを使います |
リソースの受け入れ制御と適応型プールの定数(QUEUETY_RESOURCE_*、QUEUETY_WORKER_POOL_*)は、ワーカー]ページに記載されています。
QUEUETY_TABLE_PREFIXが変更するのはテーブル名のQueuety部分のみです。WordPressデータベースプレフィックスは引き続き結果全体に付くため、$wpdb->prefix = 'wp_'とQUEUETY_TABLE_PREFIX = 'themequeue_'を指定すると、wp_themequeue_jobsのようなテーブル名になります。個別のテーブルについては、明示的に指定したQUEUETY_TABLE_*定数が優先されます。
スタンドアロン接続では、接続ごとにQueuetyテーブルプレフィックスを設定することもできます:
$conn = new Connection(
host: '127.0.0.1:3306',
dbname: 'wordpress',
user: 'root',
password: 'secret',
prefix: 'wp_',
table_prefix: 'themequeue_',
);
これにより、WordPressデータベースプレフィックスをそのまま保ち、Queuetyテーブル部分のみを変更します。
最初のジョブ
Handlerインターフェースを実装するハンドラークラスを作成します:
use Queuety\Handler;
class SendEmailHandler implements Handler {
public function handle( array $payload ): void {
wp_mail( $payload['to'], $payload['subject'], $payload['body'] );
}
public function config(): array {
return [
'queue' => 'emails',
'max_attempts' => 5,
];
}
}
登録してディスパッチします:
use Queuety\Queuety;
Queuety::register( 'send_email', SendEmailHandler::class );
Queuety::dispatch( 'send_email', [
'to' => 'user@example.com',
'subject' => 'Welcome',
'body' => 'Hello from Queuety!',
] );
または、モダンなディスパッチ可能ジョブクラスを使います:
use Queuety\Contracts\Job;
use Queuety\Dispatchable;
readonly class SendEmailJob implements Job {
use Dispatchable;
public function __construct(
public string $to,
public string $subject,
public string $body,
) {}
public function handle(): void {
wp_mail( $this->to, $this->subject, $this->body );
}
}
SendEmailJob::dispatch( 'user@example.com', 'Welcome', 'Hello from Queuety!' );
最初のワークフロー
Stepインターフェースを実装するステップハンドラーを定義します:
use Queuety\Step;
class FetchDataHandler implements Step {
public function handle( array $state ): array {
$user = get_user_by( 'ID', $state['user_id'] );
return [ 'user_name' => $user->display_name ];
}
public function config(): array {
return [];
}
}
class CallLLMHandler implements Step {
public function handle( array $state ): array {
$response = wp_remote_post( 'https://api.openai.com/v1/chat/completions', [
'body' => json_encode( [ 'prompt' => "Generate report for {$state['user_name']}" ] ),
] );
return [ 'llm_response' => wp_remote_retrieve_body( $response ) ];
}
public function config(): array {
return [ 'max_attempts' => 5 ];
}
}
class FormatOutputHandler implements Step {
public function handle( array $state ): array {
$url = save_report( $state['user_name'], $state['llm_response'] );
return [ 'report_url' => $url ];
}
public function config(): array {
return [];
}
}
ワークフローをディスパッチします:
$workflow_id = Queuety::workflow( 'generate_report' )
->then( FetchDataHandler::class )
->then( CallLLMHandler::class )
->then( FormatOutputHandler::class )
->dispatch( [ 'user_id' => 42 ] );
ワーカーを起動する
wp queuety work
ワーカーは保留中のジョブをポーリングして実行し、ワークフローを進行させ、キューが空のときはスリープします。停止するにはCtrl+Cを押します。ジョブの実行中であっても、プロセスは即座に終了します(ワーカーを参照)。
上記のSendEmailHandlerはconfig()を通じてジョブをemailsキューに送るため、default上のワーカーはそれらを取得しません。使用するキューにはすべて名前を付けてください:
wp queuety work --queue=emails,default
専用ワーカーを実行しない場合でも、Queuetyには前述の毎分1回のデフォルトのWordPress cronフォールバックがあり、対象はdefaultキューのみで、1回の実行につき1ジョブに限られます。専用ワーカーは、より高いスループットと低いレイテンシを実現します。
本番環境では、複数のワーカーを実行します:
wp queuety work --workers=4
優先順位を指定して複数のキューを処理します:
wp queuety work --queue=high,default,low
次のステップ
- 完全なディスパッチとハンドラーのガイドはジョブを参照
- チェーン、並列ステップ、条件分岐、ワークフロー実行についてはワークフローを参照
- レート制限、スロットリング、カスタムパイプラインロジックについてはミドルウェアを参照
- コールバック付きのジョブグループのディスパッチについてはバッチ処理を参照
- ストリーミングデータをチャンクごとに永続化する方法はストリーミングステップを参照
- 繰り返し実行するジョブについてはスケジューリングを参照
- プラグ可能なキャッシュレイヤーについてはキャッシュを参照
- QueueFakeとテストアサーションについてはテストを参照
- 利用可能なコマンド一覧はCLIリファレンスを参照
- プログラムからのアクセスについてはPHP APIを参照