实现基于文件存储的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的草莓原创小说系统微信小说平台系统源码” 这个标题揭示了我们正在探讨一个使用PHP编程语言开发的系统,该系统专为草莓原创小说平台设计,且集成了微信小说服务。这意味着系统可能包括用户登录...
解压并分析"132690153497598379"这个文件,可以深入了解程序的具体实现,包括其架构、算法和特定功能的实现细节。不过,由于这个文件名看起来并不像常规的PHP源代码文件或文档,可能是数据文件、配置文件或者是...
5. **用户认证与授权**:实现用户注册、登录功能,可能使用了session或cookie来跟踪用户状态,以及权限控制,确保只有授权用户才能提交文章。 6. **表单处理**:创建HTML表单接收用户投稿,使用PHP处理表单数据,...
标题“计算机毕业设计-基于ASP通用高校科研管理系统(2009年5月原创)”表明这是一个2009年5月份完成的计算机专业毕业设计项目,其核心是构建一个通用的高校科研管理系统。系统采用ASP(Active Server Pages)技术...
ASP网上书店系统是一种基于Active Server Pages (ASP)技术构建的电子商务平台,主要应用于在线图书销售。这个2009年的毕业设计源码提供了一个完整的网上书店解决方案,它展示了如何利用ASP来开发动态网页,实现用户...
【BBS论坛系统源代码详解】 ...总之,这个"原创jsp实现BBS论坛系统源代码"项目提供了学习和研究Web开发,特别是JSP和BBS系统构建的良好机会。通过深入分析和实践,可以提升对Java Web技术的理解和应用能力。
3. **数据库设计**:一个问答系统需要存储问题、答案、用户信息等数据,因此需要熟悉SQL和数据库管理,如MySQL,进行数据库表的设计和操作。 4. **session和cookie**:用于跟踪用户状态,例如登录信息,确保用户在...
- **data**目录:存储缓存、session、日志等数据。 - **会员中心**(member)和**后台管理**(admin)目录:分别对应用户和管理员的操作界面。 - **js**和**css**目录:包含前端JavaScript和CSS样式文件。 - **...
《JSP基于WEB的图书馆借阅系统的设计与实现》是一个典型的Web应用项目,适用于学习和毕业设计。这个系统采用JavaServer Pages(JSP)技术,结合数据库管理,为用户提供了一个在线图书借阅和管理的平台。以下是该系统...
.zip文件格式通常用于打包和压缩多个文件,便于下载和存储。 【标签】"PHP"表明这个项目的核心技术是PHP,这是一种广泛应用于Web开发的服务器端脚本语言。PHP以其易学性、跨平台性和丰富的扩展库而受到欢迎,特别...
【标题】"在一起在线文件管理器 v1.0 -ASP源码.zip" 是一个基于ASP技术的在线文件管理系统源代码包。ASP(Active Server Pages)是微软开发的一种服务器端脚本环境,主要用于创建动态交互式的网页。这个源码版本为v...
"web-chatroom" 提示压缩包内包含的可能是一个名为"web-chatroom"的目录或文件,这通常包含了项目的所有源代码、静态文件、配置文件等,用户解压后可以运行和研究这个聊天室的实现细节。 在这个基于Flask的网络聊天...
- `storage`:存储用户上传的文件、日志等。 - `vendor`:第三方库和依赖。 综上所述,这套源码涉及到的PHP技术和Web开发流程十分全面,对于想要学习或开发游戏交易平台的人来说,是一份有价值的参考资料。在使用前...
6. **保存和输出**:生成的验证码图像会被输出到浏览器,同时验证码的字符串会通过`session`存储,以便后续验证。`header()`函数用于设置HTTP响应头,告知浏览器以图像格式(如JPEG或PNG)来接收数据,`imagejpeg()`...
10. 性能优化:对于大型文件存储系统,性能优化是不可忽视的。这可能涉及文件缓存、数据库查询优化、CDN(内容分发网络)集成等技术。 通过研究这个源码,你可以学习到实际项目中的PHP开发经验,同时也可以加深对...
标题中的“留言板小系统,绝对原创,所使用语言php”表明这是一个基于PHP编程语言开发的简单留言板应用。PHP是一种广泛使用的开源脚本语言,尤其在Web开发领域中被大量运用,因为它可以方便地与HTML结合,实现动态...
3. **文件上传与存储**:为了支持播客的上传,系统需要实现文件上传功能。这通常涉及到HTTP协议的multipart/form-data编码,以及对上传文件的大小、类型进行限制和安全检查。文件可能被存储在服务器本地文件系统,...
在"基于ASP的批量替换采集文章同义词ACCESS版 v1.0.zip"这个项目中,我们可以推测这是一款利用ASP技术构建的工具,其功能主要是批量处理采集到的文章,通过同义词替换来提高内容的原创性和多样性。这在SEO(搜索引擎...
4. **Session对象**:用来存储用户在会话期间的数据,它可以帮助我们实现用户状态的跟踪,即使用户在网站内部跳转,也能保持数据的一致性。 5. **Application对象**:类似于Session,但它的作用范围更大,可以共享...
【标题】:“基于jsp的随堂考试系统”是本文的核心,它揭示了研究的主要内容,即利用JavaServer Pages(JSP)技术开发一个用于课堂测试的在线平台。JSP是一种服务器端的脚本语言,主要用于动态网页的创建,它结合了...