HIKI Tech Blog

yhikishimaのブログ。ゆるくUE4やUnity、web開発の記事を書いてます。

【PHP】LaravelでQueue(キュー)を実行 【準備〜初期設定】

Laravelを使って非同期処理を実現する必要があり、 ジョブとキューで実現できそうだったので試してみた。

やりたきこと

やりたきことは以下

  • A,Bのユーザーが存在
  • Aのユーザーが相手を探すボタンを押す
  • Aのユーザーの画面では相手を探していますと表示
  • Bのユーザーが対戦相手を探す
  • AとBをマッチングさせる
  • AとBのユーザーの画面にはマッチング完了の表示

開発環境

開発環境は以下。PHPとlaravelのインストールは終わっている前提。

  • macOS 10.14.6
  • Laravel
  • mysql


マッチング用のテーブル作成

artisan make:migrationでテーブル作成のマイグレーション作成

$ php artisan make:migration create_user_matchings_table

database/migrations/xxxx_xx_xx_xxxxx_create_user_matchings_table.php が作成されていると思うので、 必要なカラムを追加する

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateUserMatchingsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */

    public function up()
    {
        Schema::create('user_matchings', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->integer('a_user_id')->nullable()->comment('aユーザーID'); // 追加
            $table->integer('b_user_id')->nullable()->comment('bユーザーID'); // 追加
            $table->timestamps();

            $table->index(['a_user_id', 'b_user_id']);
        });
    }

認証画面追加

artisan makeでlaravelの認証機能を追加

$ php artisan make:auth

ボタンを押す画面の作成

f:id:yhikishima:20200113160146p:plain ↑のようにresources/views/welcome.blade.php を修正して画面を作成

# resources/views/welcome.blade.php

<meta name="token" content="{{ csrf_token() }}">

~~~

@if ($user)
    <div>
        user_id: {{ $user->id }}
        <input type="hidden" id="user-id" value="{{ $user->id }}">
    </div>
@endif

<script src="https://code.jquery.com/jquery-3.3.1.js"></script>
<script>

$.ajaxSetup({
  headers: {
    'X-CSRF-TOKEN': $('meta[name="token"]').attr('content')
  }
});

var userId = $('#user-id').val();

$('#searchUser').on('click', function() {
    $.ajax({
        url: '/search_user/' + userId,
        type: 'POST',
        data: {'id': userId, '_method': 'POST'}
      })
      .done(function(res) {
        // 完了後の処理
      });
});

</script>

キュー用のデータベースを作成

artisanコマンドでマイグレーションファイルを作成する

$ php artisan queue:table

laravel/database/migrationsに、マイグレーションファイル「xxxx_create_jobs_table.php」が生成される

laravel
├─ database
│    ├─ migrations
│    │    └─ xxxx_create_jobs_table.php

artisanコマンドでマイグレートを行い、jobテーブルを作成

$ php artisan migrate

キューサービスをデータベースへ切り替える

デフォルトではsyncになっているので、laravel/.envを開いてキューサービスをdatabaseへ切り替える。

# Laravel 5.7〜
QUEUE_CONNECTION=database

# Laravel 〜5.6
QUEUE_DRIVER=database

続いてAPI実装とキューの実装を作成していきます。

参考

www.ritolab.com