在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){// 获取全部的sessionreturn $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对应的文件或者表中的数据清除,但是文件还是会存在的。
销毁sessionsession(‘[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)){ // 删除sessionif(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过程中起到一些帮助作用。