采用hash路径的方法存储会话的文件会话类型 请高手指教
ps:声明下
我写的这些代码中大部分仅仅是出于试验目的 还不能保证执行效率 我不推荐各位在各自的项目中采用这些代码
如果要使用 请先做好压力测试确定可靠性后谨慎使用 本人没有能力对造成的后果负责
<?php
//==================================================
// 类型: Session
// 功能: 会话
// 属性: @$itsDir 会话的保存目录
// 属性: @$itsID 会话ID
// 属性: @$itsExpir 会话的寿命
// 属性: @$itsName 会话的变量名
// 属性: @$itsCookieExpir cookie的寿命
// 属性: @$itsCookiePath cookie的地址
// 属性: @$itsCookieDomain cookie的域名
// 属性: @$itsCookieSecure 是否通过ssl套接子层发送cookie
// 属性: @$itsCookieHttponly 是否只能通过http发送cookie
// 属性: @$itsExtra 会话数据文件的扩展名
// 属性: @$itsVaribles 会话变量
// 属性: @$itsIndex 会话索引
// 方法: Session 构造函数
// 方法: ini 初始化
// 方法: id 获取会话ID
// 方法: get 获取会话变量
// 方法: close 关闭会话
// 方法: getIndex 获取会话索引
// 方法: setIndex 保存会话索引
// 方法: flush 回收资源
// 方法: getPath 通过id获取路径
// 方法: mkpath 创建路径
//==================================================
class Session{
var $itsDir;
var $itsID;
var $itsExpir;
var $itsName;
var $itsCookieExpir;
var $itsCookiePath;
var $itsCookieDomain;
var $itsCookieSecure;
var $itsCookieHttponly;
var $itsExtra;
var $itsVaribles;
var $itsIndex;
//==================================================
// 方法名: Session()
// 功能: 会话
// 返回: 该类型对象本身
//==================================================
function Session(){
$this->itsDir = preg_replace(array("~\~", "~/[^/]*?$~"), array("/", "/"), __FILE__);
$this->itsID = NULL;
$this->itsExpir = 30;
$this->itsName = "mySession";
$this->itsCookieExpir = 0;
$this->itsCookiePath = "";
$this->itsCookieDomain = "";
$this->itsCookieSecure = false;
$this->itsCookieHttponly= false;
$this->itsExtra = "";
$this->itsVaribles = NULL;
$this->itsIndex = NULL;
}
//==================================================
// 方法名: ini($dir, $expir, $name, $cookieExpir, $path, $domain, $secure, $httponly, $ext)
// 功能: 初始化
// 参数:
// @$dir: 会话路径
// @$expir: 会话寿命
// @$name: 会话名(cookie或get变量名)
// @$cookieExpir: 发送cookie的寿命
// @$path: cookie的路径
// @$domain: cookie的域名
// @$secure: cookie是否为ssl传输
// @$httponly: cookie传输是否只能通过http
// @$ext: 会话文件的后缀
// 返回: BOOLEAN
//==================================================
function ini($dir = "", $expir = 0, $name = "", $cookieExpir = NULL, $path = NULL, $domain = NULL, $secure = NULL, $httponly = NULL, $ext = NULL){
if($dir){
$this->itsDir = preg_replace(array("~\~", "~/[^/]*?$~"), array("/", "/"), $dir);
}elseif(defined("SESSION_DIR")){
$this->itsDir = SESSION_DIR;
}
$this->itsDir .= "/" != substr($this->itsDir, -1, 1) ? "/" : "";
if(!is_dir($this->itsDir)){
echo "<br />DIR ({$this->itsDir}) not exists";
return false;
}
if($expir){
$this->itsExpir = $expir;
}elseif(defined("SESSION_EXPIR")){
$this->itsExpir = SESSION_EXPIR;
}
if($name){
$this->itsName = $name;
}elseif(defined("SESSION_NAME")){
$this->itsName = SESSION_NAME;
}
if(NULL !== $cookieExpir){
$this->itsCookieExpir = $cookieExpir;
}elseif(defined("SESSION_COOKIE_EXPIR")){
$this->itsCookieExpir = SESSION_COOKIE_EXPIR;
}
if(NULL !== $path){
$this->itsCookiePath = $path;
}elseif(defined("SESSION_COOKIE_PATH")){
$this->itsCookiePath = SESSION_COOKIE_PATH;
}
if(NULL !== $domain){
$this->itsCookieDomain = $domain;
}elseif(defined("SESSION_COOKIE_DOMAIN")){
$this->itsCookieDomain = SESSION_COOKIE_DOMAIN;
}
if(NULL !== $secure){
$this->itsCookieSecure = $secure;
}elseif(defined("SESSION_COOKIE_SECURE")){
$this->itsCookieSecure = SESSION_COOKIE_SECURE;
}
if(NULL !== $httponly){
$this->itsCookieHttponly= $httponly;
}elseif(defined("SESSION_COOKIE_HTTPONLY")){
$this->itsCookieHttponly= SESSION_COOKIE_HTTPONLY;
}
if(NULL !== $extra){
$this->itsExtra = $extra;
}elseif(defined("SESSION_EXTRA")){
$this->itsExtra = SESSION_EXTRA;
}
$this->flush();
$this->id();
return true;
}
//==================================================
// 方法名: id($length, $chars)
// 功能: 获取会话id
// 参数:
// @$length: id长度
// @$chars: 字符集
// 返回: 会话id
//==================================================
function id($length = 6, $chars = "0123456789qwertyuiopasdfghjQWERTYUIOPASDFGHJ"){
if(isset($_COOKIE[$this->itsName]) && file_exists($this->getPath($_COOKIE[$this->itsName]))){
$this->itsID = $_COOKIE[$this->itsName];
}elseif(isset($_GET[$this->itsName]) && file_exists($this->getPath($_GET[$this->itsName]))){
$this->itsID = $_GET[$this->itsName];
}else{
for(;1;){
$id = "";
for($i = 0;$i < $length;$i ++){
list($usec, $sec) = explode(' ', microtime());
$seed = (float) $sec + ((float) $usec * 100000);
srand($seed);
$offset = rand(0, strlen($chars) - 1);
$id .= $chars[$offset];
}
if(!file_exists($this->getPath($id))){
break;
}
}
if((float)phpversion() >= 5.2){
setcookie($this->itsName, $id, $this->itsCookieExpir, $this->itsCookiePath, $this->itsCookieDomain, $this->itsCookieSecure, $this->itsCookieHttponly);
}else{
setcookie($this->itsName, $id, $this->itsCookieExpir, $this->itsCookiePath, $this->itsCookieDomain, $this->itsCookieSecure);
}
$this->itsID = $id;
$this->itsIndex[$this->itsID] = time();
$this->setIndex();
}
$this->itsIndex[$this->itsID] = time();
return $this->itsID;
}
//==================================================
// 方法名: get()
// 功能: 获取会话数据
// 参数: 无
// 返回: 会话保存的数据
//==================================================
function & get(){
if(!$this->itsVaribles && file_exists($this->getPath($this->itsID))){
$this->itsVaribles = unserialize(file_get_contents($this->getPath($this->itsID)));
}
return $this->itsVaribles;
}
//==================================================
// 方法名: close()
// 功能: 关闭会话
// 参数: 无
// 返回: BOOLEAN
//==================================================
function close(){
if(!$this->itsID){
echo "<br />Not initialize session id";
return false;
}
$dir = $this->getPath($this->itsID, true);
if(!is_dir($dir)){
if(!$this->mkpath($dir, 0777)){
echo "<br />Can not create dir({$dir})";
return false;
}
}
$file = $this->getPath($this->itsID);
if(file_exists($file)){
unlink($file);
}
if($fp = @fopen($file, "w")){
if(@flock($fp, LOCK_EX)){
fwrite($fp, serialize($this->itsVaribles));
fclose($fp);
}
}
return true;
}
//==================================================
// 方法名: getIndex()
// 功能: 获取索引
// 参数: 无
// 返回: 索引数据
//==================================================
function getIndex(){
if($this->itsIndex){
return $this->itsIndex;
}
$this->itsIndex = array();
if(file_exists($this->itsDir."index") && filesize($this->itsDir."index")){
$temp = file($this->itsDir."index");
foreach($temp as $v){
list($key, $value) = explode("|", $v);
$this->itsIndex[trim($key)] = trim($value);
}
}
return $this->itsIndex;
}
//==================================================
// 方法名: setIndex()
// 功能: 保存索引
// 参数: 无
// 返回: 无
//==================================================
function setIndex(){
$data = array();
foreach($this->itsIndex as $k => $v){
$data[] = "{$k}|{$v}";
}
if(file_exists($this->itsDir."index")){
unlink($this->itsDir."index");
}
if($fp = @fopen($this->itsDir."index", "w")){
if(@flock($fp, LOCK_EX)){
fwrite($fp, implode("n", $data));
fclose($fp);
}
}
}
//==================================================
// 方法名: flush()
// 功能: 资源回收并更新索引
// 参数: 无
// 返回: 无
//==================================================
function flush(){
$this->getIndex();
$time = time();
foreach($this->itsIndex as $k => $v){
if($v + $this->itsExpir < $time){
unset($this->itsIndex[$k]);
$file = $this->getPath($k);;
if(file_exists($file)){
unlink($file);
}
}
}
$this->setIndex();
}
//==================================================
// 方法名: getPath($s, $dir)
// 功能: 获取数据的hash路径
// 参数:
// @$s: 要转换的字符串(会话id)
// @$dir: 是否返回的是目录
// 返回: 保存会话数据的路径
//==================================================
function getPath($s, $dir = false){
if($dir){
return $this->itsDir.$s[0].$s[1]."/".$s[2].$s[3]."/";
}
return $this->itsDir.$s[0].$s[1]."/".$s[2].$s[3]."/".$s[4].$s[5].$this->itsExtra;
}
//==================================================
// 方法名: mkpath($path, $mode)
// 功能: 创建路径
// 参数:
// @path: 路径
// @mode: 权限
// 返回: BOOLEAN
//==================================================
function mkpath($path, $mode){
if(5 == intval(phpversion())){
if(false == @mkdir($path, 0777, true)){
return false;
}
}else{
$arrayPath = explode("/", $path);
$path = array_shift($arrayPath);
foreach($arrayPath as $v){
$path .= "/" . $v;
if(!is_dir($path) && "." != $v && ".." != $v){
if(false == @mkdir($path, $mode)){
return false;
}
@chmod($path, $mode);
}
}
}
return true;
}
}
?>
测试代码如下:
<?php
$s = new Session;
$s->ini("/wwwroot/guestbook/data/session/"); //默认30秒超时
$SessionData = & $s->get();
//$SessionData = array(1,2,3,4); //测试数据
print_r($SessionData);
$s->close();
unset($s);
?>
还是请高手不吝赐教 发这个帖子比较郁闷的地方就是没有人对我的代码做出批评 有违我的初衷 请大家不要客气 随便拍砖
拍的过程中才能有好代码出现
还是老样子 为了防止村里的php标签吃斜杠 请下附件看详细的内容