<?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;
}
}
?>