@blog.justoneplanet.info

日々勉強

PHP Sessions(PHPにおけるセッションの基本)

HTTPプロトコルはステートレスなプロトコルであるため、状態を維持することができない。従って、サーバは2つの異なったリクエストが同じユーザによるものなのか判別できない。そこで登場したのがセッションである。

■セッション

セッションとは

  • 基本的にはクッキーにIDを保存する形で実現される(但し、GETクエリにIDを保持する形式の場合もある)
  • 一般的にはサーバ上にユーザ毎のファイルが生成されて管理される(但し、session_set_save_handler関数でDBなどに変更することもできる)
  • セッションファイルの有効期限はphp.iniのsession.gc_maxlifetiomeディレクティブで変更する
  • session_start関数を呼ぶと、デフォルトでキャッシュされないようになる(HTTPヘッダにCache-control: no-cacheが付加される)
  • DNSラウンドロビンさせると維持できない。(NFSなどで共有する必要がある)

URLにIDを付加する形式にする方法

php.iniで以下のように記述する。(セキュリティリスクからデフォルトではoff)

session.use_trans_sid = on

セッションをスタートする方法

以下のように、session_start関数を使用する。但し、全ての出力よりも先に記述せねばならない。可読性の観点から、スクリプトの先頭部分に記述することをお勧めしたい。また、session_regenerate_id関数を使用することにより、セッションIDの固定化を防ぎ、よりセキュアなアプリケーションになる(セッションフィグゼーション)。

<?php
session_start();
session_regenerate_id(true);
?>

また、以下のようにphp.iniのsession.auto_startディレクティブでも変更が可能である(デフォルトは0)。但し、この方法ではスクリプトが実行される前にセッションがスタートするため、セッションデータにユーザ定義オブジェクトのインスタンスを含めることはできない。

session.auto_start = 1

セッションに保存したデータを取り出す方法

以下のように、スーパーグローバル変数$_SESSIONを使用する。

<?php
session_start();
session_regenerate_id(true);//setcookie('PHPSESID', 'new_id')のような効果
if(isset($_SESSION['key'])){
    $_SESSION['key']++;//IDと対になったファイルへの変数の記録
}
else{
    $_SESSION['key'] = 1;//IDと対になったファイルへの変数の記録
}
if(isset($_SESSION['key']) && $_SESSION['key'] % 2 === 0){
    print('偶数' . $_SESSION['key']);
}
else{
    print('奇数' . $_SESSION['key']);
}
?>

あらゆるデータ型を保持(代入)できる。イメージとしてはスクリプトが終わっても保持される、ユーザベースの変数といった感じだ。デフォルトで簡単にセッション管理できるのが、個人的にPHPの好きなところだ。

コメントはまだありません»

No comments yet.

RSS feed for comments on this post.TrackBack URL

Leave a comment