这篇文章主要为大家详细介绍了ThinkPHP中session函数,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

在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过程中起到一些帮助作用。

最新资讯
比特币迭创新高新镜像 华尔街机构竞夺定价权

比特币迭创新高新镜像

随着比特币持续飙涨,欧美金融监管部门对数字加密货币的
苹果发了个红包 收到的却说:没有诚意!

苹果发了个红包 收到

应用市场的垄断时代正在过去,以后用户想要玩一款游戏,可
嫦娥五号探测器实施动力下降并成功着陆 将开展月面采样工作

嫦娥五号探测器实施动

嫦娥五号探测器动力下降过程降落相机拍摄的图像记者从
雷军宣布:小米11手机将首批搭载骁龙888

雷军宣布:小米11手机将

小米已经预告了下一款旗舰手机小米11 手机将搭载骁龙
realme宣布新旗舰手机Race 首批搭载骁龙888 5G移动平台

realme宣布新旗舰手机

realme CEO李炳忠为高通站台,宣布realme将推出搭载骁龙
拼多多上线“买买相册” 与微信小商店抢市场?

拼多多上线“买买相册

买买相册在综合体验上,更像是微信小商店。
最新文章
PHP数据源架构模式之表入口模式实例分析

PHP数据源架构模式之

这篇文章主要介绍了PHP数据源架构模式之表入口模式,结
php面向对象基础详解【星际争霸游戏案例】

php面向对象基础详解

这篇文章主要介绍了php面向对象基础,结合星际争霸游戏
php设计模式之抽象工厂模式分析【星际争霸游戏案例】

php设计模式之抽象工

这篇文章主要介绍了php设计模式之抽象工厂模式,结合星
php设计模式之建造器模式分析【星际争霸游戏案例】

php设计模式之建造器

这篇文章主要介绍了php设计模式之建造器模式,结合星际
php的RSA加密解密算法原理与用法分析

php的RSA加密解密算法

这篇文章主要介绍了php的RSA加密解密算法原理与用法,
laravel框架模型和数据库基础操作实例详解

laravel框架模型和数

这篇文章主要介绍了laravel框架模型和数据库基础操作,