迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > PHP >

ThinkPHP中session函数详解

作者:迹忆 最近更新:2022/12/11 浏览次数:

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

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

PHP 中的 session ID

发布时间:2023/03/29 浏览次数:125 分类:PHP

本文将教你如何使用 PHP Session id。你将学习如何使用 session_start() 和 session_id() 启动和检查会话 ID

Hibernate Sessions

发布时间:2022/05/08 浏览次数:135 分类:教程更新

Session 用于获取与数据库的物理连接。 Session 对象是轻量级的,设计为在每次需要与数据库交互时实例化。 持久对象通过 Session 对象进行保存和检索。

Thinkphp语言包实现原理与实践

发布时间:2016/10/21 浏览次数:926 分类:PHP

Thinkphp中支持语言包功能,本篇主要介绍框架对底层语言包和应用语言包是如何实现的,以及使用L函数获取内容。

ThinkPHP自动加载机制代码分析

发布时间:2016/09/12 浏览次数:1386 分类:PHP

ThinkPHP其自动加载机制比较完善。对于自动加载机制主要使用的两个函数为__autoload()和spl_autoload_register()。下面简单的做一些介绍。

Thinkphp分布式数据库连接代码分析

发布时间:2016/09/08 浏览次数:408 分类:PHP

我们来分析一下Thinkphp中比较重要的一部分——分布式数据库的连接,对其底层的连接代码做一个分析。帮助大家更好的理解thinkphp对分布式数据库的操作。

SSO单点登录三种情况的实现方式详解

发布时间:2016/05/23 浏览次数:45713 分类:网络

单点登录(SSO——Single Sign On)对于我们来说已经不陌生了。对于大型系统来说使用单点登录可以减少用户很多的麻烦。本文就三种情况,跨域、同域等,的单点登录分别介绍。

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便