WEBシステムの開発プラットフォーム LIB PHP Framework! 高速でセキュアなフルスクラッチ開発を今すぐ開始できます。

PHP基礎学習

Chapter4. セッションとは

セッションはWebプログラミングにおいて、重要な情報の伝達手段です。
本章では、Webサーバーとブラウザ間のデータのやりとりを理解し、複数ページにまたがるデータの連携方法を学習します。

1. HTTPヘッダーとメッセージボディ

そもそもWebブラウジングは、Webサーバーとブラウザ(サーバーに対してクライアントと言います)間で、テキストメッセージ(文字列)を交換することで実現しています。
このような通信手段を、HTTP(HyperText Transfer Protocol)と言います。

まず、ブラウザは下記のような形式の文字列をサーバーに送信します。(HTTPリクエスト)
GET /index.html HTTP/1.1
Host: libframework.org
accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
accept-encoding: gzip, deflate, br
accept-language: ja,en-US;q=0.9,en;q=0.8
cache-control: max-age=0
cookie: PHPSESSID=9d7u2md1btfc2a7hed952ivn8id1b7hh
user-agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36 OPR/76.0.4017.107

メッセージボディ(POSTデータなど)

空行で挟まれた上部をHTTPヘッダーと言い、下部をメッセージボディと言います。
フォームの入力データなどの送信すべきデータがない場合は、メッセージボディはありません。

これに対しサーバーWebサーバーは、送信された文字列のHTTPヘッダーを解析し、返すべきファイルを読み込み、
下記のような形式の文字列をブラウザに返します。(HTTPレスポンス)
HTTP/1.1 200 OK
content-encoding: gzip
content-type: text/html; charset=UTF-8
date: Mon, 31 May 2021 10:38:36 GMT
expires: Thu, 19 Nov 1981 08:52:00 GMT
server: nginx

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>マニュアル - LIB PHP Framework</title>
<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=10,user-scalable=yes">
<link href="css/common.css" rel="stylesheet" type="text/css" media="all">
</head>
<body>
<header>
</header>
</body>
</html>

送信時と同様に、空行で挟まれた上部をHTTPヘッダーといい、下部をメッセージボディといいます。
メッセージボディには、リクエストしたページの内容が書き出されています。 ブラウザは、このメッセージボディを画面上に描画(レンダリング)します。

2. FastCGIによるPHPの実行

サーバーに送信されたリクエストページが、PHPファイルやPHPファイルとして設定されている場合には、WebサーバーはPHPを実行します。
PHPファイルに記述されたプログラミングコードは、PHPプログラムによって実行結果に置き換えられ出力されます。

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>マニュアル - LIB PHP Framework</title>
<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=10,user-scalable=yes">
<link href="css/common.css" rel="stylesheet" type="text/css" media="all">
</head>
<body>
<header>
日付:<?= date("Y/m/d"); ?>
</header>
</body>
</html>

上記のように、date()関数が記述されている場合、PHPプログラムによって日付に置き換えられます。

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>マニュアル - LIB PHP Framework</title>
<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=10,user-scalable=yes">
<link href="css/common.css" rel="stylesheet" type="text/css" media="all">
</head>
<body>
<header>
日付:2021/01/01
</header>
</body>
</html>

このように、Webサーバーが外部のプログラムを実行する仕組みをCGI(Common Gateway Interface)と言います。
Fast CGIは、プロセスを一定時間サーバー内に保持することで、高速化とCPU負荷を軽減させる仕組みです。

3. セッションの仕組み

セッションは、HTTPヘッダーに出力されるセッションIDを使用して、ページ間で情報を伝達する仕組みです。

初回アクセス時に、PHPはセッションIDを発行しレスポンスヘッダーに出力します。
ブラウザはドメインごとにセッションIDを一定期間(デフォルトで1440秒)保持し、次回アクセス時にリクエストヘッダーに含めます。

下図では、index.htmlページとlogin.htmlは共通のセッションIDに紐づけられた、Session File Bへデータを読み書きしています。
login.htmlでは、下記のようなコードでセションデータにログイン情報を書き込みます。
$data["MID"] = "10";
$data["name"] = "inoue";

$_SESSION["member.profile"] = $data;

index.htmlでは、下記のようなコードでセションデータを取得することができます。
$data = $_SESSION["member.profile"];

echo $data["name"];

$_SESSIONはスーパーグローバル変数と呼ばれる、PHPによって自動生成される連想配列で、
PHPコードのあらゆるスコープから、ブラウザごとドメインごとに作成されるセッションデータ(セッションファイル)へアクセスできます。

セッションデータ(セッションファイル)は一定期間(デフォルトで1440秒)を過ぎると、いわゆるセッション切れと呼ばれる状態となり、アクセスできなくなります。