コードを書いているといつか非同期処理が必要な場合がある。今回は非同期処理のやり方を学んでいこう。
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を使用することでコントローラーで使用する事ができるようになります。
コメント