symfony-scheduler について
Symfony で定期処理を設定する開発者向けのスキルです。トリガーの選択やスケジュール構成、ワーカー運用に加え、重複や実行の重なりを抑える方法を扱います。
主な機能
- 01定期・cronトリガー
- 02名前付きスケジュールプロバイダー
- 03ステートフルスケジュールとロック
- 04ワーカー運用と監視
活用シーン
- 01レポート、クリーンアップ、同期の定期実行
- 02負荷の高い処理の重複防止
- 03スケジュールメッセージと実行日のテスト
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ dev-toolings/ superpowers-symfony --skill symfony-schedulerインストール後、Claude Code で/symfony-schedulerを入力して読み込まれたか確認します。
同梱ファイルreference.md
詳細
Symfony Scheduler (Symfony)
使用する場面
- システムの cron エントリーを使わずに、定期的な処理(レポート、クリーンアップ、同期)を実行する場合。
RecurringMessage::every()、RecurringMessage::cron()、カスタムのTriggerInterfaceのどれを使うか選ぶ場合。#[AsSchedule]を使って、ジョブを複数の名前付きスケジュールに分割する場合。- 負荷の高いスケジュールタスクの重複実行や実行漏れを防ぐ場合。
デフォルトのワークフロー
symfony/schedulerをインストールし、メッセージと、その#[AsMessageHandler]ハンドラーを作成します。ScheduleProviderInterfaceを実装する#[AsSchedule('default')]クラスを作成し、RecurringMessageエントリーを追加します。- トリガーを選択します。
every('5 minutes')またはcron('0 */6 * * *')を使い、cron には明示的なタイムゾーンを指定します。 - 負荷の高いタスクでは、
Scheduleにstateful($cache)とlock($lockFactory->createLock('scheduler'))を追加します。 - Supervisor の下で
messenger:consume scheduler_defaultを実行します。スケジュールごとにプロセスを 1 つ起動します。 PreRunEventとPostRunEventでログを記録し、getRecurringMessages()とgetNextRunDate()を使ってプロバイダーをテストします。
注意事項
- スケジュールごとにコンシューマーを 1 つ(
numprocs=1)だけ実行し、ロックを追加してください。そうしないと、同じタスクが 2 回実行されます。 - すべての cron トリガーでタイムゾーンを明示してください。
- 実行が繰り返される可能性があるため、スケジュールされたハンドラーは冪等である必要があります。
- 長時間稼働するワーカーを自動的に再起動できるよう、Supervisor の
autorestartと--time-limitを併用してください。
段階的な情報開示
- 実行方針とリスク管理には、このファイルを使用します。
- 実装の詳細が必要な場合は、リファレンスを参照してください。
出力要件
- トリガーとタイムゾーンを含むスケジュールプロバイダー。
- ワーカーのコマンドと Supervisor のエントリー。
- 重複実行の制御方針(stateful、lock)と監視用フック。
リファレンス
reference.md
コメント
Markdown 対応