`

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

 
阅读更多

实现基于文件存储的Session类

作者:heiyeluren
博客:
http://blog.csdn.net/heiyeshuwu

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

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

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



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

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

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


/**
*启动Session操作
*
*@paramint$expireTime-Session失效时间,缺省是0,当浏览器关闭的时候失效,该值单位是秒
*/
functionstart($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
*/
functionis_registered($varName){
if(!isset($_SESSION[$varName])){
returnfalse;
}
returntrue;
}

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

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

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

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

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

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

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

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


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


/**
*生成一个SessionID
*
*@returnstring返回一个32位的SessionID
*/
function_getId(){
returnmd5(uniqid(microtime()));
}

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

/**
*获取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');
}
returnfile_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);
returntrue;
}

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

分享到:
评论

相关推荐

    基于PHP的草莓原创小说系统微信小说平台系统源码.zip

    【标题】:“基于PHP的草莓原创小说系统微信小说平台系统源码” 这个标题揭示了我们正在探讨一个使用PHP编程语言开发的系统,该系统专为草莓原创小说平台设计,且集成了微信小说服务。这意味着系统可能包括用户登录...

    基于PHP的在线伪原创程序php版.zip

    解压并分析"132690153497598379"这个文件,可以深入了解程序的具体实现,包括其架构、算法和特定功能的实现细节。不过,由于这个文件名看起来并不像常规的PHP源代码文件或文档,可能是数据文件、配置文件或者是...

    基于PHP的盾灵原创文章投稿系统.zip

    5. **用户认证与授权**:实现用户注册、登录功能,可能使用了session或cookie来跟踪用户状态,以及权限控制,确保只有授权用户才能提交文章。 6. **表单处理**:创建HTML表单接收用户投稿,使用PHP处理表单数据,...

    计算机毕业设计-基于ASP通用高校科研管理系统(2009年5月原创)

    标题“计算机毕业设计-基于ASP通用高校科研管理系统(2009年5月原创)”表明这是一个2009年5月份完成的计算机专业毕业设计项目,其核心是构建一个通用的高校科研管理系统。系统采用ASP(Active Server Pages)技术...

    基于ASP网上书店系统毕业设计源码(2009年原创)网上绝无一样的

    ASP网上书店系统是一种基于Active Server Pages (ASP)技术构建的电子商务平台,主要应用于在线图书销售。这个2009年的毕业设计源码提供了一个完整的网上书店解决方案,它展示了如何利用ASP来开发动态网页,实现用户...

    原创jsp实现BBS论坛系统源代码

    【BBS论坛系统源代码详解】 ...总之,这个"原创jsp实现BBS论坛系统源代码"项目提供了学习和研究Web开发,特别是JSP和BBS系统构建的良好机会。通过深入分析和实践,可以提升对Java Web技术的理解和应用能力。

    基于PHP的vivianphp百度知道v7.2源码.zip

    3. **数据库设计**:一个问答系统需要存储问题、答案、用户信息等数据,因此需要熟悉SQL和数据库管理,如MySQL,进行数据库表的设计和操作。 4. **session和cookie**:用于跟踪用户状态,例如登录信息,确保用户在...

    基于PHP的信丰php生活网整站系统dede内核源码.zip

    - **data**目录:存储缓存、session、日志等数据。 - **会员中心**(member)和**后台管理**(admin)目录:分别对应用户和管理员的操作界面。 - **js**和**css**目录:包含前端JavaScript和CSS样式文件。 - **...

    JSP基于WEB的图书馆借阅系统的设计与实现(源代码+LW).zip

    《JSP基于WEB的图书馆借阅系统的设计与实现》是一个典型的Web应用项目,适用于学习和毕业设计。这个系统采用JavaServer Pages(JSP)技术,结合数据库管理,为用户提供了一个在线图书借阅和管理的平台。以下是该系统...

    基于PHP的wancms免费版手游平台php版源码.zip

    .zip文件格式通常用于打包和压缩多个文件,便于下载和存储。 【标签】"PHP"表明这个项目的核心技术是PHP,这是一种广泛应用于Web开发的服务器端脚本语言。PHP以其易学性、跨平台性和丰富的扩展库而受到欢迎,特别...

    在一起在线文件管理器 v1.0 -ASP源码.zip

    【标题】"在一起在线文件管理器 v1.0 -ASP源码.zip" 是一个基于ASP技术的在线文件管理系统源代码包。ASP(Active Server Pages)是微软开发的一种服务器端脚本环境,主要用于创建动态交互式的网页。这个源码版本为v...

    web-chatroom_CDE59:Com_cde59com_基于flask的网络聊天室_www,cde59,com_wron

    "web-chatroom" 提示压缩包内包含的可能是一个名为"web-chatroom"的目录或文件,这通常包含了项目的所有源代码、静态文件、配置文件等,用户解压后可以运行和研究这个聊天室的实现细节。 在这个基于Flask的网络聊天...

    基于PHP的仿7881游戏交易平台整站php版源码.zip

    - `storage`:存储用户上传的文件、日志等。 - `vendor`:第三方库和依赖。 综上所述,这套源码涉及到的PHP技术和Web开发流程十分全面,对于想要学习或开发游戏交易平台的人来说,是一份有价值的参考资料。在使用前...

    PHP原创验证码源码.rar

    6. **保存和输出**:生成的验证码图像会被输出到浏览器,同时验证码的字符串会通过`session`存储,以便后续验证。`header()`函数用于设置HTTP响应头,告知浏览器以图像格式(如JPEG或PNG)来接收数据,`imagejpeg()`...

    PHP实例开发源码—PHP可道云在线网盘源码(资源管理器).zip

    10. 性能优化:对于大型文件存储系统,性能优化是不可忽视的。这可能涉及文件缓存、数据库查询优化、CDN(内容分发网络)集成等技术。 通过研究这个源码,你可以学习到实际项目中的PHP开发经验,同时也可以加深对...

    留言板小系统,绝对原创,所使用语言php

    标题中的“留言板小系统,绝对原创,所使用语言php”表明这是一个基于PHP编程语言开发的简单留言板应用。PHP是一种广泛使用的开源脚本语言,尤其在Web开发领域中被大量运用,因为它可以方便地与HTML结合,实现动态...

    [影音娱乐]泉城JSP播客系统_video.zip

    3. **文件上传与存储**:为了支持播客的上传,系统需要实现文件上传功能。这通常涉及到HTTP协议的multipart/form-data编码,以及对上传文件的大小、类型进行限制和安全检查。文件可能被存储在服务器本地文件系统,...

    基于ASP的批量替换采集文章同义词ACCESS版 v1.0.zip

    在"基于ASP的批量替换采集文章同义词ACCESS版 v1.0.zip"这个项目中,我们可以推测这是一款利用ASP技术构建的工具,其功能主要是批量处理采集到的文章,通过同义词替换来提高内容的原创性和多样性。这在SEO(搜索引擎...

    基于ASP的小游戏CMS flash 爬虫采集(分成) XyxCms.zip

    4. **Session对象**:用来存储用户在会话期间的数据,它可以帮助我们实现用户状态的跟踪,即使用户在网站内部跳转,也能保持数据的一致性。 5. **Application对象**:类似于Session,但它的作用范围更大,可以共享...

    毕业论文——基于jsp的随堂考试系统

    【标题】:“基于jsp的随堂考试系统”是本文的核心,它揭示了研究的主要内容,即利用JavaServer Pages(JSP)技术开发一个用于课堂测试的在线平台。JSP是一种服务器端的脚本语言,主要用于动态网页的创建,它结合了...

Global site tag (gtag.js) - Google Analytics