TP 学习之 session 方法的学习

最近公司项目也做的差不多了,终于有点时间来仔细研究一下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>


  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值