搜索
首页php教程php手册实现基于文件存储的Session类

session

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

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

 

 

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



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

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

    
    
/**
     * 启动Session操作
     *
     * @param int $expireTime - Session失效时间,缺省是0,当浏览器关闭的时候失效, 该值单位是秒
     
*/
    
function start($expireTime = 0){
        
$sessId = $_COOKIE[$this->cookieName];
        
if (!$sessId){
            
if (!$this->_checkSavePath()){
                
$this->_showMessage('Session save path '. $this->sessSavePath .' not or create path failed');
            }
            
$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变量是否注册
     *
     * @param string $varName - 
     * @return bool 存在返回true, 不存在返回false
     
*/
    
function is_registered($varName){
        
if (!isset($_SESSION[$varName])){
            
return false;
        }
        
return true;
    }    
        
    
/**
     * 注册一个Session变量
     *
     * @param string $varName - 需要注册成Session的变量名
     * @param mixed $varValue - 注册成Session变量的值
     * @return bool - 该变量名已经存在返回false, 注册成功返回true
     
*/
    
function register($varName, $varValue){
        
if (isset($_SESSION[$varName])){
            
return false;
        }
        
$_SESSION[$varName= $varValue;
        
$this->_writeFile();
        
return true;
    }
    
    
/**
     * 销毁一个已注册的Session变量
     *
     * @param string $varName - 需要销毁的Session变量名
     * @return bool 销毁成功返回true
     
*/
    
function unregister($varName){
        
unset($_SESSION[$varName]);
        
$this->_writeFile();
        
return true;
    }
    
    
/**
     * 销毁所有已经注册的Session变量
     *
     * @return 销毁成功返回true
     
*/
    
function destroy(){
        
$_SESSION = array();
        
$this->_writeFile();
        
return true;    
    }
    
    
/**
     * 获取一个已注册的Session变量值
     *
     * @param string $varName - Session变量的名称
     * @return mixed - 不存在的变量返回false, 存在变量返回变量值
     
*/
    
function get($varName){
        
if (!isset($_SESSION[$varName])){
            
return false;
        }
        
return $_SESSION[$varName];
    }    
    
    
/**
     * 获取所有Session变量
     *
     * @return array - 返回所有已注册的Session变量值
     
*/
    
function getAll(){
        
return $_SESSION;
    }
    
    
/**
     * 获取当前的Session ID
     *
     * @return string 获取的SessionID
     
*/
    
function getSid(){
        
return $this->sessId;
    }

    
/**
     * 获取服务器端保存的Session数据的路径
     *
     * @return string 保存Session的路径
     
*/
    
function getSavePath(){
        
return $this->sessSavePath;
    }
    
    
/**
     * 设置保存Session数据的路径
     *
     * @param string $savePath - 需要保存Session数据的绝对路径
     
*/
    
function setSavePath($savePath){
        
$this->sessSavePath = $savePath;
    }    
    
    
    
//-------------------------
    //   内部接口
    //-------------------------

    
    
/**
     * 生成一个Session ID
     *
     * @return string 返回一个32位的Session ID
     
*/
    
function _getId(){
        
return md5(uniqid(microtime()));
    }
    
    
/**
     * 检查保存Session数据的路径是否存在
     *
     * @return bool 成功返回true
     
*/
    
function _checkSavePath(){
        
if (file_exists($this->sessSavePath)){
            
return true;
        }
        
if (!$this->isCreatePath){
            
return false;
        }
        
if (!@mkdir($this->sessSavePath)){
            
$this->_showMessage('Failed: Session cache path '. $this->sessSavePath .'is not exists, create failed');
        }
        @
chmod($this->sessSavePath, 0777);        
        
return true;
    }
    
    
/**
     * 获取Session文件中的数据
     *
     * @param string $sessId - 需要获取Session数据的SessionId
     * @return unknown
     
*/
    
function _getFile($sessId = ''){
        
$sessId = ($sessId == ''? $this->sessId : $sessId;
        
$sessFile = $this->sessSavePath . $this->sessFilePrefix . $sessId;
        
if (!file_exists($sessFile)){
            
$this->_showMessage('Failed: Session file '. $sessFile .' not exists');
        }
        
return file_get_contents($sessFile);
    }
    
    
/**
     * 把当前的Session数据写入到数据文件
     *
     * @param string $sessId - Session ID
     * @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: Open session save file '. $sessFile .' failed');
        }
        
if (!@fwrite($fp, $sessStr)){
            
$this->_showMessage('Failed: Write session data to '. $sessFile .' failed');
        }
        @
fclose($fp);
        
return true;
    }
    
    
/**
     * 显示提示信息
     *
     * @param string $strMessage - 需要显示的信息内容
     * @param bool $isFailed - 是否是失败信息, 缺省是true
     
*/
    
function _showMessage($strMessage, $isFailed = true){
        
if ($isFailed){
            
exit($strMessage);
        }
        
echo $strMessage;
    }    
}
?>


 



声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中

SublimeText3 英文版

SublimeText3 英文版

推荐:为Win版本,支持代码提示!

mPDF

mPDF

mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)