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 接口类与抽象类的实际作用
Nov 26 PHP
PHP函数之error_reporting(E_ALL ^ E_NOTICE)详细说明
Jul 01 PHP
利用PHP扩展vld查看PHP opcode操作步骤
Mar 04 PHP
php配合jquery实现增删操作具体实例
Dec 12 PHP
PHP-Java-Bridge使用笔记
Sep 22 PHP
PHP超牛逼无限极分类生成树方法
May 11 PHP
php简单实现发送带附件的邮件
Jun 10 PHP
JSON用法之将PHP数组转JS数组,JS如何接收PHP数组
Oct 08 PHP
PHP实现HTML页面静态化的方法
Nov 04 PHP
学习php设计模式 php实现享元模式(flyweight)
Dec 07 PHP
PHP使用PDO操作数据库的乱码问题解决方法
Apr 08 PHP
PHP大文件分割上传 PHP分片上传
Aug 28 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扩展函数
2006/10/09 PHP
PHP sprintf()函数用例解析
2011/05/18 PHP
PHP实现的博客欢迎提示功能(很特别哦)
2014/06/05 PHP
Nginx服务器上安装并配置PHPMyAdmin的教程
2015/08/18 PHP
PHP基于SMTP协议实现邮件发送实例代码
2017/04/27 PHP
mouse_on_title.js
2006/08/25 Javascript
javascript数组使用调用方法汇总
2007/12/08 Javascript
文本框根据输入内容自适应高度的代码
2011/10/24 Javascript
javascript无刷新评论实现方法
2015/05/13 Javascript
jQuery基础_入门必看知识点
2016/07/04 Javascript
bootstrap table表格客户端分页实例
2017/08/07 Javascript
微信小程序实现表单校验功能
2020/03/30 Javascript
Vue中的scoped实现原理及穿透方法
2018/05/15 Javascript
优雅的elementUI table单元格可编辑实现方法详解
2018/12/23 Javascript
JS+php后台实现文件上传功能详解
2019/03/02 Javascript
node使用mysql获取数据库数据中文乱码问题的解决
2019/12/02 Javascript
[02:55]2018DOTA2国际邀请赛勇士令状不朽珍藏Ⅲ饰品一览
2018/08/01 DOTA
Python的净值数据接口调用示例分享
2016/03/15 Python
Python基于辗转相除法求解最大公约数的方法示例
2018/04/04 Python
python绘制圆柱体的方法
2018/07/02 Python
python3 字符串知识点学习笔记
2020/02/08 Python
AmazeUI中各种的导航式菜单与解决方法
2020/08/19 HTML / CSS
韩国爱茉莉太平洋化妆品美国站:Amore Pacific US
2016/10/28 全球购物
澳洲女装时尚在线:Blue Bungalow
2018/05/05 全球购物
自我评价范文点评
2013/12/04 职场文书
大学本科毕业生求职信范文
2013/12/18 职场文书
工商管理专业大学生职业生涯规划范文
2014/03/09 职场文书
开学典礼决心书
2014/03/11 职场文书
妇女儿童发展规划实施方案
2014/03/16 职场文书
学习优秀党员杨宗兴先进事迹材料思想汇报
2014/09/14 职场文书
2014年个人总结范文
2015/03/09 职场文书
《童年》读后感(三篇)
2019/08/27 职场文书
Python中使用ipython的详细教程
2021/06/22 Python
golang 实用库gotable的具体使用
2021/07/01 Golang
MYSQL优化之数据表碎片整理详解
2022/04/03 MySQL
利用Apache Common将java对象池化的问题
2022/06/16 Servers