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
- TP 学习之 session 方法的学习
- tp学习之“困惑”
- tp学习
- tp学习
- SSH学习之Session接口的常用方法
- TP学习之创建入口文件
- hibernate学习之session常用方法和HQL语句的学习
- 小菜鸟学习TP的总结
- 学习日记-tp模版部分的使用
- php 学习之 session
- php 学习之 session
- hibernate学习之 Session
- hibernate学习之 session的产生方式
- TP下的session.memcache
- tp+dwz学习笔记
- TP学习笔记
- tp 学习基础
- php框架(CI,TP,LAVAREL,SWOOLE)源码学习之TP
- 搜狗输入法删除不用的词组,避免误输入
- CSS
- OpenSSH客户端漏洞:CVE-2016-0777和CVE-2016-0778
- 利用WCF实现上传下载文件服务
- Android APP
- TP 学习之 session 方法的学习
- UISegmentedControl之简单应用
- iOS开发系列--音频播放、录音、视频播放、拍照、视频录制
- Linux系统中的信号量(semphore)与互斥体(mutex)
- spring---定时任务(quartz定时器)
- Java集合---LinkedList源码解析
- 深入浅出设计模式(九):12.装饰模式(Decorator) 13.桥模式(Bridge)14.策略模式(Strategy)
- 通过iscsi配置在aix上挂载存储设备
- 扩展系统功能——装饰模式(三):图形界面构件库的解决方案