PHP $_SESSIONの背後で起こっていること

目次

  1. 背景
  2. Sessionの利用
  3. Sessionの保存先
  4. Cookie
  5. File
  6. セッションファイルの削除
  7. まとめ
  8. 関連記事
  9. PR

背景

こんにちは。 かりんとうマニア(@karintozuki)です。

Sessionって便利ですよね。(唐突)

そもそもHTTPはステートレスですが、
Webアプリを作るうえでは、セッションにステートを持たせたい場面がよくあります。
そのため、サーバーにセッションを使ってステートを保存できるようになっています。

今日はそのSessionの背後で何が起こっているのか
確かめてみることにしました。

Sessionの利用

PHPでSessionを利用するときは
ご存じのように$_SESSION変数を使います。
$_SESSIONはスコープがセッションであること以外は普通の配列として使えます。

今回はテストとして以下のようなコードを使用します。

index.php
1
2
3
4
5
6
<?php
session_start();

$_SESSION['count'] = ++$_SESSION['count'] ?? 1; // セッションのcountをインクリメント
print('カウント: '.$_SESSION['count'] ?: '');

ページを表示するとこのように表示した回数を表示します。
ブラウザを更新するとカウントが増えていきます。

Sessionの保存先

結論から言うとPHPではcookieとファイルでSessionを実現しています。

Cookieを使用して各Sessionを判別し、
セッション内のデータはファイルに保存されます。

それだけではわかりづらいと思うので、
以下で詳しく説明していきます。

先ほどのコードをもとに説明します。

index.php
1
2
3
4
5
6
7
8

<?php
session_save_path(**DIR**); // セッションの保存先をカレントディレクトリに変更
session_start();

$_SESSION['count'] = ++$_SESSION['count'] ?? 1; // セッションのcountをインクリメント
print('カウント: '.$_SESSION['count'] ?: '');

このページを開いてChromeのデベロッパーツールを開いてみます。

すると以下のようにPHPSESSIDという値が格納されているのが確認できます。

これがセッションIDです。

このIDをCookieに入れることで、リクエストを受け取ったときに
ほかのリクエストと混ざったりすることなくセッションを特定することができます。

また、このCookieは期限がSessionに設定されています。
(当たり前ですね。)

Cookieの期限にSessionが指定されている場合、

  • PCであればブラウザを閉じる、
  • スマートフォンであればアプリを終了する

などすることで
Cookieは削除されます。

File

先ほどのコードに少し変更を加えてみます。

index.php
1
2
3
4
5
6
7
8

<?php
session_save_path(__DIR__); // セッションの保存先をカレントディレクトリに変更
session_start();

$_SESSION['count'] = ++$_SESSION['count'] ?? 1; // セッションのcountをインクリメント
print('カウント: '.$_SESSION['count'] ?: '');

session_save_path(__DIR__)という関数を最初に実行しています。

これにより、セッションを保存するディレクトリをindex.phpがあるフォルダに変更しています。

デフォルトでは保存先が/tmpなどになっているのですが、
単純にファイルが見やすいように保存フォルダを変えているだけです。

それではページを表示してみましょう。

sess_{session ID}というファイルが生成されています。

中身を見てみましょう。

sess_xxxx
1
2
3

count|i:8;

これを分かりやすく分解すると以下のようになります。

  • セッションのキー(=count)
  • 型(ここではi、つまりinteger)
  • 値(=8)

また、文字列型の値をセッションに格納してみましょう。

最後の行に以下のコードを追加します。

index.php
1
2
3

$_SESSION['string'] = '文字列'; //文字列を格納

セッションが保存されているファイルを開くとこのようになっていました。

sess_xxxx
1
2
3

count|i:2;string|s:9:"文字列";

文字列に関しては文字列の長さも記録されるみたいですね。

セッションファイルの削除

それでは先ほど説明したファイルはいつまで保存されるのでしょうか。
それはphp.iniの値、session.gc_maxlifetime(gc:ガベージコレクション)によります。

https://www.php.net/manual/en/session.configuration.php#ini.session.gc-maxlifetime

これはデフォルトだと1440秒(=24分)に設定されています。

新しいセッションが始まるたびにこのガベージコレクションが実行され、
最終更新時間が24分より前のセッションファイルが削除されるようになっています。

セッション周りの設定はたくさんあるので、公式ドキュメントを読んでみるのも面白いと思います。

https://www.php.net/manual/en/session.configuration.php

まとめ

いかがでしたか。

セッションを調べてみるとCookieとファイルを使って実装しているということが分かりました。

セッションとCookieって割と学ぶときは同列に学ぶことが多いと思うのですが、
実装的にはセッションがCookieを利用しているというのが少し面白かったです。

また、ほかのWEBフレームワーク、特にほかの言語がどのようにセッションを扱っているのかも気になりました。

もしいい記事があれば教えてください笑

それじゃ今日はこの辺で。

関連記事

こちらの記事もおすすめです。

PHP DIでDIを学ぶ

PR

技術力を高めようとしているのに、技術が評価されない会社にいたら難しいですよね?
きちんとした技術を持ったエンジニアを評価する会社を探しませんか?

エンジニア転職ならレバテックキャリアがおすすです。