session
我没事的时候写的自主实现Session功能的类,基于文件方式存储Session数据,测试基本通过,还比较好玩,实际应用没有意义,只不过是学习Session是如何实现的。
一般基于文件存储Session数据效率不是很高,毕竟跟磁盘IO是有关系的,如果需要多台服务器共享数据,可以考虑使用NFS来存储数据,如果需要比较快的速度,可以考虑使用共享内存(shm)来保存数据,直接把Session数据存储路径指定为/dev/shm,这样磁盘IO会提高不少,不过shm空间比较小,一般Linux下是60多M,所以不可能保存太多数据。
php
//================================= == =====
// プログラム: ファイルベースのセッションクラス
// 機能: ファイルストレージに基づくセッション関数クラス
// 著者: heiyeluren
// ブログ: http://blog.csdn.net/ heiyeshuwu
// 時間: 2006-12-22
//=================================== ==== =
/**
* クラス名: FileSession Class
* 機能: ファイルストレージに基づいたセッション機能を独自に実装する
* 説明: このクラスは機能を実現します基本的に、クライアントの Cookie を設定してセッション ID を保存し、
* 次にサーバー側でユーザーのデータを保存し、最後に Cookie 内のセッション ID を使用してデータがユーザーに属するかどうかを判断し、
* そして現状の欠点はガベージコレクション機能がないことです
*
* この方法は、通常のファイル、共有メモリ (SHM)、NFS サーバーなどのファイル保存方法に保存することをお勧めします。共有
* メモリに保存します。共有メモリのアクセス効率は比較的高いためですが、スペースが比較的小さいため、
=
'';
var
$ sessSavePath = '/tmp/'
; var $isCreatePath = true ; var
$ $sessexpiretime='''; /** * コンストラクター
** @param bool $isInit - オブジェクトのインスタンス化時にセッションを開始するかどうか
*/
functionFileSession($isInit= false ){
if ($isInit){
//--------- ----------------外部メソッド:
/**
* セッション操作の開始
*/
function start(
$expireTime
=
0){ $sessId = $_COOKIE [
$this-> cookieName]; if (!$ this>_checksavepath()){$ this&>
sesssavepath '); } sessId =
$this-> _getId(); $this->sessExpireTime = ($expireTime > 0) ? 時間() + $expireTime : 0;
setcookie($this- >クッキー名、 $this ->sessId, $this->sessExpireTime, "/" 、 '');
$_SESSION = array();
$this-> _writeFile();
} else {
$this ->sessId = $sessId;
$_SESSION = シリアル化解除($this->_getFile( $sessId));
}
}
/**
* 特定のセッション量が注釈かどうか判断します
*
* @param string $varName -
* @return bool 存在戻りtrue,存在しない戻りfalse
*/
function is_registered($varName){
if (!isset($_SESSION[$varName])){
false;
本当
; } } /**
* セッション変数を登録します
*
* @param string $varName - Sessionとして登録する必要がある変数名 * @parammixed $varValue - 値として登録しますセッション変数の * @return bool - 変数名はすでに存在しており、 false を返します。登録が成功した場合は true を返します
*/
function register($var名前
、 $varValue){ return false
; } $_SESSION[$varName ] = $varValue
;; - >_WriteFile(); ]);
$ this->_writeFile();returntrue
; ->
_writeFile(); return
true }
/**
; * 登録されたセッション変数値を取得します * * @param string $varName - Se ssion 変数の名前 * @returnmixed - 存在しません 変数は false を返し、既存の変数は変数値を返します !isset( $_SESSION
[$varName [ ]; }
/** * すべてのセッション変数を取得します */
function getAll(){
Return
$ _Session; }
/***現在のセッションIDを取得します**@Return String
関数getSid (){return $this->sessId;
}
/**
* サーバー側に保存されているセッションデータへのパスを取得します
*
* @return stringセッション パスの保存
sessSavePath; }
/** * セッションデータを保存するパスを設定します avePath
){ $ this->sessSavePath =
$savePath; }
// -------内部インターフェース
* * セッション ID を生成します * * @return string 32 ビットのセッション ID を返します */
_getI d(){ (uniqid(microtime) ())); }
/*
*
* * @return bool 正常に true を返します*/
->sessSavePath)){
本当
; }if (!$this->isCreatePath){
mkdir ($) this
->
sessSavePath)){ '失敗: セッション キャッシュ パス ' . $this->sessSavePath .
' が存在しません。作成に失敗しました' ); } @ chmod($this ->sessSavePath, 0777); /** * セッションファイルデータを取得します
d
= '){ )?$this- >
sessId : $sessId
;
$sessFile= $this->sessSavePath .$this-> sessFilePrefix . $sessId ;
->_showMessage('失敗: セッション ファイル '.
$sessFile .'存在しません') ; } return file_get_contents($sessFile ); }
/*
* * 現在のセッションデータを書き込みますデータファイル * * @ param string $sessId - セッションID * @return 正常に true を返します */
function
_writeFile($sessId
=
''){
$sess Id= ($sessId ==
'')?$this ->sessId :$sessId ; $this->sessSavePath . $this->sessFilePrefix
。 $ sessId; $sessStr = serialize($_SESSION);
if () !$fp = @fopen ($sessFile, "w+")){
$this-> _showMessage('失敗: セッションを開く 保存ファイル '. $sessFile .' 失敗しました');
}
} if (!@fwrite ($fp, $sessStr
)){ $this->_showMessage(' 失敗: セッションデータを'に書き込みます. $sessFile .' 失敗しました'
); } @fclose ($fp
); 戻る true
;
} /*
*
* 显表示情報
*
* @param string $strMessage - 表示が必要な情報内容 * @param bool $isFailed - 否か失败情報, 缺省はtrue */
function _showMessage($strMessage, $isFailed ) = true
){ if ($は失敗しました
🎜){🎜 exit($strMessage);
}
echo $strMessage;
}
}
?>