sit in a circle and chat happily

PHP 9日目

投稿日:2022-01-25
更新日:2022-03-24
php

※AM中はクッキーの続きとおさらい

セッション

セッションはクッキーを使ってユーザを認識し必要なデータをサーバ側に保存して使用する。

データがサーバ側に保存されるため、悪意あるユーザにデータを改ざんされる心配がない。また、ネットワーク上に値が流れないので盗聴される危険もない。クッキーに比べて安全性が高く、データ量の制限も実質ない。
安全に複数ページをまたいでデータを扱いたい時に便利。

<?php
$bool = session_start();
if (!isset($_SESSION['count'])) {
  $_SESSION['count'] = 1;
} else {
  $_SESSION['count']++;
}
if($_SESSION['count'] > 10){
  $_SESSION = array();
  setcookie(session_name(), '', time());
  session_destroy();
}
?>
<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>セッションを使ったカウンター</title>
</head>
<body>
  <h1>セッションを使ったカウンター</h1>

  <?php if($bool) : ?>
  <p>アクセス回数:<?php echo $_SESSION['count']; ?></p>
  <?php else : ?>
  <p>セッションをスタートできませんでした</p>
  <?php endif; ?>

  <p>セッション名:<?php echo session_name(); ?></p>

  <p><a href="02_session.php">02_session.php</a></p>
</body>
</html>
11回目のアクセス

セッションを開始する

session_start([ array $option]):bool

session_start関数を呼び出すことでサーバ側に値を保存するセッション変数[$_SESSION]を使用できるようになる。session_start関数によってセッション変数を使用する準備が整うとtrueを、問題が発生した場合はfalseを返す。

session_start関数はユーザの識別にクッキーを使用するため、ソースコードに文字が出力される前に呼び出さなければいけない。

引数に様々な設定を連想配列で指定できるが、今回のサンプルでは使用していない。

セッション開始とユーザ識別用クッキー

初回アクセス時のsession_start関数は主に3つの処理をする。
①ユーザ識別用クッキーの発行
②対象ユーザ用セッション変数「$_SESSION」を使用可能にする
③対象ユーザ用セッションファイルの作成

初回アクセス時はクッキーを持たずにサーバにアクセスする。
そのため検証ツール内の「Request Cookies」には何も表示されない。
ブラウザが受信したクッキーは「Response Cookies」に表示される。session_start関数はユーザ識別用クッキーを発行する。

クッキー名は「php.ini」の「session.name=PHPSESSID」で指定した名前になる。
今回は「PHPSESSID」という名前になる。値は個人を識別する文字列が自動的に設定される。

セッション変数を利用する

$_SESSION['キー']

session_start関数実行後はセッション変数[$_SESION]を連想配列と同じようにして使用できる。

$bool = session_start();
if (!isset($_SESSION['count'])) {
  $_SESSION['count'] = 1;
} else {
  $_SESSION['count']++;
}
if ($_SESSION['count'] > 10) {
  $_SESSION = array();
  setcookie(session_name(), '', time());
  session_destroy();
}

初回アクセス時はセッション変数内に部屋・値がない。そのため「isset($_SESSION[‘count’])」は「false」を返す。ただし先頭に「!(not演算子)」がついているので結果が反転し「true」になる。

セッション変数内に「’count’」という部屋を作成し「1」を代入する。

2回目以降アクセス時のsession_start関数は以下の処理をする。
①ユーザ識別用クッキーの値と合致するセッション変数を利用できるようにする

セッション変数用クッキーを受け取った場合、クッキーがもつ識別文字列を使って初回アクセス時に作成したセッション変数を探す。閲覧者の数だけあるセッション変数の中から該当ユーザのセッション変数を識別して使えるようにする。

もし該当するセッション変数がない場合(一定時間が過ぎたりサーバのメモリが不足するとセッション変数が破棄される)はセッションファイルからセッション変数を復元する。

初回アクセス時にセッション用クッキーを発行している為、2回目以降のレスポンスではセッション用クッキーを発行しない。

セッション変数用クッキーはセッション終了(通常はブラウザ終了時)まで値が保持される。セッション変数用クッキーの有効期限は「php.ini」の「session.cookie_lifetime=0(0はセッション終了まで)」か、引数のオプション「session.cookie_lifetime」で指定する。銀行等のサイトでは短い時間「5分」でセッション変数用クッキーを削除し、セキュリティを確保する。

セッション変数の保存場所

セッション変数はセッションファイルと呼ばれる形式で保存される。

保存場所は設定ファイル「php.ini」の「session.save_path」に指定されており、値を変更していなければ「xampp」>「tmp」フォルダ内に「sess_ + セッションID」というファイル名で保存されている。

セッションを削除する

セッションを削除する場合は以下の3つの処理をする。
①サーバ側のメモリ側のメモリ上にあるセッション変数をクリア
②ユーザ側のセッション用クッキーの削除
③サーバ側セッションファイル削除

$_SESSION = array();
setcookie(session_name(), '', time());
session_destroy();

まとめ

◆SESSIONの特徴◆
^^^^^^^^^^^^^^^^
サーバに値を保存する機能
◇メリット
・安全性が高い
    値を改ざんされる可能性がない
    値を盗み見される可能性がない
・大きなサイズの値を保存できる
・ページ間をまたいで値を利用することができる

◇デメリット
・長時間の保存はできない(安全性を高める為の制限)
    クッキーの有効期限がブラウザを閉じるまで
    ※php.iniで変更可能(5分間・10分間程度にしておく)

◇使いどころ
・安全性高く値を使いまわしたい時

クッキー・セッション共通して注意が必要なこと

◆クッキーを発行する処理◆
^^^^^^^^^^^^^^^^^^^^^^^^
以下2つの処理は文字を出力する前に呼び出す
  ★とにかくファイル上部で呼び出す
session_start()
setcookie()

UTF-8の文字コードを
BOM(byte order mark)付きにしていてもエラーになる
  ★文字コードは「UTF-8N」に設定する
カテゴリー