Laravelでキューを使う

# 目次
Laravelの記事一覧は下記
[PHPフレームワークLaravelの使い方](https://qiita.com/toontoon/items/c4d0371e504c37f6576e)

# Laravelバージョン
動作確認はLaravel Framework 7.19.1で行っています

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

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

[Laravelでデータベースを扱う準備をする](https://qiita.com/toontoon/items/740b9575d2a323e93c0d)
[Laravelでテーブル作成](https://qiita.com/toontoon/items/2948a722a0ae7da2fb33)
[Laravelで初期データ投入](https://qiita.com/toontoon/items/f081f7f9f1667233480a)
本記事は上記の内容を理解している前提で書かれています
本記事は上記ので作成したデータベースとレコードを使用します

# 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/)](https://carbon.nesbot.com/)を返します。今回はaddSeconds(3)で3秒後にジョブが実行されるようにしています。addSecondsの他にもいろいろ関数があります[(carbon Docs Addition and Subtraction)](https://carbon.nesbot.com/docs/#api-addsub)
`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/)](http://supervisord.org/)[(Laravel 7.x キュー Supervisor設定)](https://readouble.com/laravel/7.x/ja/queues.html#supervisor-configuration)
また、ジョブを修正した場合はキューワーカーを再起動してください
キューワーカーの再起動コマンドです
`php artisan queue:restart`
[(Laravel 7.x キュー キューワーカーのデプロイ)](https://readouble.com/laravel/7.x/ja/queues.html#queue-workers-and-deployment)

# 動作確認
`http://localhost/laravelSample/sample/job`

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