ホームページ >php教程 >php手册 >PHPのSESSION機構の解析

PHPのSESSION機構の解析

WBOY
WBOYオリジナル
2016-06-21 08:49:18770ブラウズ

この記事では主にphpセッション技術に関する記事を紹介します。

1.session.save_handler = ファイル

1. session_start()

(1) session_start() はセッションメカニズムの始まりであり、一定の確率でガベージコレクションを有効にします。セッションはファイルに保存されるため、SESSION のリサイクルは無効になります。この確率は php.ini の設定に基づいて決定されますが、一部のシステムでは session.gc_probability = 0 (確率が 0 であることを意味し、ガベージ コレクションは cron スクリプトによって実装されます) になっています。

session.gc_probability = 1
session.gc_divisor = 1000
session.gc_maxlifetime = 1440//有効期限のデフォルトは 24 分
//確率は session.gc_probability/session.gc_divisor 結果 1/1000,
//セッション ガベージ コレクションでは各ファイルの有効期限が切れているかどうかを確認する必要があるため、小さすぎる設定はお勧めできません。
session.save_path = // システムごとにデフォルトが異なるようです。1 つの設定は "N;/path"
です。 //これはランダムな階層ストレージです。この場合、ガベージ コレクションは機能しないため、独自のスクリプトを作成する必要があります

(2) セッションは、現在 $_COOKIE[session_name()] が存在するかどうかを判断します。 session_name() は、session_id を保存する COOKIE キーの値を返します。
この値は php.ini

から見つけることができます。

session.name = PHPSESSID //デフォルト値 PHPSESSID

(3) 存在しない場合は、session_id が生成され、生成された session_id が COOKIE の値としてクライアントに渡されます。これは、次の COOKIE 操作を実行するのと同じであることに注意してください。 COOKIE はヘッダーで送信されます。PHP には別の関数 session_regenerate_id() があり、この関数を使用する場合、この前に出力はありません。

setcookie(
セッション名()、
session_id()、
session.cookie_lifetime,//デフォルト 0
Session.cookie_path, //デフォルトの '/' は現在のプログラムとディレクトリで有効です
session.cookie_domain,//デフォルトは空です
)

(4) 存在する場合は、session_id = $_COOKIE[session_name]; 次に、session.save_path で指定されたフォルダーに移動して、「SESS_」 .session_id() という名前のファイルを見つけ、ファイルの内容を読み取り、逆シリアル化します。それを $_SESSION

に入れます。

2. $_SESSION

に値を代入します。

たとえば、新しい値 $_SESSION['test'] = 'blah'; を追加すると、この $_SESSION は、スクリプトの実行終了時にメモリ内にのみ保持され、$_SESSION の値が書き込まれます。指定した session_id フォルダーを開き、関連するリソースを閉じます。この段階では、古い session_id を破棄して新しい session_id を生成するなど、session_id を変更する操作を実行できます。Drupal の匿名ユーザーなどのカスタム セッション操作とロール変換に使用されます。 SESSION ログイン後は、新しい session_id

を使用する必要があります。
<?php
if(isset($_COOKIE[session_name()])){
	setcookie(session_name(),'',time()-42000,'/');//旧session cookie过期
}
session_regenerate_id();//这一步会生成新的session_id
//session_id()返回的是新的值     

3. SESSION の書き込み操作

スクリプトの最後で、SESSION 書き込み操作が実行され、$_SESSION の値が session_id で指定されたファイルに書き込まれます。このファイルはすでに存在している場合もあれば、新しいファイルを作成する必要がある場合もあります。作成されました。

4. セッションを破棄します

SESSION によって送信される COOKIE は通常、インスタント COOKIE であり、ブラウザを閉じる代わりにログアウトするなど、ブラウザを閉じると有効期限が切れます。コード内で SESSION を破棄するには、次のような方法があります:

setcookie(session_name(), session_id(), time() - 8000000, ..);//ログアウトする前に実行
usset($_SESSION);//これにより、すべての $_SESSION データが削除されます。更新後、COOKIE が渡されますが、データはありません
session_destroy();//この関数はより完全で、$_SESSION を削除し、セッション ファイルと session_id

を削除します。

ブラウザを閉じずに再度更新すると、2と3にCOOKIESが送信されますが、データが見つかりません

2.session.save_handler = ユーザー

ユーザー定義のセッション処理メカニズム、より直感的

session_set_save_handler('open', 'close', 'read', 'write', 'destroy', 'gc');

(1) session_start()、open($save_path, $session_name) を実行してセッション操作ハンドルを開きます。$save_path は session.save_handler = files の場合は session.save_path ですが、ユーザーがカスタマイズした場合、これらは2 つのパラメータは使用されず、直接 TRUE が返されます。

read($id) を実行してそこからデータを読み取ります。 //このパラメータは自動的に session_id() に渡され、この値を介して操作できます。

(2) スクリプトの実行が終了し、write($id, $sess_data) を実行します。 //パラメータは 2 つで、非常にシンプルです。

(3) ユーザーが session_destroy() を必要とする場合は、最初に destroy を実行し、次にステップ 2 (実際的な例) を実行します。
<?php
//SESSION初始化的时候调用
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){
	echo "sdfsf";
	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;
}



声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。