牛骨文教育服务平台(让学习变的简单)
博文笔记

TP 学习之 session 方法的学习

创建时间:2016-01-20 投稿人: 浏览次数:8323

最近公司项目也做的差不多了,终于有点时间来仔细研究一下Thinkphp 中的详细代码了,今天主要是看了一下TP session 方法的实现,然后就直接一边看,一边给代码一行行的加了注释!贴出来,自己记录一下,也供需要的人看一下!如果有注释的不对的地方,还请指出,共同学习!多谢多谢大笑。。。注释中还有一些小知识点是我们需要知道的,这个也要注意呢!

<span style="font-size:18px;">/**
 * session管理函数
 * @param string|array $name session名称 如果为数组则表示进行session设置
 * @param mixed $value session值
 * @return mixed
 */
function session($name="",$value="") {
    // 取到 session 保存前缀
    $prefix   =  C("SESSION_PREFIX");
    
    // 如果传入的name 为一个数组,那么就是初始化session
    if(is_array($name)) { // session初始化 在session_start 之前调用
    
        // 如果配置中设置了 session 前缀属性, 则更改配置项中的session 前缀
        if(isset($name["prefix"])) C("SESSION_PREFIX",$name["prefix"]);
        
        // 如果 request 中的session_id 有值,则将session_id 设置成它(优先设置成request 中的)
        if(C("VAR_SESSION_ID") && isset($_REQUEST[C("VAR_SESSION_ID")])){
            session_id($_REQUEST[C("VAR_SESSION_ID")]);
            
            // 否则就将 session_id 设置成传进来的值
        }elseif(isset($name["id"])) {
            session_id($name["id"]);
        }
        
        // 如果应用模式为 common 则将session 变成不能自动启动
        if("common" == APP_MODE){ // 其它模式可能不支持
            ini_set("session.auto_start", 0); 
        }
        
        // 设置session 的name
        if(isset($name["name"]))            session_name($name["name"]);
        // 设置session 存储的路径
        if(isset($name["path"]))            session_save_path($name["path"]);
        // 设置domain
        if(isset($name["domain"]))          ini_set("session.cookie_domain", $name["domain"]);
        // 设置session 的存在时间
        if(isset($name["expire"]))          {
            ini_set("session.gc_maxlifetime",   $name["expire"]);
            ini_set("session.cookie_lifetime",  $name["expire"]);
        }
        
        // 设置当页session 到下一页是否能够使用(这是个学习的点)  ???session 在第二页不能使用了的原因以及解决办法????
        // http://blog.163.com/freestyle_le/blog/static/1832794482012926725423/
        if(isset($name["use_trans_sid"]))   ini_set("session.use_trans_sid", $name["use_trans_sid"]?1:0);
        // 设置 session_id 在客户端采用的存储方式为cookie,只有这样$_COOKIE["PHPSESSIONID"] 才会存在
        if(isset($name["use_cookies"]))     ini_set("session.use_cookies", $name["use_cookies"]?1:0);
        // 指定回话页面所使用的缓存控制方法
        /**
        *  知识点:
        *  PHP中的 session_cache_limiter() 函数是指定会话页面所使用的缓冲控制方法。
        *   语法:
        *   string session_cache_limiter ( [string cache_limiter])
        *   cache_limiter 要设置的缓存限制的名字
        *   返回缓存限制的名字
        *    
        *   但是要值得注意的是session_cache_limiter()方法要写在session_start()方法之前才有用。
        *    
        *   实际应用:
        *    
        *   在开发过程中,往往因为表单出错而返回页面的时候填写的信息都不见了,为了支持页面回跳,可以通过两种方法实现。
        *    
        *   第一,使用Header方法设置消息头Cache-control
        *   header("Cache-control: private, must-revalidate");//支持页面回跳
        *    
        *   第二,使用session_cache_limiter方法
        *   //注意要写在session_start方法之前
        *   session_cache_limiter("private, must-revalidate");//支持页面回跳
        *
        */
        if(isset($name["cache_limiter"]))   session_cache_limiter($name["cache_limiter"]);
        
        // 设置session 缓存时间
        if(isset($name["cache_expire"]))    session_cache_expire($name["cache_expire"]);
        // 设置 session 存储方式  type: db file
        if(isset($name["type"]))            C("SESSION_TYPE",$name["type"]);
        
        if(C("SESSION_TYPE")) { // 读取session驱动
            $type   =   C("SESSION_TYPE");
            $class  =   strpos($type,"\")? $type : "Think\Session\Driver\". ucwords(strtolower($type));
            $hander =   new $class();
            
            // 这里有点不明白???????????????  &  php 中的引用(貌似和c++似的)
            session_set_save_handler(
                array(&$hander,"open"), 
                array(&$hander,"close"), 
                array(&$hander,"read"), 
                array(&$hander,"write"), 
                array(&$hander,"destroy"), 
                array(&$hander,"gc")); 
        }
        // 启动session 如果设置了自动启动
        // 这是在配置好了以上配置之后才启动session  因为有些配置项需要在session 启动之前配置
        if(C("SESSION_AUTO_START"))  session_start();
        
        
    }elseif("" === $value){ 
        if(""===$name){   // 如果value 值恒等于空则判断 name的值是否为空,如果不为空则代表获取全部的session 
            // 获取全部的session
            return $prefix ? $_SESSION[$prefix] : $_SESSION;
            
            // 下面几个同级if 如果想要看懂,先看下手册这里:
            //  http://document.thinkphp.cn/manual_3_2.html#session
        }elseif(0===strpos($name,"[")) { // session 操作
            if("[pause]"==$name){ // 暂停session
                session_write_close();
            }elseif("[start]"==$name){ // 启动session
                session_start();
            }elseif("[destroy]"==$name){ // 销毁session
                $_SESSION =  array();
                session_unset();
                session_destroy();
            }elseif("[regenerate]"==$name){ // 重新生成id
                session_regenerate_id();
            }
        }elseif(0===strpos($name,"?")){ // 检查session
            $name   =  substr($name,1);
            if(strpos($name,".")){ // 支持数组
                list($name1,$name2) =   explode(".",$name);
                return $prefix?isset($_SESSION[$prefix][$name1][$name2]):isset($_SESSION[$name1][$name2]);
            }else{
                return $prefix?isset($_SESSION[$prefix][$name]):isset($_SESSION[$name]);
            }
            
            // 如果传入的name = NULL || "" || 等等
        }elseif(is_null($name)){ // 清空session
            if($prefix) {
                unset($_SESSION[$prefix]);
            }else{
                $_SESSION = array();
            }
            
            
        }elseif($prefix){ // 获取session
            if(strpos($name,".")){
                list($name1,$name2) =   explode(".",$name);
                return isset($_SESSION[$prefix][$name1][$name2])?$_SESSION[$prefix][$name1][$name2]:null;  
            }else{
                return isset($_SESSION[$prefix][$name])?$_SESSION[$prefix][$name]:null;                
            }            
        }else{
            // 不存在前缀,则根据 传入的name 获取
            if(strpos($name,".")){  // 二维数组情况
                list($name1,$name2) =   explode(".",$name);
                return isset($_SESSION[$name1][$name2])?$_SESSION[$name1][$name2]:null;  
            }else{ // 一位数组情况
                return isset($_SESSION[$name])?$_SESSION[$name]:null;
            }            
        }
        
        // 如果值为空,名字不为空,则清空对应的值
    }elseif(is_null($value)){ // 删除session
        if(strpos($name,".")){
            list($name1,$name2) =   explode(".",$name);
            if($prefix){
                unset($_SESSION[$prefix][$name1][$name2]);
            }else{
                unset($_SESSION[$name1][$name2]);
            }
        }else{
            if($prefix){
                unset($_SESSION[$prefix][$name]);
            }else{
                unset($_SESSION[$name]);
            }
        }
        
    // 值也不为空  名字既不为空也不为数组    绑定键值
    }else{ // 设置session
		if(strpos($name,".")){
			list($name1,$name2) =   explode(".",$name);
			if($prefix){
				$_SESSION[$prefix][$name1][$name2]   =  $value;
			}else{
				$_SESSION[$name1][$name2]  =  $value;
			}
		}else{
			if($prefix){
				$_SESSION[$prefix][$name]   =  $value;
			}else{
				$_SESSION[$name]  =  $value;
			}
		}
    }
    return null;
}</span>


声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。