laravel6 ジョブを使ってみる

# 目的

- laravel6のジョブを使って非同期処理を体験する

# 環境

- ハードウェア環境

| 項目 | 情報 |
| --- | --- |
| OS | macOS Catalina(10.15.5) |
| ハードウェア | MacBook Pro (13-inch, 2020, Four Thunderbolt 3 ports) |
| プロセッサ | 2 GHz クアッドコアIntel Core i5 |
| メモリ | 32 GB 3733 MHz LPDDR4 |
| グラフィックス | Intel Iris Plus Graphics 1536 MB |

- ソフトウェア環境

| 項目 | 情報 | 備考 |
| --- | --- | --- |
| PHP バージョン | 7.4.11 | Homebrewを用いてこちらの方法で導入→[Mac HomebrewでPHPをインストールする](https://qiita.com/miriwo/items/cd54077aad7e139cf518) |
| Laravel バージョン | 6.X | commposerを用いてこちらの方法で導入→[Mac Laravelの環境構築を行う](https://qiita.com/miriwo/items/adaaaeecae69d6392e08) |
| MySQLバージョン | 8.0.21 for osx10.15 on x86_64 | Homwbrewを用いてこちらの方法で導入→[Mac HomebrewでMySQLをインストールする](https://qiita.com/miriwo/items/ef6a064bc545fbea29d9) |

# 情報

- jobの実行を体験することがメインなので非同期で実行される処理はログ出力のみとする。
- 筆者はMacに直接構築したLaravel環境をもちいて本記事の検証を行った。
- ログの出力は`アプリ名ディレクトリ/storage/logs/laravel.log`に出力されるものとする。
- 実行するコマンドは特筆しない限り前のコマンドと同じディレクトリで実行するものとする。

# 条件

- 下記または`$ laravel new`コマンドを実行してlaravel6のアプリが作成されていること。
    - [LaravelのアプリをLaravelのバージョンを指定して作成する](https://qiita.com/miriwo/items/83cdeb4fe892ded3bd83)
- 前述のlaravelアプリのローカルサーバを起動しブラウザからページを確認する事ができること。
- 前述のlaravelアプリで`$ php artisan migrate`が実行できること。

# 概要

1. ジョブの作成と記載
1. ルーティング情報の記載
1. 確認

# 詳細

1. ジョブの作成と記載
    1. アプリ名ディレクトリで下記コマンドを実行してジョブクラスのファイルを作成する。

        ```terminal
        $ php artisan make:job OutputLogJob
        ```

    1. 下記コマンドを実行して作成されたジョブクラスのファイルを開く。

        ```terminal
        $ vi app/Jobs/OutputLogJob.php
        ```

    1. 下記のように処理を追記する。（ジョブとして動作させたい処理はジョブクラスのhandle()メソッド内部に記載する.）

        ```アプリ名ディレクトリ/app/Jobs/OutputLogJob.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;
        // 下記を追記
        use Illuminate\Support\Facades\Log;
        
        class OutputLogJob implements ShouldQueue
        {
            use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
        
            /**
             * Create a new job instance.
             *
             * @return void
             */
            public function __construct()
            {
                //
            }
        
            /**
             * Execute the job.
             *
             * @return void
             */
            public function handle()
            {
                // 下記を追記
                Log::info('これはジョブのテストです。');
            }
        }
        ```
    
1. ルーティング情報の記載
    1. 下記コマンドを実行してルーティングファイルを開く。

        ```terminal
        $ vi routes/web.php
        ```

    1. 下記のルーティング情報を追記する。

        ```アプリ名ディレクトリ/routes/web.php
        <?php
        
        /*
        |--------------------------------------------------------------------------
        | Web Routes
        |--------------------------------------------------------------------------
        |
        | Here is where you can register web routes for your application. These
        | routes are loaded by the RouteServiceProvider within a group which
        | contains the "web" middleware group. Now create something great!
        |
        */
        
        // 下記を追記
        use App\Jobs\OutputLogJob;
        
        Route::get('/', function () {
            return view('welcome');
        });
        
        Auth::routes();
        
        Route::get('/home', 'HomeController@index')->name('home');
        
        // 下記を追記
        Route::get('/output_log_job', function(){
            $job = new OutputLogJob;
            dispatch($job);
        
            return 'ジョブの実行完了';
        });
        // 上記までを追記
        ```

1. 確認
    1. 下記コマンドを実行してローカルサーバを起動する。

        ```terminal
        $ php artisan serve
        ```

    1. 下記にアクセスする。
        - [http://127.0.0.1:8000/output_log_job](http://127.0.0.1:8000/output_log_job)
    1. 下記のように表示される。

        ![127_0_0_1_8000_output_log_job.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/d4bd5ce2-b4b7-a6a6-b8e7-32147f8cb867.png)

    1. 下記コマンドを実行してログファイルを開く。

        ```terminal
        $ vi storage/logs/laravel.log
        ```

    1. 下記の一文がログに出力されていることを確認する。

        ```アプリ名ディレクトリ/storage/logs/laravel.log
        [YYYY-MM-DD HH:MM:SS] local.INFO: これはジョブのテストです。
        ```