ThinkPHP中session函数详解


Posted in PHP onSeptember 14, 2016

在PHP中使用$_SESSION来操作session,而ThinkPHP提供了session的封装函数session()。单单这一个函数就实现了session的增删改查的功能。下面我们分别来看其应用与实现。

该session()函数的定义是在Common/functions.php中定义。

session配置

session($name='',$value='')函数有两个参数,$name为数组的时候是对session进行设置。使用如下:

$name = array(
     ‘name'=>'name',
     ‘path'=>'/tmp/',
     ‘expire'=>0
);
session($name);

这些是在开启session之前进行设置的。在ThinkPHP中定义该函数的时候是先判断$name是否为数组,如果为数组的话就说明是在对session进行设置,然后进入相应的代码执行设置。

其实现代码如下:

if(is_array($name)) { // session初始化 在session_start 之前调用
  if(isset($name['prefix'])) C('SESSION_PREFIX',$name['prefix']);
  if(C('VAR_SESSION_ID') && isset($_REQUEST[C('VAR_SESSION_ID')])){
    session_id($_REQUEST[C('VAR_SESSION_ID')]);
  }elseif(isset($name['id'])) {
    session_id($name['id']);
  }
  if('common' != APP_MODE){ // 其它模式可能不支持
    ini_set('session.auto_start', 0);
  }
  if(isset($name['name']))   session_name($name['name']);
  if(isset($name['path']))   session_save_path($name['path']);
  if(isset($name['domain']))  ini_set('session.cookie_domain', $name['domain']);
  if(isset($name['expire'])) {
    ini_set('session.gc_maxlifetime',  $name['expire']);
    ini_set('session.cookie_lifetime', $name['expire']);
  }
  if(isset($name['use_trans_sid'])) ini_set('session.use_trans_sid',$name['use_trans_sid']?1:0);
  if(isset($name['use_cookies'])) ini_set('session.use_cookies', $name['use_cookies']?1:0);
  if(isset($name['cache_limiter'])) session_cache_limiter($name['cache_limiter']);
  if(isset($name['cache_expire'])) session_cache_expire($name['cache_expire']);
  if(isset($name['type']))  C('SESSION_TYPE',$name['type']);
  ……
}

在ThinkPHP中,对于session的存储系统提供了mysql和memache两种数据库。当然默认情况下是使用文件存储。判断session存储方式的代码如下:

if(C('SESSION_TYPE')) { // 读取session驱动
  $type = C('SESSION_TYPE');
  //系统调用mysql驱动程序
$class = strpos($type,'\\')? $type : 'Think\\Session\\Driver\\'. ucwords(strtolower($type));
$hander =  new $class(); //实例化处理器
//注册处理器
  session_set_save_handler( 
    array(&$hander,"open"),
    array(&$hander,"close"),
    array(&$hander,"read"),
    array(&$hander,"write"),
    array(&$hander,"destroy"),
    array(&$hander,"gc")
  );
}

对于session存储系统的配置是通过配置选项SESSION_TYPE来设置的。

SESSION_TYPE=>'Mysql'  //将session存储在mysql数据库中

设置完成以后如果设置了session自动启动,那系统会自动开启session

// 启动session
if(C('SESSION_AUTO_START')) session_start();

如果想关闭session自启动,对选项SESSION_AUTO_START设置如下:

SESSION_AUTO_START => false

如果关闭了系统自启动,可以在项目的公共文件或者在控制器中通过手动调用session_start()来开启session。或者使用函数session(),其开启方法如下:

session(‘[start]');

在ThinkPHP中其实现代码如下:

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();
}

session赋值

session赋值比较简单,直接使用:

session('name','onmpw');

除此之外对于键值还可以是多层的中间使用‘.'连接。

session(‘name1.name2','onmpw');  //等价于 $_SESSION[‘name1'][‘name2'] = ‘onmpw';

在ThinkPHP中对于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;
     }
}

$prefix是通过选项SESSION_PREFIX来配置的。

session取值

session取值相对来说也是比较简单的。

首先是获取全部的session,使用方法如下

$values = session();

此时得到的是一个数组。在ThinkPHP中实现代码如下:

if(''===$name){
  // 获取全部的session
  return $prefix ? $_SESSION[$prefix] : $_SESSION;
}

再就是取出单个值

$value1 = session(‘name');
//或者
$value2 = session(‘name1.name2');

其实现代码如下:

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;
}

session删除

session的删除分为清空session,销毁session和删除单个session值。

先说清空session。清空session传参给$name的值为null

session(null); //清空session

其实现代码如下:

if(is_null($name)){ // 清空session
   if($prefix) {
    unset($_SESSION[$prefix]);
   }else{
    $_SESSION = array();
   }
}

清空session只是将session对应的文件或者表中的数据清除,但是文件还是会存在的。

销毁session

session(‘[destroy]');

其ThinkPHP中的实现代码如下:

if('[destroy]'==$name){ // 销毁session
   $_SESSION = array();
   session_unset();
   session_destroy();
}

销毁session和清空session不同的是销毁session会将文件一并销毁。

最后就是删除单个session值。使用方式如下

session(‘name',null);

删除单个session值,将第二个参数$value的值设为null即可删除。

if(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]);
    }
  }
}

