侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

ThinkPHP中session函数详解

ThinkPHP  /  管理员 发布于 8年前   241

在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

// 启动sessionif(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过程中起到一些帮助作用。

您可能感兴趣的文章:

  • thinkPHP多域名情况下使用memcache方式共享session数据的实现方法
  • thinkphp3.x中session方法的用法分析
  • ThinkPHP自定义Redis处理SESSION的实现方法
  • thinkphp中session和cookie无效的解决方法
  • ThinkPHP中Session用法详解
  • thinkphp在模型中自动完成session赋值示例代码
  • 如何让thinkphp在模型中自动完成session赋值小教程
  • ThinkPHP实现将SESSION存入MYSQL的方法
  • ThinkPHP关于session的操作方法汇总
  • ThinkPHP框架实现session跨域问题的解决方法
  • ThinkPHP的模版中调用session数据的方法
  • ThinkPHP的cookie和session冲突造成Cookie不能使用的解决方法
  • thinkPHP中session()方法用法详解


  • 上一条:
    thinkphp自带验证码全面解析
    下一条:
    thinkPHP的表达式查询用法详解
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • thinkphp + mongodb项目中数据加载慢问题分析及解决(0个评论)
    • thinkphp6框架中封装redis操作类(0个评论)
    • thinkphp6框架中实现定时任务功能流程步骤(0个评论)
    • Thinkphp5.1框架中实现Session+Redis会话共享流程步骤(0个评论)
    • TP5框架版本5.0.10安全漏洞根据官方补丁修复,也是本站安全漏洞修复(0个评论)
    • 近期文章
    • 智能合约Solidity学习CryptoZombie第三课:组建僵尸军队(高级Solidity理论)(0个评论)
    • 智能合约Solidity学习CryptoZombie第二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2017-07
    • 2017-08
    • 2017-09
    • 2017-10
    • 2017-12
    • 2018-01
    • 2018-02
    • 2020-03
    • 2021-07
    • 2021-12
    • 2022-05
    • 2022-06
    • 2022-09
    • 2023-01
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客