TP 学习之 session 方法的学习

来源:互联网 发布:陈奕迅 歌词 知乎 编辑:程序博客网 时间:2024/05/29 18:56

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


1 0
原创粉丝点击