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

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

//=======================================
// 程序: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;
}
}

实现基于文件存储的Session类的更多相关文章

  1. 实现基于Memcache存储的Session类

    自主实现Session功能的类,基于文件方式存储Session数据,测试基本通过,还比较好玩,实际应用没有意义,只不过是学习Session是如何实现的. 使用基于文件的Session存取瓶颈可能都是在 ...

  2. 读取Excel文件存储在实体类中

    1.Maven文件 <!--读取Excel的架包--> <dependency> <groupId>org.apache.poi</groupId> & ...

  3. Java GUI记账本(基于Mysql&&文件存储两种版本)

    */ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.java * 作者:常轩 * 微信公众号:Worldh ...

  4. tornado 基于MongoDB存储 session组件开发

    1.开发伊始 根据源码中RequestHandler类中发现__init__函数中会调用自身initialize函数,此函数中为pass,即可以围绕initialize开发一系列的组件 2.开发实现 ...

  5. PHP中使用Redis接管文件存储Session详解

    前言 php默认使用文件存储session,如果并发量大,效率会非常低.而redis对高并发的支持非常好,可以利用redis替换文件来存储session. 最近就遇到了这个问题,之前找了网上的一套直播 ...

  6. PHP中Redis替代文件存储Session语句

    php默认使用文件存储session,如果并发量大,效率非常低.而Redis对高并发的支持非常好,所以,可以使用redis替代文件存储session. 这里,介绍下php的 session_set_s ...

  7. PHP中如何使用Redis接管文件存储Session详解

    https://www.jb51.net/article/151580.htm 前言 php默认使用文件存储session,如果并发量大,效率会非常低.而redis对高并发的支持非常好,可以利用red ...

  8. Hadoop IO基于文件的数据结构详解【列式和行式数据结构的存储策略】

    Charles所有关于hadoop的文章参考自hadoop权威指南第四版预览版 大家可以去safari免费阅读其英文预览版.本人也上传了PDF版本在我的资源中可以免费下载,不需要C币,点击这里下载. ...

  9. 一个简单的C#获取Session、设置Session类文件

    一个简单的C#获取Session.设置Session类文件,本类主要实现大家最常用的两个功能: 1.GetSession(string name)根据session名获取session对象: 2.Se ...

随机推荐

  1. usaco 奶牛接力

    Description 为增强体质,约翰决定举办一场奶牛接力跑比赛.比赛现场有一些接力位置,这些位置间有T条路连接,第i条路的长度为Li. 有N头奶牛需要参加比赛,领头的奶牛从位置S出发,她会按照你的 ...

  2. JS中多个onload冲突解决办法

    一  多个window.onload冲突 在一个页面中有两个JavaScript 分别都用到了window.onload一个是:window.onload=externallinks,另一个是:win ...

  3. 使用.htaccess实现apache URL重定向

    一.什么是URL重定向? URL重定向(URL redirection,或称网址重定向或网域名称转址),是指当使用者浏览某个网址时,将他导向到另一个网址的技术. 二.URL重定向怎么配置? 1)首先需 ...

  4. fiddler 抓包post请求body参数在jmeter中的书写

    jmeter请求一直报错,最后查出来是请求参数的格式写错了,醉了 记录一下,以防我再次健忘 fidder抓包显示详情 jmeter 请求body data参数书写直接复制fiddler里TextVie ...

  5. android设备连接不上电脑的解决方法

    先检查手机usb调试是否开启,已经开启还是连不上按照以下步骤操作: 1. 打开cmd,输入adb devices  查看设备是否连接 2.服务未启动,先杀掉服务:adb kill-server 3.启 ...

  6. linux fork函数浅析

    #include <sys/types.h> #include <unistd.h> /* 功能:复制进程 參数:无 返回值: 成功: 父进程:返回子进程id 子进程:返回0 ...

  7. [PHP] find ascii code in string

    if (strpos($data ,chr(0x95)) !== false) { echo 'true'; }else{ echo "false"; }

  8. iOS判断iPhone型号

    链接: http://stackoverflow.com/questions/11197509/ios-how-to-get-device-make-and-modelhttp://stackover ...

  9. window下手动搭建 PHP+Nginx+Mysql(转)

    首先还是下载 nginx:  http://nginx.org/en/download.html php  :  http://windows.php.net/download/ mysql:  ht ...

  10. 软件版本中的Alpha,Beta,RC,Trial是什么意思?

    版本号: V(Version):即版本,通常用数字表示版本号.(如:EVEREST Ultimate v4.20.1188 Beta ) Build:用数字或日期标示版本号的一种方式.(如:VeryC ...