セッション

トップ > PHP入門 > セッション

目次

広告

WADAX
安心の365日電話サポート付きレンタルサーバーです。
ロリポップ!
月額263円からのレンタルサーバー。マニュアルも充実しています。

セッションについて

セッション管理の機能を使用すれば、Cookieよりも手軽に大量のデータを扱うことができます。

セッションはCookieとは異なり、データはサーバー側に保存されます。そして訪問者を区別するためのIDのみCookieに保存されます。次回のアクセスではCookieに保存されたIDををもとに訪問者を識別し、サーバー側に保存したデータを読み出します。

以下で、「はじめての訪問と2回目以降の訪問で、表示内容が変化する」仕組みを例に、PHPでセッションを扱う具体的な流れを紹介します。

はじめてのアクセス

はじめてページにアクセスしたときはCookieにデータがない(訪問者のコンピュータにデータが書き込まれていない)、つまり訪問者を区別するためのIDがないので、PHPが新規にIDを発行します。(以下の図では、「2713」というIDが発行されたものとしています。)そしてそのIDをもとにサーバー上にファイルを作成します。保存したい値は、このファイル内に書きこまれます。
表示データをブラウザに送る際、IDのみをCookieに保存します。

はじめてのアクセス

2回目のアクセス

次回、同じページにアクセスしたときはCookieにIDがあります。このIDをもとにPHPがファイルを探します。ファイルがあればその内容を読み込み、PHPで扱えるようにします。(その際、必要ならさらに別の値を書きこむこともできます。)

2回目のアクセス

このような仕組みでデータを保持する仕組みをセッションと呼びます。

IDを発行したり、IDをもとにサーバー上にファイルを作成したり、IDをもとにファイルを探したり、ファイルの内容を読み込んだり…という処理はPHPが自動で行ってくれるので、PHPプログラムでは細かいことを考えなくてもセッションを扱えます。ですが、どういう仕組みなのかは把握しておいた方がいいでしょう。

なお、IDは実際はもっと長く複雑な値になります。また、実際は拡張子が txt のファイルに保存されるわけではありません。ファイルではなく、データベースやメモリに保存されることもあります。上の説明は、セッションの概要を説明するために少し単純化しています。

セッションの利用

PHPからセッションを読み書きするには $_SESSION にアクセスします。$_SESSION$_POST$_GET と同様、PHPが自動的に値をセットしてくれる連想配列です。ただし、プログラム内であらかじめ session_start 関数を呼び出しておかないと値はセットされません。

session_start 関数を呼ぶと、PHPがIDを発行したり、そのIDをもとにファイルを作成したり、ファイルの内容を変数に格納してくれたり…という処理が行われます。これらは裏で自動的に行われるので、細かいことを考えなくてもセッションを扱えます。

以下はセッションを使用したプログラムの例です。

<?php

session_start();

if (isset($_SESSION["count"])) {
  $_SESSION["count"]++;
} else {
  $_SESSION["count"] = 1;
}

echo $_SESSION["count"] . "回目のアクセスです。";

?>

Cookieの時と同様、訪問回数によって表示されるメッセージが変わります。このようにPHPでは、Cookieやサーバー側のデータを意識することなく、簡単にセッションデータを扱うことができます。

なお、session_start 関数は画面にデータを表示する前に実行する必要があります。(初回アクセス時、訪問者を区別するためのIDをCookieに保存するため。)表示後に実行しても、セッションは開始されません。ですので、HTMLタグ込みで出力する場合は

<?php

session_start();

if (isset($_SESSION["count"])) {
  $_SESSION["count"]++;
} else {
  $_SESSION["count"] = 1;
}

?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>サンプル</title>
</head>
<body>
<?php

echo $_SESSION["count"] . "回目のアクセスです。";

?>
</body>
</html>

このようにする必要があります。session_start 関数はHTMLタグを出力する前に実行していますが、アクセス数の表示はHTMLの文法どおり body タグ内で行っています。