セッション処理セッション関数
- 定義済みの定数
- session_cache_expire〔現在のキャッシュの有効期限を返す〕
- session_cache_limiter〔現在のキャッシュリミッタを取得または設定する〕
- session_decode〔文字列からセッションデータをデコードする〕
- session_destroy〔セッションに登録されたデータを全て破棄する〕
- session_encode〔現在のセッションデータを文字列としてエンコードする〕
- session_get_cookie_params〔セッションクッキーのパラメータを得る〕
- session_id〔現在のセッション ID を取得または設定する〕
- session_is_registered ※非推奨〔変数がセッションに登録されているかどうかを調べる〕
- session_module_name〔現在のセッションモジュールを取得または設定する〕
- session_name〔現在のセッション名を取得または設定する〕
- session_regenerate_id〔現在のセッションIDを新しく生成したものと置き換える〕
- session_register〔現在のセッションに1つ以上の変数を登録する〕
- session_save_path〔現在のセッションデータ保存パスを取得または設定する〕
- session_set_cookie_params〔セッションクッキーパラメータを設定する〕
- session_set_save_handler〔ユーザ定義のセッション保存関数を設定する〕
- session_start〔セッションデータを初期化する〕
- session_unregister〔現在のセッションから変数の登録を削除する〕
- session_unset〔すべてのセッション変数を開放する〕
- session_write_close/session_commit〔セッションデータを書き込んでセッションを終了する〕
定義済みの定数
unknown
下記の定数が定義されています。 この関数の拡張モジュールがPHP組み込みでコンパイルされているか、実行時に動的にロードされている場合のみ使用可能です。
定数 | 説明 |
---|---|
SID | "name=ID"形式でセッション名とセッションIDを格納している定数。セッションIDがセッションクッキーに適切にセットされている場合には空文字列が入ります。これはsession_id()が返すIDと同じになります。 |
session_cache_expire
現在のキャッシュの有効期限を返す
unknown
現在のsession.cache_expire(キャッシュされたセッションページの生存期限)の現在の設定を返します。 返り値は分単位で、デフォルトは180です。
リクエストがあった時点でキャッシュの有効期限は、session.cache_limiterで設定されたデフォルト値にリセットされます。 そのため、すべてのリクエストにおいて、session_start()をコールする前にこの関数をコールする必要があります。
オプションの第1引数new_cache_expireには、キャッシュの有効期限を指定します。 指定した場合は、現在のキャッシュの有効期限がnew_cache_expireに置換されます。
session.cache_limiterがnocache以外の値に設定されている場合のみ、new_cache_expireが有効になります。
<?
# キャッシュリミッタを「private」に設定
session_cache_limiter('private');
$cache_limiter = session_cache_limiter();
# キャッシュの有効期限を30分に設定
session_cache_expire(30);
$cache_expire = session_cache_expire();
# セッションデータ初期化
session_start();
echo "キャッシュの有効期限は、現在「{$cache_limiter}」に設定されています。<br>";
echo "キャッシュされたセッションページは「{$cache_expire}」分後に有効期限が切れます。";
/*
キャッシュの有効期限は、現在「private」に設定されています。
キャッシュされたセッションページは「30」分後に有効期限が切れます。
*/
?>
session_cache_limiter
現在のキャッシュリミッタを取得または設定する
unknown
現在のキャッシュリミッタの名前を返します。 引数を指定した場合は、現在のキャッシュリミッタが引数に指定した値に変更されます。
キャッシュリミッタは、クライアントに送信されるキャッシュ制御用のHTTPヘッダを制御します。 これらのヘッダは、ページの内容をクライアントやプロキシがキャッシュする規則を定義します。 例えば、キャッシュリミッタをnocacheに設定した場合、クライアント/プロキシのキャッシュは無効になります。 publicの場合はキャッシュを許可します。 privateに設定した場合は、プロキシがキャッシュ数r個とは許可しませんが、クライアントがキャッシュすることは許可されます。
privateモードにおいて、Expireヘッダがクライアントに送信されます。 これはMozillaのようないくつかのブラウザを混乱させます。 回避するには、private_no_expireモードを使用してください。 このモードでは、Expireヘッダはクライアントに送信されません。
キャッシュリミッタは、リクエスト開始時にsession.cache_limiterに保存されたデフォルト値にリセットされます。 つまり、各リクエスト毎に(出力バッファが無効な場合はsession_start()をコールする必要があります。
<?
# キャッシュリミッタを'private'に設定
session_cache_limiter('private');
# キャッシュリミッタを取得
$cache_limiter = session_cache_limiter();
echo "キャッシュリミッタは、現在「{$cache_limiter}」に設定されています。";
// キャッシュリミッタは、現在「private」に設定されています。
?>
session_decode
文字列からセッションデータをデコードする
unknown
エンコードされたセッションデータをデコードし、セッションに保存する変数を設定します。 成功した場合にTRUE、失敗した場合にFALSEを返します。
<?
function decode_session($session_string){
$current_session = session_encode();
foreach ($_SESSION as $key => $value){
unset($_SESSION[$key]);
}
session_decode($session_string);
$restored_session = $_SESSION;
foreach ($_SESSION as $key => $value){
unset($_SESSION[$key]);
}
session_decode($current_session);
return $restored_session;
}
session_start();
$_SESSION['foo'] = 'var';
$str=session_encode();
$arr=decode_session($str);
print_r($_SESSION);
echo "<br>\n";
print_r($arr);
/*
Array ( [foo] => var )
Array ( [foo] => var )
*/
?>
session_destroy
セッションに登録されたデータを全て破棄する
unknown
現在のセッションに関連づけられたすべてのデータを破棄します。 成功した場合にTRUE、失敗した場合にFALSEを返します。
ただし、この関数はセッション変数やセッションクッキーは破棄されません。
また、ブラウザを閉じた場合てもセッション変数は破棄されません。
セッション変数は、$_SESSION=array()
のようにして初期化してください。
セッションクッキーは、setcookie()を使用して有効期限に負の値を指定して無効にしてください。
再び、セッション変数の利用するにはsession_start()をコールする必要があります。
ユーザーがログアウトする時のように、セッションを切断するには、セッションIDの割り当ても解除する必要があります。 セッションIDの受け渡しにクッキーが使用されている場合(デフォルトでは使用)には、セッションクッキーも削除する必要がありませう。 それには、setcookie()を使用します。
$_SESSIONを使用していない場合は、session_unset()を使用してください。
<?
# セッションの初期化 ※session_name("something")を使用している場合は特にこれを忘れないように!
session_start();
# セッション変数を全て解除
$_SESSION = array();
# セッションを切断するにはセッションクッキーも削除 ※セッション情報だけでなくセッションを破棄
if (isset($_COOKIE[session_name()])) {
setcookie(session_name(), '', time()-42000, '/');
}
# 最終的にセッションを破棄
session_destroy();
?>
session_encode
現在のセッションデータを文字列としてエンコードする
unknown
現在のセッションの内容をエンコードした文字列を返します。
<?
# セッションデータ初期化
session_start();
# セッションデータ追加
$_SESSION['login_ok'] = true;
$_SESSION['nome'] = 'sica';
$_SESSION['inteiro'] = 34;
# 現在のセッションデータを文字列としてエンコード
echo session_encode();
// login_ok|b:1;nome|s:4:"sica";inteiro|i:34;
?>
session_id
現在のセッション ID を取得または設定する
unknown
セッションIDとは、サイトの訪問者に割り振られるユニークなIDです。 セッションIDはクッキーに保存されます。
現在のセッションIDを取得するには、この関数を引数なしでコールします。 現在のセッションのセッションIDが存在する場合は、そのセッションIDを返します。 現在のセッションあるいはセッションIDが存在しない場合は、空文字列を返します。
現在の名前とセッションIDをURLに追加できる文字列として取得するために定数SIDを使用することができます。 ただしURLに追加するのは、ブラウザの履歴に残るため、セキュリティ上よくありません。 php.iniでsession.use_trans_sidに0を指定している場合は、セッションIDをURLに追加することはできません。
現在のセッションIDを設定するには、第1引数idに新しいセッションIDを指定して、現在のセッションIDを置換します。 セッションハンドラによってセッションIDとして使用可能な文字に制限がある場合があります。 例えば、ファイルによるセッションハンドラにセッションIDとして使用可能な文字は、a-z A-Z 0-9、「,」(カンマ)、「-」(マイナス)になります。 ただしPHP v5.0.0からは、ファイルのセッションハンドラで「,」(カンマ)、「-」(マイナス)を使用できます。
- セッションIDを設定する場合は、この関数をsession_start()より前にコールする必要があります。
- セッション保持にクッキーを使用している場合、この関数に引数を指定すると、現在のセッションIDが設定されるものと同一であるかどうかに関わらず、session_start()がコールされる際に、常に新しいクッキーが送信されます。
<?
session_start();
$_SESSION['foo'] = "var";
var_dump(session_id());
var_dump(session_id("b36dfc173c91554dcdd0c887c67afa9a"));
/*
string(32) "b36dfc173c91554dcdd0c887c67afa9a"
string(32) "b36dfc173c91554dcdd0c887c67afa9a"
*/
?>
session_is_registered ※非推奨
変数がセッションに登録されているかどうかを調べる
unknown
変数名に指定したグローバル変数がセッション登録されているかどうかを調べます。 変数名に指定したグローバル変数が現在のセッションに登録されている場合にTRUE、そうでない場合にFALSEを返します。
この関数は、PHP v5.3.0で非推奨となり、PHP v6.0.0で削除されます。 $_SESSION(PHP v4.0.6以前の場合は$HTTP_SESSION_VARS)を使用している場合に、ある変数が$_SESSIONに登録されているかを確認するには、isset()を使用してください。
<?
session_start();
$_SESSION['foo'] = "var";
# 非推奨
var_dump(session_is_registered("foo"));
// $_SESSION['foo']
# 推奨
if(isset($_SESSION['foo'])){
echo "OK";
}else{
echo "NG";
}
// OK
?>
session_module_name
現在のセッションモジュールを取得または設定する
unknown
現在のセッションモジュールの名前を返します。 第1引数moduleを指定すると、現在のモジュールの代わりに指定されたモジュールが使用されます。
<?
echo session_module_name(); // files
?>
session_name
現在のセッション名を取得または設定する
unknown
引数なしでコールした場合は、現在のセッション名を返します。
セッション名は、リクエストが開始時に設定され、session.nameに保存されたデフォルト値(=PHPSESSID)に戻ります。 そのため、各リクエスト毎にsession_start()またはsession_register()をコールする前に、この関数をコール必要があります。
現在のセッション名を取得する場合は、第1引数名前に、クッキーおよびURLのセッションIDを指定します。 セッション名は英数字のみで構成されている必要があり、短くかつその内容が分かるような名前である必要があります。
セッション名は数字だけでは構成できないため、少なくとも1つ以上の文字が含まれている必要があります。 そうでない場合は、新しいセッションIDが毎回生成されます。
<?
# セッション名をWebsiteIDに設定
session_name("WebsiteID");
# セッションデータ初期化
session_start();
# 現在のセッション名を取得
echo "現在のセッション名は「".session_name()."」です";
// 現在のセッション名は「WebsiteID」です
?>
session_regenerate_id
現在のセッションIDを新しく生成したものと置き換える
unknown
現在のセッションIDを新しいものに置換します。 成功した場合に、TRUE、失敗した場合にFALSEを返します。
オプションの第1引数delete_old_session(PHP v5.1.0~)には、関連付けられた古いセッションを削除するかどうかを指定します。 デフォルトはFALSE(現在のセッション情報を保持する)です。
<?
session_start();
$_SESSION["foo"]="var";
$old_sessionid = session_id();
session_regenerate_id();
$new_sessionid = session_id();
echo "古いセッション: $old_sessionid<br>";
echo "新しいセッション: $new_sessionid<br>";
print_r($_SESSION);
/*
古いセッション: 84d26a665426a55f358297f2dd4521cc
新しいセッション: 25aaa7adbaf738322e5d783916e5bfe3
Array ( [foo] => var )
*/
?>
session_register
現在のセッションに1つ以上の変数を登録する
unknown
この関数の引数は可変であり、各引数は変数名を保持する文字列または変数名からなる配列とすることが可能です。 各変数名が処理されるたびに、この関数は、その変数名のグローバル変数を現在のセッションに登録します。
配列$_SESSIONまたは$SERVER_SESSION_VARSの適当なメンバに設定するだけでもセッション変数を作成することができます。
この関数をコールする前に、session_start()をコールしていない場合は、引数なしでsession_start()がコールされます。 $_SESSIONを使用する場合は、必ずこの関数をコール前にsession_start()をコールする必要があります。
引数名前には、変数名を含む文字列、あるいは変数名や配列を含む配列を指定します。
この関数は、PHP v5.3.0で非推奨となり、PHP v6.0.0で削除されます。
<?
session_start();
// session_register() の使用は推奨されません。
$barney = "A big purple dinosaur.";
session_register("barney");
// PHP 4.1.0以降では$_SESSIONの使用が推奨されます。
$_SESSION["zim"] = "An invader from another planet.";
/*
Array
(
[barney] => A big purple dinosaur.
[zim] => An invader from another planet.
)
*/
// 古い手法としては $HTTP_SESSION_VARS があります。
$HTTP_SESSION_VARS["spongebob"] = "He's got square pants.";
/*
Array
(
[barney] => A big purple dinosaur.
[spongebob] => He's got square pants.
)
*/
?>
session_save_path
現在のセッションデータ保存パスを取得または設定する
unknown
現在のセッションデータの保存先ディレクトリのパスを返します。
第1引数パスにセッションでータのパスを指定した場合は、データを保存するパスが変更されます。 その際は、session_start()より前にこの関数をコールしてください。
<?
# 現在のセッションデータの保存先ディレクトリのパスを取得
session_save_path( );
# セッションデータ初期化
session_start();
echo "現在のセッションデータは「". session_save_path() ."」に保存されています。";
// 現在のセッションデータは「/tmp」に保存されています。
?>
session_set_save_handler
ユーザ定義のセッション保存関数を設定する
unknown
セッションに関連するデータを保存および取得するために使用されるユーザー定義のセッション保存関数を設定します。 成功した場合にTRUE、失敗した場合にFALSEを返します。 この関数は、セッションデータをローカルデータベースに保存する場合のように、PHPセッションにより提供されるもの以外の保存方法を使用したい場合に有用です。
第1引数openには、open関数を指定します。 これはクラスのコンストラクタのようなもので、セッションが開かれた際に実行されます。 open関数は2つの引数を受け取り、第1引数が保存パス、第2引数がセッション名になります。
第2引数closeには、close関数を指定します。 これはクラスのデストラクタのようなもので、セッションの走査が終了した際に実行されます。
第3引数readには、read関数を指定します。 saveハンドラが期待通りに動作するようにread関数は常に文字列を返す必要があります。 データがない場合には、から文字列を返すようにしてください。 他のハンドラからの返り値は、成功した場合にTRUE、失敗した場合にFALSEを返すようにしてください。
第4引数writeには、writeハンドラを指定します。 writeハンドラは、出力ストリームが閉じてから実行されるため、writeハンドラ内でデバッグ出力を行ってもブラウザには表示されません。 デバッグ出力が必要な場合は、ファイルに書き出すようにしてください。
第5引数destroyには、destroyハンドラを指定します。 これはセッションが、session_destroy()で破棄された際に実行されます。 唯一の引数としてセッションIDを受け取ります。
第6引数gcには、ガベージコレクタを指定します。 これはセッションのガベージコレクタが実行された時に実行され、唯一の引数としてセッションの最大有効期限を受け取ります。
<?
function open($save_path, $session_name){
global $sess_save_path;
$sess_save_path = $save_path;
return(true);
}
function close(){
return(true);
}
function read($id){
global $sess_save_path;
$sess_file = "$sess_save_path/sess_$id";
return (string) @file_get_contents($sess_file);
}
function write($id, $sess_data){
global $sess_save_path;
$sess_file = "$sess_save_path/sess_$id";
if($fp = @fopen($sess_file, "w")){
$return = fwrite($fp, $sess_data);
fclose($fp);
return $return;
} else {
return(false);
}
}
function destroy($id){
global $sess_save_path;
$sess_file = "$sess_save_path/sess_$id";
return(@unlink($sess_file));
}
function gc($maxlifetime){
global $sess_save_path;
foreach(glob("$sess_save_path/sess_*") as $filename){
if(filemtime($filename) + $maxlifetime < time()){
@unlink($filename);
}
}
return true;
}
session_set_save_handler("open", "close", "read", "write", "destroy", "gc");
session_start();
// セッションを通常通り使用
?>
session_start
セッションデータを初期化する
unknown
セッションを作成します。 または、リクエスト上でGET、POST、クッキーによって渡されたセッションIDに基づき現在のセッションを復帰します。 セッションが正常に開始した場合にTRUE、それ以外の場合にFALSEを返します。
名前付きのセッションを使用する場合は、この関数をコールする前にsession_name()をコールしてください。
この関数は、trans-sidが有効な場合に、URL書き換え用の内部出力ハンドラを登録します。 ユーザーがob_start()と共にob_gzhandler()または類似のものを使用している場合、出力ハンドラの順番は正しく出力を行うために重要です。 例えば、セッション開始時にユーザーは、ob_gzhandler()を登録する必要があります。
<?
///////////////////// page1.php
# セッションデータ初期化
session_start();
echo "Welcome to page #1";
$_SESSION["favcolor"] = "green";
$_SESSION["animal"] = "cat";
$_SESSION["time"] = time();
# セッションクッキーが有効なら動作する
echo "<br>\n<a href='page2.php'>page 2</a>";
# あるいは必要に応じてセッションIDを渡すう
echo "<br>\n<a href='page2.php?".SID."'>page 2</a>";
/*
Welcome to page #1<br>
<a href='page2.php'>page 2</a><br>
<a href='page2.php?'>page 2</a>
*/
?>
<?
///////////////////// page2.php
# タイムゾーン設定
date_default_timezone_set("Asia/Tokyo");
# セッションデータ初期化
session_start();
echo "Welcome to page #2<br>\n";
echo $_SESSION["favcolor"]; // green
echo $_SESSION["animal"]; // cat
echo date("Y m d H:i:s", $_SESSION["time"]);
# page1.php と同様にここでSIDを使用可
echo "<br>\n<a href='page1.php'>page 1</a>";
/*
Welcome to page #2<br>
greencat2009 06 09 01:27:36<br>
<a href='page1.php'>page 1</a>
*/
?>
session_unregister
現在のセッションから変数の登録を削除する
unknown
指定した名前のグローバル変数の登録を現在のセッションから削除します。 成功した場合にTRUE、失敗した場合にFALSEを返します。
この関数は、PHP v5.3.0で非推奨となり、PHP v6.0.0で削除されます。
<?
// セッションデータを初期化する
session_start();
$str ="var";
session_register($str);
echo "現在のセッション変数の値は「". $str."」です<br>\n";
// 現在のセッションから変数の登録を削除する
session_unregister($str);
echo $str."現在のセッション変数の値はありません。";
?>
session_unset
すべてのセッション変数を開放する
unknown
現在登録されているすべてのセッション変数を開放します。 返り値はありません。
<?
///////////////////// page1.php
# セッションデータ初期化
session_start();
$_SESSION['foo']="var";
print "<a href='page2.php'>Page2</a>";
?>
<?
///////////////////// page2.php
# セッションデータ初期化
session_start();
print_r($_SESSION); // Array ( [foo] => var )
# すべてのセッション変数を開放
session_unset();
print_r($_SESSION); // Array()
?>
session_write_close/session_commit
セッションデータを書き込んでセッションを終了する
unknown
session_commit()は、この関数のエイリアスです。
現在のセッションを終了し、セッションデータを書き込みます。 返り値はありません。
セッションでータは、この関数をコールしなくても、スクリプト終了時に保存されます。 ただし、セッションdータは同時書き込みを防ぐのにロックされるため、ある時点であるセッション処理ができるスクリプトは1つだけです。 そのため、セッションでフレームを使用する場合、このロックのためにフレームがひとつずつロードされます。 セッションへ全ての変更が行われた時に、明示的にこの関数をコールして、すぐにセッションを終了することで、全てのフレームのロードにかかる時間を短縮することができます。
<?
# セッションデータ初期化
session_start();
$_SESSION['foo'] = 'box';
# 現在のセッションを終了し、セッションデータを書き込む
session_write_close();
# セッション変数のキーにvisitedがあるか調べる
if(array_key_exists('visited',$_SESSION)) {
echo "welcome back!\n";
}else{
echo "I don't know you.\n";
$_SESSION['visited'] = true;
session_write_close();
}
// I don't know you.
?>