实现基于文件存储的Session类
自主实现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类的更多相关文章
- 实现基于Memcache存储的Session类
自主实现Session功能的类,基于文件方式存储Session数据,测试基本通过,还比较好玩,实际应用没有意义,只不过是学习Session是如何实现的. 使用基于文件的Session存取瓶颈可能都是在 ...
- 读取Excel文件存储在实体类中
1.Maven文件 <!--读取Excel的架包--> <dependency> <groupId>org.apache.poi</groupId> & ...
- Java GUI记账本(基于Mysql&&文件存储两种版本)
*/ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.java * 作者:常轩 * 微信公众号:Worldh ...
- tornado 基于MongoDB存储 session组件开发
1.开发伊始 根据源码中RequestHandler类中发现__init__函数中会调用自身initialize函数,此函数中为pass,即可以围绕initialize开发一系列的组件 2.开发实现 ...
- PHP中使用Redis接管文件存储Session详解
前言 php默认使用文件存储session,如果并发量大,效率会非常低.而redis对高并发的支持非常好,可以利用redis替换文件来存储session. 最近就遇到了这个问题,之前找了网上的一套直播 ...
- PHP中Redis替代文件存储Session语句
php默认使用文件存储session,如果并发量大,效率非常低.而Redis对高并发的支持非常好,所以,可以使用redis替代文件存储session. 这里,介绍下php的 session_set_s ...
- PHP中如何使用Redis接管文件存储Session详解
https://www.jb51.net/article/151580.htm 前言 php默认使用文件存储session,如果并发量大,效率会非常低.而redis对高并发的支持非常好,可以利用red ...
- Hadoop IO基于文件的数据结构详解【列式和行式数据结构的存储策略】
Charles所有关于hadoop的文章参考自hadoop权威指南第四版预览版 大家可以去safari免费阅读其英文预览版.本人也上传了PDF版本在我的资源中可以免费下载,不需要C币,点击这里下载. ...
- 一个简单的C#获取Session、设置Session类文件
一个简单的C#获取Session.设置Session类文件,本类主要实现大家最常用的两个功能: 1.GetSession(string name)根据session名获取session对象: 2.Se ...
随机推荐
- 传输层之TCP
---恢复内容开始--- 坞无尘水槛清,相思迢递隔重城. 秋阴不散霜飞晚,留得枯荷听雨声. --李商隐 上一篇中我们了解了socket编程是基于TCP或者UDP,所以我们有必要对TCP,和UDP ...
- 2D游戏编程3—GDI
WM_PAINT消息触发程序重新绘制界面,过程如下: PAINTSTRUCT ps; // used in WM_PAINT HDC hdc; // handle to ...
- [LeetCode] Minimum Size Subarray Sum 解题思路
Given an array of n positive integers and a positive integer s, find the minimal length of a subarra ...
- 字符编码笔记:ASCII,Unicode和UTF-8,附带 Little endian和Big endian的解释
作者: 阮一峰 日期: 2007年10月28日 今天中午,我突然想搞清楚Unicode和UTF-8之间的关系,于是就开始在网上查资料. 结果,这个问题比我想象的复杂,从午饭后一直看到晚上9点,才算初步 ...
- hdoj 1150 Machine Schedule【匈牙利算法+最小顶点覆盖】
Machine Schedule Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- SqlCommand对象
SqlCommand对象以及如何使用它与数据库交互 1.什么是command对象2.如何使用ExecuteReader方法查询数据3.如何使用ExecuteNonQuery方法插入和删除对象4.如何使 ...
- SpringMVC 测试 mockMVC
SpringMVC测试框架 基于RESTful风格的SpringMVC的测试,我们可以测试完整的Spring MVC流程,即从URL请求到控制器处理,再到视图渲染都可以测试. 一 MockMvcBui ...
- hibernate性能消耗太狠了。果断减肥引发的连串意外惊喜
近期在云服务器上新部署了一个项目 硬件配置 CPU: 2核 内存: 4096 MB (I/O优化) 开始是调试测试在用 没发觉,今天我看了下监控 cpu使用率达到了60-70% 而且一直持续 我 ...
- 【转】android Camera 中添加一种场景模式
http://blog.csdn.net/fulinwsuafcie/article/details/8833652 首先,来了解一下什么是场景模式. 最简单的方法当然是google了,这里有一篇文章 ...
- Java反射_JDBC操作数据
</pre><p>使用反射 来操作 这里是练习反射的使用</p><p>链接数据库工具类</p><p><pre name= ...