BLOGカルテットコミュニケーションズ開発部ブログこの記事は公開されてから1年以上経過しています。情報が古い可能性がありますのでご注意ください。SymfonyでWebアプリケーションを作るとき、HTTPリクエストから直接実行するには重い処理があったらどうするか?処理をコマンド化して、バックグラウンドで(非同期)実行させることが多いと思います。事実上の標準となっていました。JMSJobQueueBundleは、Webアプリケーションの通常の処理の中からデータベース上の所定のテーブルにコマンド名や引数・オプション等を保存(予約)したものを、順に実行していってくれるバンドルです。supervisordを使ってバックグラウンドで常駐させておくことで、予約したコマンドが次々に実行されていきます。Symfony4に対応されず、代替方法を探す必要がありました。機能について使い方をご紹介します。Symfony4に対応しました!内部の実装では結構変更があったのですが、動作のカスタマイズなしでJMSJobQueueBundleを単に使っている分には特に変更なく使えました。JMSJobQueueBundleは広く使われているので、今後Symfony4時代になっても標準でありつづけることになりそうですね。php-enqueueのasync-commandをジョブキューとして使うenqueue/enqueue(php-enqueue)とはFormaProという海外の開発会社が開発しているPHPのキュー実装です。JavaのJMSというキュー実装を参考に作られています。統一的なインターフェイスで様々なキューにメッセージを送ることができます。SQSキューにメッセージを送りたい場合、生のままのAWSのSDKを使って送信機能を開発すると、バックエンドのキューを変えることになったときにアプリケーション側で変更が多くなってしまいます。はただのキュー送受信の仕組みなので、キューにメッセージを送ったりキューからメッセージを読み出したりするだけで、JMSJobQueueBundleのように非同期でSymfonyコマンドを実行する機能まではついていません。php-enqueueをキューとして使って非同期でSymfonyコマンドを実行するライブラリです。JMSJobQueueBundleの代替として検討するため、早速使ってみましょう。関連パッケージを依存に追加します。自動で有効化されます。enqueueの設定で、async-commandsを使う設定をします。実行したいコマンドをメッセージ化してキューに送ることができます。ラップして、delayを指定することでコマンド実行を指定時間になるまで遅らせることができます。$job);ジョブを実行するコマンドキューを読んで処理するコマンドを起動すると、予約したコマンドが実行されます。あり、動かない状態となってしまいました残る課題JMSJobQueueBundleからの移行先として見た場合、下記2点の課題がありました。使った場合でも)JMSJobQueueBundleではジョブのIDが返され、ジョブ完了(成功でも失敗でも)後もジョブのレコードがデータベースに保存され続けていましたが、php-enqueueのasync-commandにはその機能がありません。async-commandを使うとしたら、ジョブの実行ログを保存したい場合はメッセージの返信をログする仕組みを、ジョブが成功したかどうかを追跡したい場合にはジョブステータス管理用のエンティティを自前で実装してステータス管理する必要があります。まとめ結果的にJMSJobQueueBundleの便利な点を再確認することになりました。メジャーなバンドルが次々とSymfony4対応を完了させて、いよいよSymfony4時代の到来ですね。TtskchTheme。