BackEnd

Laravelで非同期実行する

投稿日:

はじめに

バックエンドの実装に関して、時間がかかる処理を行う場合、非同期に処理したいケースがあると思います。今回はLaravelで非同期に処理するための手軽な方法を紹介します。

動作環境

本記事ではPHP 7.2、Laravel 5.5の環境を想定しています。

準備

非同期に処理するに当たりジョブのキューを管理する方法としては、データベースを利用する方法やRedisを利用する方法などがあります。Laravelでは標準でデータベース、Redis、Amazon SQS、Beanstalkdを利用することができますが、今回は最も手頃なデータベースを使用する実装を紹介します。

デーブルの作成

以下のコマンドを実行してキューを管理するためのテーブルを作成します。

このコマンドを実行すると、以下ようなテーブルが作成されます。

.envの修正

ドライバはデフォルトでは sync になっていますので、 database に変更します。

ジョブの作成

それでは、非同期で処理するジョブを実装していきます。ユーザー登録時に何らかの処理を行う想定です。なお、ユーザーテーブルは既に定義してあるものとします。

以下のコマンドでジョブクラスを作成します。作成したクラスは app/Jobs ディレクトリに配置されます。

このコマンドで作成されるジョブクラスを見てみましょう。

見て分かる通り、ジョブクラスは実行時に呼び出されるhundleメソッドのみあります。なお、ジョブクラスにはEloquentモデルを渡すことができます。ディスパッチ時に渡される引数は以下のようにコンストラクタで取得できます。

ジョブのディスパッチ

ジョブのディスパッチには実装したジョブクラスの dispatch メソッドで行います。以下はコントローラでディスパッチする例です。

キューワーカーを起動

キューを処理するためにはキューワーカーを起動する必要があります。以下のコマンドでキューワーカーを起動します。

なお、キューワーカーは長時間起動しっぱなしのプロセスなので、コードを変更した場合はリスタートする必要があります。キューワーカーのリスタートは以下のコマンドで行います。

より細かな制御

ここまでで非同期にジョブを処理することができるようになりました。ここからは、より細かな制御について紹介します。

特定のキューにディスパッチする

ディスパッチするキューを指定することで、優先的に処理することがなどが可能です。キューの指定には onQueue メソッドを使います。

最大試行回数の指定

ジョブの最大試行回数は以下のように指定します。

タイムアウトの指定

ジョブの最大実効秒数は以下のように指定します。

ジョブ失敗時の処理

最大試行回数以上ジョブの実行に失敗した場合、そのジョブは failed_jobs テーブルに保存されます。以下のコマンドでテーブルを作成します。

失敗したジョブのクリーンアップ

失敗したジョブのクリーンアップはジョブクラスの failed メソッドで行います。なお、引数として失敗の原因となった Exception が渡されます。

失敗したジョブの再実行

failed_jobs テーブルに保存されたジョブは以下のコマンドで確認できます。

失敗したジョブの再実行は以下のコマンドで行います。

また、失敗したジョブの削除は以下のコマンドで行います。

さいごに

Laravelで非同期に処理を行う方法として、データベースを使う方法を紹介しました。

おすすめ書籍

初めてのPHP PHPフレームワーク Laravel Webアプリケーション開発 バージョン5.5 LTS対応 スラスラ読める JavaScript ふりがなプログラミング (ふりがなプログラミングシリーズ) Vue.js入門 基礎から実践アプリケーション開発まで

blog-page_footer_336




blog-page_footer_336




-BackEnd
-,

執筆者:


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA


関連記事

Go言語

Go言語の基礎〜Go 1.11 開発環境構築とパッケージバージョン管理〜

1 はじめに2 Go言語(Golang)とは2.1 シンプルな構文2.2 コンパイル言語2.3 並行処理2.4 その他の特徴3 Go開発環境の構築3.1 Goのインストール3.1.1 1. homeb ...

markdownで書けるドキュメントツールのGitbookを試す

1 はじめに2 Gitbookとは3 nvm4 node.jsインストール5 Gitbook導入5.1 インストール5.2 初期化5.3 ローカルでブラウザから確認6 作成と編集6.1 見出し編集7 ...

laravel logo

PHPで画像編集~Intervention Image~

1 はじめに2 やる事3 インストール4 画像読み込み5 文字列の追加6 編集した画像の保存7 実際のコード8 他に使う機会がありそうな編集8.1 モザイク8.2 ぼやけ8.3 リサイズ9 さいご10 ...

rails

Shrineでアップロードする際に画像を加工する

1 はじめに2 アップロードする画像のリサイズ2.1 Gemを追加2.2 Uploaderの修正3 サムネイルを作成する3.1 Uploaderの修正3.2 サムネイルを表示する4 バリデーションの追 ...

Go言語

Go言語の基礎〜基本構文その2〜

1 はじめに2 配列3 スライス3.1 スライスの宣言3.2 len3.3 append3.4 range3.5 値の切り出し3.6 可変長引数4 map4.1 宣言と初期化4.2 マップの操作4.3 ...

フォロー

blog-page_side_responsive

2019年5月
 1234
567891011
12131415161718
19202122232425
262728293031  

アプリ情報

私たちは無料アプリもリリースしています、ぜひご覧ください。 下記のアイコンから無料でダウンロードできます。