LoginSignup
5
2

More than 3 years have passed since last update.

Laravelでキューを使う

Last updated at Posted at 2020-07-12

目次

Laravelの記事一覧は下記
PHPフレームワークLaravelの使い方

Laravelバージョン

動作確認はLaravel Framework 7.19.1で行っています

キュー

実行したい処理(ジョブ)をjobsテーブル(キュー)に入れて置き、後で実行するものです

前提条件

eclipseでLaravel開発環境を構築する。デバッグでブレークポイントをつけて止める。(WindowsもVagrantもdockerも)
本記事は上記が完了している前提で書かれています
プロジェクトの作成もapacheの設定も上記で行っています

Laravelでデータベースを扱う準備をする
Laravelでテーブル作成
Laravelで初期データ投入
本記事は上記の内容を理解している前提で書かれています
本記事は上記ので作成したデータベースとレコードを使用します

jobsテーブル生成

コマンドラインで
sample
php artisan queue:table
xdebugの設定をしているとeclipseが実行していいですかというプロンプトを出すのでOKを押します
eclipseプロジェクトを右クリック→リフレッシュ
/sample/database/migrations/xxxx_xx_xx_xxxxxx_create_jobs_table.phpが現れます

マイグレーション実行

コマンドラインで
sample
php artisan migrate
xdebugの設定をしているとeclipseが実行していいですかというプロンプトを出すのでOKを押します

jobsテーブルができました

データベースを使うように設定

/sample/.env修正

‥‥
QUEUE_CONNECTION=database
‥‥

QUEUE_CONNECTIONをdatabaseにします
この値は
/sample/config/queue.phpで使われます

ジョブ生成

(1) コマンドラインで
sample
php artisan make:job SampleJob
xdebugの設定をしているとeclipseが実行していいですかというプロンプトを出すのでOKを押します
eclipseプロジェクトを右クリック→リフレッシュ
/sample/app/Jobs/SampleJob.phpが現れます

(2) SampleJob.php修正

SampleJob.php
<?php

namespace App\Jobs;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;

class SampleJob implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    private $sample;

    public function __construct($sample)
    {
        $this->sample = $sample;
    }

    public function handle()
    {
        error_log("SampleJob " . $this->sample . PHP_EOL, 3, __DIR__ . DIRECTORY_SEPARATOR  . "SampleJob.log");
    }
}

コンストラクタとメソッドを修正しました
handleメソッドはジョブが処理されるときに呼びだされます
error_log関数でSampleJob.phpと同階層のSampleJob.logというファイルに文字列を出力するようにしています

Controllerにメソッド追加

(1) /sample/app/Http/Controllers/SampleController.phpにuse文を追記
use App\Jobs\SampleJob;

(2) /sample/app/Http/Controllers/SampleController.phpにjobメソッドを追記

SampleController.php
    public function job()
    {
        SampleJob::dispatch("afterResponse")->afterResponse();
        SampleJob::dispatch("delay 3 Seconds")->delay(now()->addSeconds(3));

        return view('sample.job');
    }

SampleJob::dispatchの引数に渡しているものはSampleJobクラスのコンストラクタの引数になります。
afterResponseはブラウザにレスポンスを送り終えたらジョブを実行するものです
delayは指定した引数時間後にジョブを実行します。delayの引数に渡しているnow()はLaravelが提供しているヘルパ関数でCarbonクラス(https://carbon.nesbot.com/)を返します。今回はaddSeconds(3)で3秒後にジョブが実行されるようにしています。addSecondsの他にもいろいろ関数があります(carbon Docs Addition and Subtraction)
SampleJob::dispatch("delay 3 Seconds")->delay(now()->addSeconds(3));で先ほど作成したjobsテーブルにジョブがinsertされます

(3) /sample/routes/web.phpに下記を追記
Route::get('sample/job', 'SampleController@job');

viewの作成

/sample/resources/views/sample/job.blade.phpファイル作成

job.blade.php
<html>
    <head>
        <title>sample</title>
    </head>
    <body>
        job
    </body>
</html>

キューワーカーの起動

キューワーカーとは、キュー(jobsテーブル)に投入されたジョブを処理してくれるものです
sample
php artisan queue:work
xdebugの設定をしているとeclipseが実行していいですかというプロンプトを出すのでOKを押します
これは常時実行させておくものです。本番ではSupervisor等で常時動くように設定してください(http://supervisord.org/)(Laravel 7.x キュー Supervisor設定)
また、ジョブを修正した場合はキューワーカーを再起動してください
キューワーカーの再起動コマンドです
php artisan queue:restart
(Laravel 7.x キュー キューワーカーのデプロイ)

動作確認

http://localhost/laravelSample/sample/job

MySQLでlaravel_sampleデータベースを確認してみましょう
select * from jobs;
3秒後に実行されるジョブが入っています
ジョブが実行されるとレコードはdeleteされます
/sample/app/Jobs/SampleJob.logが作成され、afterResponseもdelay 3 Secondsも出力されています

5
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
2