在PHP中使用$_SESSION来操作session,而ThinkPHP提供了session的封装函数session()。单单这一个函数就实现了session的增删改查的功能。下面我们分别来看其应用与实现。
该session()函数的定义是在Common/functions.php中定义。
session配置
session($name='',$value='')函数有两个参数,$name为数组的时候是对session进行设置。使用如下:
1
2
3
4
5
6
|
$name = array ( ‘name '=>' name', ‘path '=>' /tmp/', ‘expire'=>0 ); session( $name ); |
这些是在开启session之前进行设置的。在ThinkPHP中定义该函数的时候是先判断$name是否为数组,如果为数组的话就说明是在对session进行设置,然后进入相应的代码执行设置。
其实现代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
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存储方式的代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
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
1
2
|
// 启动session if (C( 'SESSION_AUTO_START' )) session_start(); |
如果想关闭session自启动,对选项SESSION_AUTO_START设置如下:
SESSION_AUTO_START => false
如果关闭了系统自启动,可以在项目的公共文件或者在控制器中通过手动调用session_start()来开启session。或者使用函数session(),其开启方法如下:
session(‘[start]');
在ThinkPHP中其实现代码如下:
1
2
3
4
5
6
7
8
9
10
11
|
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赋值的实现代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
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中实现代码如下:
1
2
3
4
|
if ( '' === $name ){ // 获取全部的session return $prefix ? $_SESSION [ $prefix ] : $_SESSION ; } |
再就是取出单个值
1
2
3
|
$value1 = session(‘name'); //或者 $value2 = session(‘name1.name2'); |
其实现代码如下:
1
2
3
4
5
6
|
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
其实现代码如下:
1
2
3
4
5
6
7
|
if ( is_null ( $name )){ // 清空session if ( $prefix ) { unset( $_SESSION [ $prefix ]); } else { $_SESSION = array (); } } |
清空session只是将session对应的文件或者表中的数据清除,但是文件还是会存在的。
销毁session
session(‘[destroy]');
其ThinkPHP中的实现代码如下:
1
2
3
4
5
|
if ( '[destroy]' == $name ){ // 销毁session $_SESSION = array (); session_unset(); session_destroy(); } |
销毁session和清空session不同的是销毁session会将文件一并销毁。
最后就是删除单个session值。使用方式如下
session(‘name',null);
删除单个session值,将第二个参数$value的值设为null即可删除。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
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是否已经设置
其代码实现也是利用了原生的检查的方式
1
2
3
4
5
6
7
|
$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过程中起到一些帮助作用。