喜悦国际村 
» 游客:  注册 | 登录 | 搜索 | 统计 | 喜悦证交所 | 帮助

RSS 订阅当前论坛  

【村长请吃饭啊】 ---北京诚聘--- 【你还在犹豫吗?】

上一主题 下一主题
 63  6/7  <  1  2  3  4  5  6  7  > 
     
标题: 最近写的代码 仅做交流用  
 
sanders_yao
版主
Rank: 7Rank: 7Rank: 7
or2 =333


UID 30286
精华 0
积分 2487
帖子 4632
金钱 2484 喜悦币
威望 0
人脉 3
阅读权限 100
注册 2004-7-23
来自 北京 菜户营
状态 离线
重新写的会话类型

采用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->itsCookieHttponlyfalse;
        
$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, -11)    ? "/"    "";
        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->itsCookieHttponlySESSION_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(0strlen($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->itsIDtrue);
        if(!
is_dir($dir)){
            if(!
$this->mkpath($dir0777)){
                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($fpLOCK_EX)){
                
fwrite($fpserialize($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($fpLOCK_EX)){
                
fwrite($fpimplode("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(
== intval(phpversion())){
            if(
false == @mkdir($path0777true)){
                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标签吃斜杠 请下附件看详细的内容


 附件: 您所在的用户组无法下载或查看附件



最近写的一些代码都会在以下地址发布,有兴趣的来批:
http://www.phpx.com/happy/thread-131368-1-1.html
2008-2-14 01:57 PM#51
查看资料  Blog  发短消息  顶部
 
hnscdfly
注册会员
Rank: 2
一般会员



UID 25148
精华 0
积分 55
帖子 51
金钱 55 喜悦币
威望 0
人脉 0
阅读权限 20
注册 2003-12-11
状态 离线
[推荐阅读] PHP开发工程师


QUOTE:
原帖由 txg0_0 于 2007-4-10 05:00 PM 发表
我顶
你个肺
好东西,先收藏,有时间再做研究!
也不能老待有时间。完全可以在蹲厕所时,扶着本看完。




主页http://www.phpxe.com
博客http://blog.phpxe.com
2008-3-21 02:06 PM#52
查看资料  访问主页  Blog  发短消息  顶部
 
mengxue
新手上路
Rank: 1


UID 99510
精华 0
积分 5
帖子 5
金钱 5 喜悦币
威望 0
人脉 0
阅读权限 10
注册 2007-10-8
状态 离线
[推荐阅读] 北京某网站招聘PHP程序员
厉害呢,呵呵好好研究
2008-3-24 11:16 AM#53
查看资料  发短消息  顶部
 
ccqzcy
新手上路
Rank: 1



UID 111851
精华 0
积分 1
帖子 1
金钱 1 喜悦币
威望 0
人脉 0
阅读权限 10
注册 2008-2-27
来自 河南
状态 离线
[推荐阅读] 北京·WEB2.0公司·招多名PHP程序员
是不是联系学创建类啊 ?
2008-4-1 07:57 PM#54
查看资料  发短消息  QQ  Yahoo!  顶部
 
aeolus
注册会员
Rank: 2


UID 110669
精华 0
积分 74
帖子 84
金钱 74 喜悦币
威望 0
人脉 0
阅读权限 20
注册 2008-2-19
状态 离线
[推荐阅读] 5k求php开发人员
樓主很強的說!
2008-4-2 04:26 PM#55
查看资料  发短消息  顶部
 
sanders_yao
版主
Rank: 7Rank: 7Rank: 7
or2 =333


UID 30286
精华 0
积分 2487
帖子 4632
金钱 2484 喜悦币
威望 0
人脉 3
阅读权限 100
注册 2004-7-23
来自 北京 菜户营
状态 离线
[推荐阅读] 层阴影的问题


QUOTE:
原帖由 ccqzcy 于 2008-4-1 07:57 PM 发表
是不是联系学创建类啊 ?
建议吗?感谢哦
我最近搞flex和as3 感觉是要学习下设计模式了




最近写的一些代码都会在以下地址发布,有兴趣的来批:
http://www.phpx.com/happy/thread-131368-1-1.html
2008-4-2 05:53 PM#56
查看资料  Blog  发短消息  顶部
 
绿竹居
注册会员
Rank: 2


UID 75446
精华 0
积分 177
帖子 155
金钱 177 喜悦币
威望 0
人脉 0
阅读权限 20
注册 2006-6-23
来自 湖北*钟祥
状态 离线
[推荐阅读] 乐库网诚聘*高级PHP程序员*
真的很强...学习了~~~~



-----玉不琢不成器,人不學不成才-----
2008-4-3 02:24 PM#57
查看资料  Blog  发短消息  顶部
 
hnscdfly
注册会员
Rank: 2
一般会员



UID 25148
精华 0
积分 55
帖子 51
金钱 55 喜悦币
威望 0
人脉 0
阅读权限 20
注册 2003-12-11
状态 离线
[推荐阅读] 同一类商品的进仓和出仓后的总和怎么计算?
要批评你发得太稍。直接打个大包吧。^_^



主页http://www.phpxe.com
博客http://blog.phpxe.com
2008-4-11 06:28 PM#58
查看资料  访问主页  Blog  发短消息  顶部
 
qibinghua (qibinghua)
新手上路
Rank: 1
初级会员



UID 64783
精华 0
积分 31
帖子 38
金钱 31 喜悦币
威望 0
人脉 0
阅读权限 10
注册 2005-6-16
状态 离线
[推荐阅读] Hustren Newsletter 系统为你网站添加邮件订阅功能
左右值分类一塌糊涂
2008-4-20 05:16 AM#59
查看资料  发短消息  顶部
 
sanders_yao
版主
Rank: 7Rank: 7Rank: 7
or2 =333


UID 30286
精华 0
积分 2487
帖子 4632
金钱 2484 喜悦币
威望 0
人脉 3
阅读权限 100
注册 2004-7-23
来自 北京 菜户营
状态 离线
[推荐阅读] 什么情况下会出现这样的情况?


QUOTE:
原帖由 qibinghua 于 2008-4-20 05:16 AM 发表
左右值分类一塌糊涂
多谢指点
那类型确实有问题 在执行效率上反而很差 已经有人使用并反馈了这个意见
我也没有将其应用到项目中过这个类型 目前正在研究新的方法 但愿能在效率上有所突破




最近写的一些代码都会在以下地址发布,有兴趣的来批:
http://www.phpx.com/happy/thread-131368-1-1.html
2008-4-21 05:23 PM#60
查看资料  Blog  发短消息  顶部
 63  6/7  <  1  2  3  4  5  6  7  > 
     


  可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题 | 开通个人空间  


 


Powered by Discuz! 6.1.0  © 2001-2010 Comsenz Inc.
Processed in 0.068182 second(s), 6 queries

(冀ICP备05009913号) 管理员:sadly 邮箱/MSN: sadly@phpx.com QQ:824008(长隐) 清除 Cookies - - Archiver - WAP