Session クラス

セッションクラスを使用することでステートレスな Web 環境において、アプリケーションの状態を管理出来るようになります。 サーバー上の様々なストレージに変数を格納し、それらを次のページリクエストに再度呼び出すことが出来ます。

設定

セッションクラスは、 fuel/core/config/session.php 設定ファイルで設定されています。それは、デフォルト設定が入力されています。この config ファイルをあなたのアプリケーションの config ディレクトリへコピーし、必要に応じて修正することによって、この設定を上書きすることができます。

以下のグローバル設定値が定義されています。

パラメータ デフォルト 説明
auto_initialize boolean
true
true の場合、設定で定義されたデフォルトのドライバが自動的に読み込まれ初期化されます。 手動で特定のセッション設定を読み込みたい場合は、 false に設定します。
driver string
'cookie'
読み込むセッションドライバの名前。 現在、 'cookie', 'db', 'memcached', 'redis' そして 'file' を利用することができます。 その他の値はエラーを生成します。 手動でセッションドライバを読み込む方法、またはどのように同時に複数のドライバを使用するかについては高度なセクションを確認してください。
match_ip boolean
false
true の場合、セッションクッキーに格納されている IP アドレスは、ウェブサーバによって報告されたクライアントの IP アドレスと比較されます。 不一致の場合には、セッションは破棄されます。(プロキシがこの情報を明らかにしている場合) プロキシサーバーの背後にいるユーザを一意に識別できるように、 この機能はクライアントの実際の IP アドレスとパブリック IP アドレスの両方を利用します。
match_ua boolean
true
true の場合、セッションクッキーに格納されているユーザーエージェント文字列は、ウェブサーバによって報告されたユーザーエージェント文字列と比較されます。 不一致の場合には、セッションは破棄されます。
cookie_domain string
''
そのセッションクッキーが有効なドメイン。 空白にした場合、それは URL で指定されたホスト名にデフォルトで設定されます。
必ず http://www.faqs.org/rfcs/rfc2109.html で定義されている Cookie ドメイン名の規則に従ってください!
cookie_path string
'/'
クッキーを特定のパスに対してのみ有効にする場合は、ここにパスを入力します。 フォルダ内の代わりに ウェブサーバの DOCROOT でアプリケーションをインストールしている場合は主にこれを利用します。
cookie_http_only boolean
false
true の場合、 Javascript でのアクセスを無効にし、 HTTP 経由でクッキーの送信のみ可能とする。
expiration_time integer
7200
セッションが期限切れになるまでのアイドル時間の秒数。 この値はゼロより大きくなければなりません。 無効な値が定義されている場合、 7200 秒に設定されます。
expire_on_close boolean
false
true に設定した場合、 (現在のウィンドウではなく!) ブラウザが閉じられたときにセッションが期限切れとなります。 設定した場合は、それは expiration_time の定義よりも優先されます。
rotation_time mixed
300
セッション固定攻撃によるセッションハイジャックを防ぐため、Fuel はセッションクッキーのデータを自動的に暗号化します。 さらに、ここで指定した間隔でセッション ID が自動的に変更されます。自動変更を無効にするには、この設定の値を false にしてください。 値が未設定の場合、または、無効な値の場合は、自動変更の間隔はデフォルトで 300 秒になります。
flash_id string
'flash'
Flash 変数は、フラッシュ ID とセッション変数名によるセッションで識別されます。 変数名の衝突を避けるために、セッション変数の名前空間として、このフラッシュ ID を利用でき、また、アプリケーションで使用される変数を妨害しないセッション変数を確実にモジュールから作ることができます。
flash_auto_expire boolean
true
フラッシュ変数は一度だけ使用されることを意図しています。 このパラメータを true に設定した場合、フラッシュ変数は、 読み直すにしろしないにしろ、次のページ要求後に自動で期限切れとなります。 これを false に設定すると、それらを取得するまで、フラッシュ変数はセッションに保存されたままになります。
post_cookie_name string
''
全くクッキーがサーバーに送信されない状況 (たとえば、 Flash オブジェクトを使用している場合) 、 POST 要求の一部としてサーバーに送信される変数にセッションクッキーの内容をコピーするにはクライアント側のコードを利用することができます。 この変数を POST 変数の名前を定義する場合に利用することができます。
全くセッションクッキーが見つからない場合この変数は確認のみされることに注意してください。
http_header_name string
'Session-Id'
全くクッキーがサーバーに送信されない状況では、サーバにセッションクッキーを渡すためにカスタム HTTP ヘッダーを設定するためにクライアント側のコードを利用することができます。
全くセッションクッキーが見つからない場合この変数は確認のみされることに注意してください。
enable_cookie boolean
true
false に設定すると、全くセッションクッキーは作成されず、クライアントに送り返される応答に追加されます。 これは、次のリクエストに応じてクライアントからサーバへ戻るときにセッション ID を渡すため他の手段 (GET, POST や HTTP-HEADER) を使用しなければならないことを意味します。
native_emulation boolean
false
true に設定すると、セッションクラスは、エミュレーションを通じて PHP のネイティブのセッションのサポートを追加します。
cookie array
array(
	'cookie_name'    => 'fuelcid',
	'write_on_set'   => true
 )
