このエントリーをはてなブックマークに追加

更新日: 2016年2月25日

実行時間: 0.0259

CI_Session

 CodeIgniterは、PHPが提供するセッション機能を利用せず、オリジナルのセッション機能を提供しています。
 従って、スーパーグローバル$_SESSION変数や「session_****」といった PHPのセッション関数を利用することはありません。

  • PHPのセッションとCodeIgniterのセッションの違い
    • PHPのセッション
    • * セッションIDを生成して、CookieにセッションIDをセット
      * そのセッションIDに対応するセッションデータをサーバ上にファイルを生成して保存
      * CookieからセッションIDを読み取り、そのセッションIDからファイル上のデータを読み込む
    • CodeIgniterのセッション
    • * セッションIDを生成
      * クライアントのIPアドレスやUser-AgentとセッションデータをセッションIDと共にCookieにセット
      * 改ざんチェックをして、Cookieからセッションデータを読み込む

 つまり、CodeIgniterではセッションデータを全てCookieで管理し、 サーバのファイルシステムに保存管理することはありません。 (データベースに保存することは設定により可能です。)

  • 「CI_Session」のメリット・デメリット
    • メリット
    • * 複数のWebサーバでセッションが維持できる
      * 改ざん検知・暗号化機能がありセッションハイジャックの危険が低い
      * ファイルI/Oがない分、少し早い
    • デメリット
    • * セッションデータのサイズ制限がある
      * セッションデータ分の通信量が少し増える

 複数の分散Webサーバでセッションを維持するには、通常共有ストレージなどが必要ですが、 CodeIgniterの「CI_Session」では、共有ストレージは必要ありません。このメリットは大きいでしょう。

 Cookieを利用しているため、データサイズ制限があります。ひとつのCookieのデータ制限は4KBですが、 セッションID、IPアドレスやUser-AgentなどCI_Sessionが保持するデータがあるためもう少し少なくなります。
 また、セッションデータを暗号化する場合は、データが大きくなるため、セッションデータの最大サイズは 1.5KBを目安にするとよいでしょう。

