[原创]实现基于文件存储的Session类

本文介绍了一个基于文件存储的自定义Session类实现,通过客户端Cookie保存Session ID,并将数据存储在服务器端。支持普通文件、共享内存(SHM)、NFS服务器等多种存储方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实现基于文件存储的Session类

作者:heiyeluren
博客:
http://blog.youkuaiyun.com/heiyeshuwu

我没事的时候写的自主实现Session功能的类,基于文件方式存储Session数据,测试基本通过,还比较好玩,实际应用没有意义,只不过是学习Session是如何实现的。

一般基于文件存储Session数据效率不是很高,毕竟跟磁盘IO是有关系的,如果需要多台服务器共享数据,可以考虑使用NFS来存储数据,如果需要比较快的速度,可以考虑使用共享内存(shm)来保存数据,直接把Session数据存储路径指定为/dev/shm,这样磁盘IO会提高不少,不过shm空间比较小,一般Linux下是60多M,所以不可能保存太多数据。

<? php
// =======================================
//程序:File-BasedSessionClass
//功能:基于文件存储的Session功能类
//作者:heiyeluren
//博客:http://blog.youkuaiyun.com/heiyeshuwu
//时间:2006-12-22
//=======================================



/* *
*类名:FileSessionClass
*功能:自主实现基于文件存储的Session功能
*描述:这个类就是实现Session的功能,基本上是通过设置客户端的Cookie来保存SessionID,
*然后把用户的数据保存在服务器端,最后通过Cookie中的SessionId来确定一个数据是否是用户的,
*然后进行相应的数据操作,目前的缺点是没有垃圾收集功能
*
*本方式适合保存在普通文件、共享内存(SHM)、NFS服务器等基于文件存储的方式,推荐保存在共享
*内存当中,因为共享内存存取效率比较高,但是空间比较小,重启后就销毁了
*/
class FileSession
{
var $sessId = '' ;
var $sessSavePath = ' /tmp/ ' ;
var $isCreatePath = true ;
var $sessExpireTime = '' ;
var $sessFilePrefix = ' sess_ ' ;
var $cookieName = ' __SessHandler ' ;

/* *
*构造函数
*
*@parambool$isInit-是否实例化对象的时候启动Session
*/
function FileSession( $isInit = false ){
if ( $isInit ){
$this -> start();
}
}

// -------------------------
//外部方法
//-------------------------


/* *
*启动Session操作
*
*@paramint$expireTime-Session失效时间,缺省是0,当浏览器关闭的时候失效,该值单位是秒
*/
function start( $expireTime = 0 ){
$sessId = $_COOKIE [ $this -> cookieName];
if ( ! $sessId ){
if ( ! $this -> _checkSavePath()){
$this -> _showMessage( ' Sessionsavepath ' . $this -> sessSavePath . ' notorcreatepathfailed ' );
}
$this -> sessId = $this -> _getId();
$this -> sessExpireTime = ( $expireTime > 0 ) ? time () + $expireTime : 0 ;
setcookie ( $this -> cookieName , $this -> sessId , $this -> sessExpireTime , " / " , '' );
$_SESSION = array ();
$this -> _writeFile();
}
else {
$this -> sessId = $sessId ;
$_SESSION = unserialize ( $this -> _getFile( $sessId ));
}
}

/* *
*判断某个Session变量是否注册
*
*@paramstring$varName-
*@returnbool存在返回true,不存在返回false
*/
function is_registered( $varName ){
if ( ! isset ( $_SESSION [ $varName ])){
return false ;
}
return true ;
}

/* *
*注册一个Session变量
*
*@paramstring$varName-需要注册成Session的变量名
*@parammixed$varValue-注册成Session变量的值
*@returnbool-该变量名已经存在返回false,注册成功返回true
*/
function register( $varName , $varValue ){
if ( isset ( $_SESSION [ $varName ])){
return false ;
}
$_SESSION [ $varName ] = $varValue ;
$this -> _writeFile();
return true ;
}

/* *
*销毁一个已注册的Session变量
*
*@paramstring$varName-需要销毁的Session变量名
*@returnbool销毁成功返回true
*/
function unregister( $varName ){
unset ( $_SESSION [ $varName ]);
$this -> _writeFile();
return true ;
}

/* *
*销毁所有已经注册的Session变量
*
*@return销毁成功返回true
*/
function destroy(){
$_SESSION = array ();
$this -> _writeFile();
return true ;
}

/* *
*获取一个已注册的Session变量值
*
*@paramstring$varName-Session变量的名称
*@returnmixed-不存在的变量返回false,存在变量返回变量值
*/
function get( $varName ){
if ( ! isset ( $_SESSION [ $varName ])){
return false ;
}
return $_SESSION [ $varName ];
}

/* *
*获取所有Session变量
*
*@returnarray-返回所有已注册的Session变量值
*/
function getAll(){
return $_SESSION ;
}

/* *
*获取当前的SessionID
*
*@returnstring获取的SessionID
*/
function getSid(){
return $this -> sessId;
}

/* *
*获取服务器端保存的Session数据的路径
*
*@returnstring保存Session的路径
*/
function getSavePath(){
return $this -> sessSavePath;
}

/* *
*设置保存Session数据的路径
*
*@paramstring$savePath-需要保存Session数据的绝对路径
*/
function setSavePath( $savePath ){
$this -> sessSavePath = $savePath ;
}


// -------------------------
//内部接口
//-------------------------


/* *
*生成一个SessionID
*
*@returnstring返回一个32位的SessionID
*/
function _getId(){
return md5 ( uniqid ( microtime ()));
}

/* *
*检查保存Session数据的路径是否存在
*
*@returnbool成功返回true
*/
function _checkSavePath(){
if ( file_exists ( $this -> sessSavePath)){
return true ;
}
if ( ! $this -> isCreatePath){
return false ;
}
if ( ! @ mkdir ( $this -> sessSavePath)){
$this -> _showMessage( ' Failed:Sessioncachepath ' . $this -> sessSavePath . ' isnotexists,createfailed ' );
}
@
chmod ( $this -> sessSavePath , 0777 );
return true ;
}

/* *
*获取Session文件中的数据
*
*@paramstring$sessId-需要获取Session数据的SessionId
*@returnunknown
*/
function _getFile( $sessId = '' ){
$sessId = ( $sessId == '' ) ? $this -> sessId : $sessId ;
$sessFile = $this -> sessSavePath . $this -> sessFilePrefix . $sessId ;
if ( ! file_exists ( $sessFile )){
$this -> _showMessage( ' Failed:Sessionfile ' . $sessFile . ' notexists ' );
}
return file_get_contents ( $sessFile );
}

/* *
*把当前的Session数据写入到数据文件
*
*@paramstring$sessId-SessionID
*@return成功返回true
*/
function _writeFile( $sessId = '' ){
$sessId = ( $sessId == '' ) ? $this -> sessId : $sessId ;
$sessFile = $this -> sessSavePath . $this -> sessFilePrefix . $sessId ;
$sessStr = serialize ( $_SESSION );
if ( ! $fp = @ fopen ( $sessFile , " w+ " )){
$this -> _showMessage( ' Failed:Opensessionsavefile ' . $sessFile . ' failed ' );
}
if ( ! @ fwrite ( $fp , $sessStr )){
$this -> _showMessage( ' Failed:Writesessiondatato ' . $sessFile . ' failed ' );
}
@
fclose ( $fp );
return true ;
}

/* *
*显示提示信息
*
*@paramstring$strMessage-需要显示的信息内容
*@parambool$isFailed-是否是失败信息,缺省是true
*/
function _showMessage( $strMessage , $isFailed = true ){
if ( $isFailed ){
exit ( $strMessage );
}
echo $strMessage ;
}
}
?>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值