クッキーに基づいたセッションのための具体的な設定。
file array
array(
	'cookie_name'    => 'fuelfid',
	'path'           => '/tmp',
	'gc_probability' => 5
 )
ファイルに基づいたセッションのための具体的な設定。
db array
array(
	'cookie_name'    => 'fueldid',
	'database'       => 'development',
	'table'          => 'sessions',
	'gc_probability' => 5
 )
データベースに基づいたセッションのための具体的な設定。
memcached array
array(
	'cookie_name'    => 'fuelmid',
	'servers'        => array( 'default' =>
							array(
								'host' => '127.0.0.1',
								'port' => 11211,
								'weight' => 100
							)
						)
 )
memcached に基づいたセッションのための具体的な設定。
redis array
array(
	'cookie_name'    => 'fuelrid',
	'database'       => 'default'
 )
redis に基づいたセッションのための具体的な設定。

それぞれのセッションストレージドライバについて、個別の設定のセクションが存在します。 このセクションでは、ドライバ固有のパラメータが含まれており、そして、 その特定のストレージドライバのためのグローバルなパラメータを上書きするために利用することができます。

セッションクラスは、セッション ID の以下のような場所をこの順番で確認します。 この時点では検証されまず、 それは最初に見つかった値が使用され、それが有効ではないと判明した場合に新しいセッションが作成されます:

  • POST データ、それは "post_cookie_name" で定義された Input::post の変数を確認します。
  • クッキー、それは "cookie_name" で定義された名前を持つ有効なクッキーを確認します。
  • GET データ、それは "cookie_name" で定義された名前を持つ Input::get の変数を確認します。
  • HTTP ヘッダ、それは "http_header_name" で定義された名前を持つヘッダをチェックします。

セッションクラスの設定は、 Cookie クラスの設定から独立しています。 正しく cookie_domaincookie_path の項目を設定することが重要です。 注目すべきことに、 'localhost' ドメインは最新のブラウザで有効なものとして受け入れられません!

クッキードライバはどんなサーバーベースのストレージも利用しません。 代わりに、すべてのセッション変数は、それぞれのリクエスト後にブラウザに送信されクッキーに保存されます。 クッキーの最大ペイロードサイズは 4Kb で、配列のシリアル化と暗号化のオーバーヘッドが原因で、これには実に速く到達するため、多くのデータを保存する必要がない場合に限りこれを使用します。

ドライバ固有の設定:

パラメータ デフォルト 説明
cookie_name string
'fuelcid'
セッションを格納するために使用されるクッキー名。 設定されていない場合、 'fuelcid' がデフォルトです。 アプリケーションで複数のセッションドライバを使用する場合は、クッキー名がそれぞれのドライバで一意になるようにしてください!
ファイルドライバの設定

ドライバ固有の設定:

パラメータ デフォルト 説明
cookie_name string
'fuelfid'
セッションを格納するために使用されるクッキー名。 設定されていない場合、 'fuelfid' がデフォルトです。 アプリケーションで複数のセッションドライバを使用する場合は、クッキー名がそれぞれのドライバで一意になるようにしてください!
path string
'/tmp'
セッションデータが収納されるディスク上の場所。 ファイルベースのセッションデータは、パフォーマンス上の理由から暗号化されていいません。 他のアプリケーション および / または ユーザーによって読み取ることができない場所を選択していることを確かめてください。 共有ホスト上でアプリケーションを実行するときにこの事実に明確に注意を払ってください!
gc_probability integer
5
管理下の有効期限が切れたセッションファイルの数を保つために、定期的なガベージコレクションが実行されます。 gc_probability は、このプロセスが開始する可能性、 0 = 決して行わない、および 100 = 常に行う を示す、 0 から 100 までの整数です。 セッションドライバはアプリケーションへの影響を最小限に抑えるため、シャットダウンイベントとしてこのタスクを実行します。
データベースセッションの設定

ドライバ固有の設定:

パラメータ デフォルト 説明
cookie_name string
'fueldid'
セッションを格納するために使用されるクッキー名。 設定されていない場合、 'fueldid' がデフォルトです。 アプリケーションで複数のセッションドライバを使用する場合は、クッキー名がそれぞれのドライバで一意になるようにしてください!
database string
null
セッションデータを格納するために利用しようとしているデータベースの名前。 これは、アプリケーションのデータベース設定ファイル app/config/db.php で定義された名前です。 定義されていない、または null に設定されている場合は、現在アクティブなデータベースが選択されます。

