Laravelでバックグラウンド処理。。。

LaravelのQueue簡単に。。。

お疲れ様です。ギークフィードエンジニアのサミーラです。私は2年間ぐらいLaravelフレームワークでWEBシステム開発をしています。
Laravelによるプロジェクトの経験

  • 通話録音システムの制御および表示Webシステム
  • モバイルゲームのバックエンドシステム
  • WEB電話帳システム
  • IP-PBXのWEBプロビジョニングシステム。

Introduction

PHPはステートレススクリプト言語なので、リクエストを取得し、処理して、レスポンスを返すものです。ただし、長時間実行されるプロセスをバックグラウンドで実行し、ユーザーにレスポンスを早く返す必要がある場合もありますね。今回のブログでは、そういう時にLaravelで対応できる方法について話したいと思います。そのためにLaravelのQueueという機能を使用します。Laravelのqueueドライバーがいくつかありますが、このブログでLaravelのデータベースQueueを使用します。

これらはlaravelの基本的な知識で行うことができます。

バックグラウンド処理の場合はデータフロー

DataFlow

★まずはフロントエンド側からプロセスを開始します。

  • ユーザーのアクションによって画面(ブラウザ)からコントローラーにリクエストが送って来る。
  • コントローラーで
    • リクエストパラメーター取得
    • リクエスト処理
    • 長時間の処理をJOBクラスのオブジェクトに入れる
    • JOBオブジェクトをQueueに入れる
  • 画面(ブラウザ)へレスポンス返す

★その後に非同期でWorkerからバックグラウンド処理を開始します。

  • QueueからJOBを取得
  • JOBを処理
  • 処理完了後に次のJobを処理、等々

★複数のWorkerを実行することが可能なので、バックグラウンドで非同期で処理可能なプロセス数を上がって、処理がチューニングすることができます。

実装の概要

★以下の概要はLaravelのプロジェクトを作成して、データベース設定が完了している段階から説明です。

実装

画面側で必要なフォーム、ボタン、etc..を開発。

  • <プロジェクトディレクトリ>/app/resources/views/welcome.blade.phpを作成
  • 以下のソースコードをwelcome.blade.phpに入れる

リクエスト処理用のコントローラーの開発。

  • コントローラーを作成
  • 以下のソースコードをコントローラーに入れる

ルートを追加。

  • 画面側からのリクエストをコントローラーまでにルーティングするためにルートを追加する必要があります。
  • <プロジェクトディレクトリ>/routes/web.phpに以下のルートを追加。

laravel Queueを設定。

  • Queue用のデータベースmigrationを作成。
  • テーブルをデータベースへmigrationする。

Queueドライバー設定。

  • LaravelのQueueでどのドライバーを使用するかどうかを「.env」ファイルで設定します。
  • このブログでDatabaseのQueueドライバーを使用しますので、「.env」に以下の項目を設定する必要があります。

JOBクラスの開発。(長時間の処理がこれに入れる)

  • 【<プロジェクトディレクトリ>/app/Jobs/】へJobクラスを作成。
  • 前のコントローラーに入れていた長時間処理のソースコードを以下のJOBクラスのhandle()メソッドに入れる

コントローラーからJOBをdispatchする。

  • 長時間処理のソースコードをコントローラーから外して、以下のソースコードをその場所に入れる。

★delay()メソッドで、「何秒後でバックグラウンドプロセスの処理が開始されたい」という設定が必要です。この設定がないプロセスは、バックグラウンドで実行されなくなります。

Workerを実行。

  • 上のdispatchで長時間のJOBオブジェクトをQueueに入れます。
  • QueueからJOBを取得して、処理するためにWokerを実行する必要があります。以下のコマンドでWokerを実行することができます。
  • Workerを実行した後に新しくJOBをqueueに入ったら、自動的にworkerからJOBを実行します。

この後に参照したほうがものは。。

今の段階でLaravelを使用してPHPのバックグラウンドプロセスを実行することができます。

さらに以下の点も参照したほうがいいと思います。

  • プロセス管理に複数のQueueを使用する方法。
  • Queueに優先順位を付ける方法。
  • JOBの最大リトライ回数、JOBのタイムアウトについて。
  • LinuxのSupervisorについて。(Workerを監視するために)

LaravelのQueueでバックグラウンド処理の仕組みやメリットまとめ

ユーザーレスポンスは、ウェブシステムの大事なポイントです。長時間処理のプロセスをバックグラウンドにして、ユーザーにすぐにレスポンス返すのはいいことです。あと、複数のプロセスが非同期で実行できるので、パフォーマンスを上げることもできます。

バックグラウンド処理の仕組みとしては、JOBクラスを作成して、長時間処理のソースコードをJOBクラスに入れます。コントローラーからJOBクラスのオブジェクトをLaravelのQueueにDispatchして、すぐにユーザーへレスポンスを返すと、後でWorkerはQueueに入っているプロセスをバックグラウンドで実行します。その後は必要に合わせてQueueをチューニングすることですね。

ALL THE BEST!!! HAPPY & CLEAN CODING!!!

この記事が気に入ったら
いいね ! しよう

Twitter で
The following two tabs change content below.
アバター
sameera
システムエンジニアギークフィード
Computer Science Special Degree (Honours) graduate who worked as a past Lecturer and currently full stack developer in GeekFeed.

【採用情報】一緒に働く仲間を募集しています

採用情報
ページトップへ