ThinkPHP中session函数详解

2018-09-26 20:05

阅读:363

  在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){ // 其它模式可能不支持_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(‘,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过程中起到一些帮助作用。


评论


亲,登录后才可以留言!