Laravelの非同期処理のやり方

Laravel
この記事は約5分で読めます。

コードを書いているといつか非同期処理が必要な場合がある。今回は非同期処理のやり方を学んでいこう。

Job/Queueとは?

Laravelで非同期処理をするにはJob/Queueを使用することで非同期処理をすることができる。
Jobは非同期で処理される一つ一つの処理のことでQueueが実際に実行されるアプリケーションみたいなものである。では実際に書いていこう!

環境構築

まず.envファイルを変更しましょう

.env
queue_CONNECTIONをデータベースにしておきます。

QUEUE_CONNECTION=database

次にqueueのテーブルを作成しましょう。以下のコマンドを使用することで作成することができます。

//ジョブを一時的に保存しておくテーブル
php artisan queue:table

//失敗したジョブを記録するテーブル
php artisan queue:failed-table

テーブルをマイグレートしておきます。

php artisan migrate

Jobを作成する

まずJobから作成していきます。以下のコマンドを使用してSampleJobという名前のJobを作成します。

php artisan make:job SampleJob

実行されると以下のようなファイルが作成されていると思います。

app/Jobs/SampleJob.php

<?php
namespace App\Jobs;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldBeUnique;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
class SendUserRegistrationMail implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
    public $data;
    /**
     * Create a new job instance.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }
    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle()
    {
        //
    }
}

このhandleファンクションが実際にデータが保存されるところです。

実際に書いてみる。

<?php
namespace App\Jobs;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldBeUnique;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
class SendUserRegistrationMail implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
    public $data;
    /**
     * Create a new job instance.
     *
     * @return void
     */
    public function __construct($data)
    {
        $this->data = $data;
    }
    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle()
    {
        $user_name = $this->data['user_name'];
    }
}

まず__constructというところで初期化を行います。
この場合では$dataというものをくらすの$dataに入れています。
__constructを使用することでControllerから受け取られたデータを使うことができるようになります

次にコントローラーで実際に使ってみよう!

use App\Jobs\SampleJob;

$data = [
	'user_name' => 'test_user'
];
SampleJob::dispatch($data);

dispatchを使用することでコントローラーで使用する事ができるようになります。

コメント

タイトルとURLをコピーしました