複数のデータベースを使用する場合は、ここに null を使用するのは賢明ではなく、アクティブなデータベースが任意の時点で何であるかをアプリケーションフローで決定するように注意してください。 Config::get('environment') を利用して設定された現在の環境を利用するか、または、名前の付いたデータベースの設定を利用するかのどちらか一方。

table string
'sessions'
セッションデータを保存するために使われるテーブル名。テーブルが存在し、以下のフィールド (MySQL 構文) を持つようにしてください:

CREATE TABLE IF NOT EXISTS `sessions` (
  `session_id` varchar(40) NOT NULL,
  `previous_id` varchar(40) NOT NULL,
  `user_agent` text NOT NULL,
  `ip_hash` char(32) NOT NULL DEFAULT '',
  `created` int(10) unsigned NOT NULL DEFAULT '0',
  `updated` int(10) unsigned NOT NULL DEFAULT '0',
  `payload` longtext NOT NULL,
  PRIMARY KEY (`session_id`),
  UNIQUE KEY `PREVIOUS` (`previous_id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;

sessions テーブルが session_id カラムと previous_id カラムの両方にユニークキーを持つことに注意してください。 これは、 (id によって常に) クエリをスピードアップするため、そして重複した id が挿入されていないことを確認するためです。
gc_probability integer
5
管理下の有効期限が切れたセッションファイルの数を保つために、定期的なガベージコレクションが実行されます。 gc_probability は、このプロセスが開始する可能性、 0 = 決して行わない、および 100 = 常に行う を示す、 0 から 100 までの整数です。 セッションドライバはアプリケーションへの影響を最小限に抑えるため、シャットダウンイベントとしてこのタスクを実行します。
Memcached セッションの設定

ドライバ固有の設定:

パラメータ デフォルト 説明
cookie_name string
'fuelmid'
セッションを格納するために使用されるクッキー名。 設定されていない場合、 'fuelmid' がデフォルトです。 アプリケーションで複数のセッションドライバを使用する場合は、クッキー名がそれぞれのドライバで一意になるようにしてください!
servers array
array (
	'default' =>
		array(
			'host' => '127.0.0.1',
			'port' => 11211,
			'weight' => 100
		)
)
http://php.net/manual/en/memcached.addservers.php によって定義される、利用可能な memcached サーバのリストを含む配列。 このパラメータを指定しない場合、ローカルマシン上で実行され、デフォルトのポートでリスニングしている、単一の memcached サーバがデフォルトとして設定されます。
Redis セッションの設定

ドライバ固有の設定:

パラメータ デフォルト 説明
cookie_name string
'fuelrid'
セッションを格納するために使用されるクッキー名。 設定されていない場合、 'fuelrid' がデフォルトです。 アプリケーションで複数のセッションドライバを使用する場合は、クッキー名がそれぞれのドライバで一意になるようにしてください!
database string
'default'
セッションデータを格納するために利用しようとしている redis データベースの名前。 これは、アプリケーションのデータベース設定ファイル app/config/db.php の redis セクションで定義された名前です。 定義されていない、または見つからない場合は、 'default' データベース構成が選択されます。

Oil コマンドを使い、セッションテーブルを作成/制御する

oil コマンドラインユーティリティを使って、 sessions テーブルを作成、削除、クリアできるように、 oil タスクが提供されています。

# メニューを表示する
$ php oil r session

# sessions テーブルを作成する
$ php oil r session:create

# sessions テーブルを削除する
$ php oil r session:remove

# sessions テーブルをクリア (truncate) する
$ php oil r session:clear

PHP ネイティブセッションのエミュレーション

設定をアクティブにして起動すると、セッションクラスは、 $_SESSION グローバル変数を介してアクセスすることができ、 PHP のネイティブなセッション機構のいくつかの基本的なエミュレーションが可能になります。 これは、デフォルトのセッションインスタンス上で静的インタフェースを介してアクセス可能なもの限定で動作します。

有効にすると、セッションクラスは PHP の関数 session_start()session_close() および session_write_close() への呼び出しをキャプチャするように、 カスタムセッションハンドラをセットアップします。 もしネイティブセッションが開かれているのを検出したときはシャットダウン時に強制的に 閉じられます。

  • session_start() が呼び出された場合、設定した Fuel セッションストアに格納されているすべてのセッションデータは $_SESSION 配列にコピーされるため、セッションを必要とする Fuel ではないコードからアクセスできます。
  • セッションが閉じられると、 $_SESSION の変化の差分が作られ Fuel セッションストアにコピーされます。

このメカニズムでは、 Fuel の内側と Fuel の外側の両方に変更されたセッション変数を持っている場合、どちらの変更が保存されるか未確定であることを意味します。 それはコードの最後の session_close() の呼び出し位置に依存します。 セッションが閉じられていない場合、 Fuel のシャットダウンイベントはそれを閉じ、そしてそれは、標準的なセッションの呼び出しを経由した任意のデータセットを上書きしてしまいます!