laravel非同期処理(キュー)をお手軽に使ってみた


◆キュー

イメージ
                   --------------キュー--------------               
実行(ディスパッチ) ->        |タスク1| タスク2|         ->handleメソッド
                   ----------------------------------

イベントを発火するとキューにため込んで登録された順番に従って、実行される。

◆使いどころ

大量のメール送信や大容量のファイルを扱う処理は、時間がかかり、ユーザーのストレスになる可能性がある。
キューを使うと、処理結果をレスポンスにすることはできないが、通常のwebアプリの流れであるリクエスト・レスポンスとは別のタスク(ジョブ)として実行することができ、時間がかかる処理をユーザーが待機する必要がなくなる。

◆作成してみる

ジョブ(タスク)をため込むためのQueueとして、データベース・SQS・Redisなどを利用できるが、前回に続き、Redisを使用する。
[前回記事]https://qiita.com/hekizi/items/5d17e50c912614f28344#%E9%9D%9E%E5%90%8C%E6%9C%9F%E3%83%AA%E3%82%B9%E3%83%8A%E3%83%BC%E3%82%92%E5%AE%9F%E8%A3%85

今回作成する機能:前回と同じアクセス時に、アクセスIPをLogに記述する

jobクラス作成コマンド
php artisan make:job AccessIpRecordJob
class AccessIpRecordJob implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    public function __construct()
    {
        //
    }

    public function handle()
    {
        //
    }
}

前回非同期用リスナーを作成したが、その実装(implements)するクラスやトレイトがもともと用意されている感じのクラスがJobs配下に作成されました。

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

    private $ip;

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

    public function handle()
    {
        Log::info($this->ip);
    }
}

コンストラクタでIP受け取り、イベント発火時に保存という形にした。

class SampleController extends Controller
{
    public function sampleQueue(Request $request)
    {
        $this->dispatch(new AccessIpRecordJob($request->ip()));
    }
}
ルート
Route::get('/sampleQueue', 'SampleController@sampleQueue');

コントローラーとこれにアクセスするルートを用意

コマンド
php artisan queue:work
[2019-04-07 00:00:00][○○] Processing: App\Jobs\AccessIpRecordJob
[2019-04-07 00:00:00][○○] Processed:  App\Jobs\AccessIpRecordJob

php artisan queue:workでキューを監視(非同期用)して、アクセスすると実行されていることがわかる

Log
[2019-04-07 00:00:00] local.INFO: 192.168.99.1 

ちゃんと記述されている。完了
[参考にさせていただいた記事]
https://www.ritolab.com/entry/36