检查session

最后简单介绍对session的检查。检查是指一个变量是否存在。原生的PHP检查session变量是这样检查的

isset($_SESSION[‘name']);

ThinkPHP封装之后使用session()函数是这样检查

session(‘?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]);
}

以上几乎是对session()函数各个功能的使用介绍,以及ThinkPHP是如何实现的。希望本文的内容对大家在使用ThinkPHP过程中起到一些帮助作用。

PHP 相关文章推荐
无数据库的详细域名查询程序PHP版(3)
Oct 09 PHP
PHP 伪静态隐藏传递参数名的四种方法
Feb 22 PHP
phpmailer发送gmail邮件实例详解
Jun 24 PHP
php页码形式分页函数支持静态化地址及ajax分页
Mar 28 PHP
Yii结合CKEditor实现图片上传功能
Jun 13 PHP
PHP+Memcache实现wordpress访问总数统计(非插件)
Jul 04 PHP
PHP图片处理之使用imagecopyresampled函数实现图片缩放例子
Nov 19 PHP
php目录拷贝实现方法
Jul 10 PHP
详解 PHP加密解密字符串函数附源码下载
Dec 18 PHP
thinkPHP模板算术运算相关函数用法分析
Jul 12 PHP
POST一个JSON格式的数据给Restful服务实例详解
Apr 07 PHP
windows 2008r2+php5.6.28环境搭建详细过程
Jun 18 PHP
PHP大神的十大优良习惯
Sep 14 #PHP
thinkPHP的表达式查询用法详解
Sep 14 #PHP
PHP实现对二维数组某个键排序的方法
Sep 14 #PHP
Laravel+jQuery实现AJAX分页效果
Sep 14 #PHP
php+ajax实现带进度条的上传图片功能【附demo源码下载】
Sep 14 #PHP
PHP自定义函数实现格式化秒的方法
Sep 14 #PHP
PHP经典算法集锦【经典收藏】
Sep 14 #PHP
You might like
php中怎么搜索相关联数组键值及获取之
2013/10/17 PHP
基于Laravel(5.4版本)的基本增删改查操作方法
2019/10/11 PHP
csdn 博客中实现运行代码功能实现
2009/08/29 Javascript
aspx中利用js实现确认删除代码
2010/07/22 Javascript
为jQuery增加join方法的实现代码
2010/11/28 Javascript
关于页面嵌入swf覆盖div层的问题的解决方法
2014/02/11 Javascript
JQuery的Ajax中Post方法传递中文出现乱码的解决方法
2014/10/21 Javascript
JavaScript设置获取和设置属性的方法
2015/03/04 Javascript
JavaScript模拟可展开、拖动与关闭的聊天窗口实例
2015/05/12 Javascript
jQuery插件windowScroll实现单屏滚动特效
2015/07/14 Javascript
基于JavaScript实现动态添加删除表格的行
2016/02/01 Javascript
用 js 的 selection range 操作选择区域内容和图片
2017/04/18 Javascript
基于JavaScript实现图片连播和联级菜单实例代码
2017/07/28 Javascript
详解JS数组Reduce()方法详解及高级技巧
2017/08/18 Javascript
vue-better-scroll 的使用实例代码详解
2018/12/03 Javascript
Vue-cli3项目引入Typescript的实现方法
2019/10/18 Javascript
vue中使用带隐藏文本信息的图片、图片水印的方法
2020/04/24 Javascript
uni-app如何页面传参数的几种方法总结
2020/04/28 Javascript
Python 正则表达式操作指南
2009/05/04 Python
Python Web框架Flask中使用百度云存储BCS实例
2015/02/08 Python
Django应用程序中如何发送电子邮件详解
2017/02/04 Python
深入理解Python3 内置函数大全
2017/11/23 Python
Python爬取数据并写入MySQL数据库的实例
2018/06/21 Python
Python实现截取PDF文件中的几页代码实例
2019/03/11 Python
使用openCV去除文字中乱入的线条实例
2020/06/02 Python
使用CSS实现弹性视频html5案例实践
2012/12/26 HTML / CSS
印尼最大的网上书店:Gramedia.com
2018/09/13 全球购物
软件测试面试题
2015/10/21 面试题
乡镇网格化管理实施方案
2014/03/23 职场文书
2014年“向国旗敬礼”网上签名寄语活动方案
2014/09/27 职场文书
对照检查剖析材料
2014/09/30 职场文书
三年级上册科学教学计划
2015/01/21 职场文书
开会迟到检讨书范文
2015/05/06 职场文书
导游词之山东八仙过海景区
2019/11/11 职场文书
分享很少见很有用的SQL功能CORRESPONDING
2022/08/05 MySQL
uniapp开发打包多端应用完整方法指南
2022/12/24 Javascript