CI_Sessionのデータ構造

 「CI_Session」のセッションデータは、シリアライズ化した連想配列をCookieにセットします。

    [ci_session] => Array (
        [session_id] => 6b3ae2493e6e4caeeaf1941133201176
        [ip_address] => 54.80.30.49
        [user_agent] => CCBot/2.0 (http://commoncrawl.org/faq/)
        [last_activity] => 1503250240
    )

CI_Sessionの設定

 「CI_Session」を利用するための最低限の設定は、「application/config/config.php」設定ファイルの 「$config['encryption_key']」に32文字以上の暗号キーワードを設定することです。
 「encryption_key」は暗号化及び、改ざん検知に利用されます。

  • application/config/config.php
  • $config['encryption_key'] = '6b3ae2493e6e4caeeaf1941133201176'; //

 その他、任意で以下の設定項目の設定をすることができます。

項目 デフォルト 説明
$config['sess_cookie_name'] ci_session セッション用のCookie名
$config['sess_expiration'] 7200 有効期限(秒) 0で無期限
$config['sess_expire_on_close'] FALSE TRUEでブラウザが閉じられたときにセッションをクリア
$config['sess_encrypt_cookie'] FALSE セッションデータの暗号化
$config['sess_use_database'] FALSE セッションデータをデータベースに保存する場合はTRUE
$config['sess_table_name'] ci_sessions セッションデータを保存するデータベーステーブル名
$config['sess_match_ip'] FALSE セッションデータのIPアドレスとクライアントIPアドレスがマッチしているかチェック
$config['sess_match_useragent'] TRUE セッションデータのUser-Agentと
リクエスト時のUser-Agentがマッチしているかチェック
$config['sess_time_to_update'] 300 セッションIDの更新間隔(秒)
$config['cookie_prefix'] 名前衝突を避けるために必要であればプリフィックス文字列を設定します。
$config['cookie_domain'] Cookieを許容するドメインを設定します。空の場合は現在のURLからドメインを取得します。
$config['cookie_path'] / Cookieを許容するURIパスを設定します。
$config['cookie_secure'] FALSE セキュアページ(HTTPS)のみCookieを許可する設定です。TRUEでセキュアページのみ許可されます。
  • 本番運用では、「$config['sess_encrypt_cookie']」を TRUEにすることを強くお勧めします。
  • $config['sess_match_ip']をTRUEにすると、 クライアントが利用するプロバイダなどによりIPアドレスが途中で変更され、 セッションが維持できなくなる可能性があるため注意が必要です。

CI_Sessionのロード

 「CI_Loader」クラスの「library()」メソッドで、 「CI_Session」クラスをロードします。
 「application/config/config.php」の設定を利用せず、個別のセッション設定でロードする場合は、 第二引数に設定連想配列を指定することもできます。

    $this->load->library('session');
  • 個別設定でロード
  • $config = array(
          'sess_match_ip' => TRUE,
          'sess_expiration' => 600,
    );
    $this->load->library('session', $config);

CI_Sessionの機能

set_userdata($newdata = array(), $newval = '') 一番上に戻る

 セッションデータを追加、または、更新します。
 第一引数にセッションパラメータ名、第二引数にデータを指定するか、連想配列で複数のセッションデータを指定します。

    $this->session->set_userdata('login_name', '太郎');
  • 複数のセッションデータ追加・更新
  • $data = array(
          'login_name' => 太郎,
          'language' => ja,
    );
    $this->session->set_userdata($data);

userdata($item) 一番上に戻る

 セッションデータを取得します。
 引数に、取得したいセッションパラメータ名を指定します。

    $login_name = $this->session->userdata('login_name');
    $language = $this->session->userdata('language');

all_userdata() 一番上に戻る

 全てのセッションデータを連想配列で取得します。

    $data = $this->session->all_userdata();
    print_r($data);
    /*
    Array (
        [session_id] => 6b3ae2493e6e4caeeaf1941133201176
        [ip_address] => 54.80.30.49
        [user_agent] => CCBot/2.0 (http://commoncrawl.org/faq/)
        [last_activity] => 1503250240
        [login_name] => 太郎
        [language] => ja
        )
    )
    */

    CI_Sessionが付与する「session_id」「ip_address」「user_agent」「last_activity」を含め取得します。

unset_userdata($newdata = array()) 一番上に戻る

 特定のセッションユーザデータを削除します。
 引数には、削除したいセッションパラメータ名、または、セッションパラメータ名をインデックスキーとした 連想配列を指定します。

    $this->session->unset_userdata('login_name');
  • 複数のセッションデータ削除
  • $data = array(
        'login_name' => '',
        'language' => '',
    )
    $this->session->unset_userdata($data);

sess_destroy(); 一番上に戻る

 すべてのセッションユーザデータを削除します。
 このメソッドにより、セッション用のCookieがブラウザから削除されます。

    $this->session->sess_destroy();

フラッシュデータ

 「CI_Session」には、1ページの遷移だけ有効なセッションデータを扱う機能があります。
 あるページでセッションデータをセットして、他のページに遷移すると自動的にそのセッションデータは
破棄されます。

フラッシュデータの追加   set_flashdata($newdata = array(), $newval = '') 一番上に戻る

 フラッシュデータを追加します。
 第一引数に、フラッシュデータパラメータ名、第二引数にデータを指定します。 また、連想配列で複数のフラッシュデータをセットすることもできます。

    $this->session->set_flashdata('message', '次ページではこのメッセージは取得できません');
  • 複数のフラッシュデータ
  • $data = array(
        'message' => '次ページではこのメッセージは取得できません');
        'erro_code' => 'E1001'
    );
    $this->session->set_flashdata($data);

フラッシュデータの取得   flashdata($key) 一番上に戻る

 フラッシュデータを取得します。
 再セットするか、次に説明する「keep_flashdata()」メソッドを実行しない限り、次のページでは取得できません。

    $message = $this->session->flashdata('message');
    $err_code = $this->session->flashdata('error_code');

フラッシュデータの延長   keep_flashdata($key) 一番上に戻る

 「keep_flashdata()」メソッドを実行すると、フラッシュデータを次のページ遷移に引き継ぐことができます。  引き継げるのは1遷移のみです。

    $this->session->keep_flashdata('message');

セッションデータベースの利用

 CodeIgniter 1.x.xの「CI_Session」クラスには改ざん検知機能がないため、データベースを利用してセッションID の検証が行われていました。

 CodeIgniter 2.x.x の「CI_Session」クラスには、セッションデータ(セッションIDを含む)の改ざん検知機能があるため セッションデータをデータベースに保存する必要性は無くなりました。