Laravel - 22. セッション - データの保存

Laravelのセッションデータはデフォルトでサーバ上のファイルに保存されるようになっています。このようなセッションデータの管理方法はLaravelの設定ファイルを編集することでカスタマイズできます。セッションデータの保存先には以下のような方法があります。

  • file - storage/framework/sessions にファイルとして保存する
  • cookie - 暗号化されたCookieに保存する
  • database - データベースに保存する
  • memcached / redis - 高速なキャッシュベースストアに保存する
  • array - PHPの配列として保存する(永続化しない)

ここではセッションデータの保存先にデータベースを利用する方法を取り上げます。データベースにセッションデータを保存する場合は、以下の手順で設定を行います。

  1. マイグレーションファイル( sessions テーブル)の作成
  2. マイグレーションの実行
  3. .env ファイルの編集

マイグレーションファイル( sessions テーブル)の作成

データベースにセッションデータを保存するために sessions テーブルを作成する必要があります。これには専用のコマンド( php artisan session:table )でマイグレーションファイルを作成します。

$ php artisan session:table
Migration created successfully!

コマンドが成功すると database/migrations/2020_09_07_072116_create_sessions_table.php ファイルが生成されます。テキストエディタで開いてみましょう。

<?php

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

class CreateSessionsTable extends Migration
{
    public function up()
    {
        Schema::create('sessions', function (Blueprint $table) {
            $table->string('id')->unique();
            $table->unsignedBigInteger('user_id')->nullable();
            $table->string('ip_address', 45)->nullable();
            $table->text('user_agent')->nullable();
            $table->text('payload');
            $table->integer('last_activity');
        });
    }

    public function down()
    {
        Schema::dropIfExists('sessions');
    }
}

マイグレーションファイルにはデフォルトで sessions テーブルの定義が実装されているので編集は不要です。

マイグレーションの実行

続いてマイグレーションを実行します。

$ php artisan migrate
Migrating: 2020_09_07_072116_create_sessions_table
Migrated:  2020_09_07_072116_create_sessions_table (0.1 seconds)

マイグレーションコマンドが成功するとデータベースに sessions テーブルが生成されます。PostgreSQLのクライアントツールから生成されたテーブルを確認してみましょう。

laravel=# \d sessions;
                         Table "public.sessions"
    Column     |          Type          | Collation | Nullable | Default
---------------+------------------------+-----------+----------+---------
 id            | character varying(255) |           | not null |
 user_id       | bigint                 |           |          |
 ip_address    | character varying(45)  |           |          |
 user_agent    | text                   |           |          |
 payload       | text                   |           | not null |
 last_activity | integer                |           | not null |
Indexes:
    "sessions_id_unique" UNIQUE CONSTRAINT, btree (id)

.env ファイルの編集

最後にセッションデータの管理方法を編集するために .env ファイルを編集します。ここでは .env ファイルを編集する前に config/session.php ファイルをテキストエディタで開いてみましょう。

<?php

use Illuminate\Support\Str;

return [

    'driver' => env('SESSION_DRIVER', 'file'),

    # 省略

そうすると上記のような env 関数によって環境変数 SESSION_DRIVER を参照しているプログラムがあります。このプログラムによってセッションデータの管理方法が決定しています。ここではプログラムを直接編集するのではなく .env ファイルを開いて SESSION_DRIVER 変数の値を変更するようにします。

# 省略
SESSION_DRIVER=database
# 省略

以上でセッションデータの管理方法をデータベースに変更できます。

動作確認

それではセッションの管理方法を修正したので、PHPのビルトインWebサーバを使ってWebアプリケーションを起動してみましょう。次のようにコマンドを入力します。

$ php artisan serve --host 0.0.0.0
Laravel development server started: http://0.0.0.0:8000

セッションデータの保存先の変更を確認するにはビルトインWebサーバを再起動する必要があります。

続いてブラウザを起動してWebアプリケーションにアクセスしてみましょう。

http://localhost:8000/hello

画面には以前のようにセッションに格納している count キーの値が表示されてます。

また実際に sessions テーブルにレコードが登録されていることも確認しておきましょう。

laravel=# select count(*) from sessions;
 count
-------
     1
(1 row)

実行結果から1件のレコードが生成されていることがわかります。Webアプリケーションに別のクライアントがアクセスしてきた場合は新たに1件のレコードが追加されることになります。

まとめ

  • Laravelはセッションに格納したデータの保存先を変更できる
  • デフォルトでは storage/framework/sessions フォルダ下に保存されている
  • セッションの構成は config/session.php でカスタマイズできる