首页 理论教育封装的Session功能

封装的Session功能

【摘要】:虽然如此,但在实际应用开发中通常是不能满足要求的,ThinkPHP一共内置了两种Session封装操作,分别为Session函数及Session扩展类库。Session声明之后,可以在同域下使用,如以下代码所示。根据这些方法声明,开发人员只需要在对应的类中实现这6个成员方法,即可实现高级的Session功能定制。存放到数据表中的Session数据如图9-11所示。Session类只是对PHP原有的Session操作机制进行了封装,让其更加适合MVC开发。

网站开发都离不开临时会话(Session)功能。这些数据是临时性的,但也是非常重要的,例如记录登录用户数据、用户爱好,统计网站数据等都离不开Session。在PHP开发中使用Session是非常简单的,开发人员只需要使用session_start()函数开启即可。虽然如此,但在实际应用开发中通常是不能满足要求的,ThinkPHP一共内置了两种Session封装操作,分别为Session函数及Session扩展类库。这两种封装操作都是高效、灵活的。下面首先介绍Session函数。

1.Session函数

Session函数是ThinkPHP 3.x提供的一个功能完善的Session管理函数,它封装了所有Session常规操作,例如session_start初始化、session_id增、删、改、查等。Session函数还提供了Session Hander驱动扩展功能,开发人员可以轻易地利用该驱动扩展,编写高效的Session储存机制(例如存放到内存数据库、Memcache、NoSQL等)。Session函数格式如下所示。

session($name,$value='')

其中参数name是一个比较特殊的变量,一般情况下用于表示Session存放名称(即key);value表示key对应的值,支持中文。Session函数是系统内置的核心函数,使用时不需要额外引入,一个最简单的Session声明如以下代码所示。

978-7-111-42852-7-Part02-455.jpg

Session声明之后,可以在同域下使用,如以下代码所示。

978-7-111-42852-7-Part02-456.jpg

可以使用dump($_SESSION)函数输出当前域下的所有Session。参数name是一个特殊的变量,之所以特殊是因为该变量是多变的,当变量值为字符串时,将作为Session存放key;当值为关联数组时,将作为Session初始化的环境配置。name数组的配置信息如表9-8所示。

表9-8 参数name数组值配置选项

978-7-111-42852-7-Part02-457.jpg

事实上,在实际应用开发中极少使用参数name来初始化Session环境,因为该参数只针对当前Session声明生效,如果在其他地方继续声明Session,所有配置将不起作用,所以更通用的办法是在配置文件中配置,如以下代码所示。

978-7-111-42852-7-Part02-458.jpg

配置项SESSION_OPTIONS定义的值即为参数name的值。初始化完成后,就可以实现对Session的增、删、改、查了,如表9-9所示。

表9-9 Session常规操作

978-7-111-42852-7-Part02-459.jpg

前面提到过,Session函数支持hander驱动扩展,接下来将首先介绍hander驱动机制,然后结合示例代码介绍驱动控制的实战应用。

PHP内置的Session处理机制都是由session_set_save_handler函数来完成增、删、改、查的,PHP允许开发人员重载该函数,这就意味着只要掌握session_set_save_handler函数的使用,就可以将Session的存放环境改变为PHP所支持的环境,例如大型数据库、Hadoop、NoSQL等,这样不仅带来性能的提升,还能实现Session跨网站应用,防止CC攻击等。session_set_save_handler函数参数表现形式如下所示。

978-7-111-42852-7-Part02-460.jpg

每个参数由一个关联数组组成。数组中的“__CLASS_”表示操作类,对应的值即为Session操作标识,6个参数表示6个成员方法,分别为open(初始化Session)、close(删除Session)、read(获取Session)、write(Session写入)、destroy(全部销毁Session)、gc(垃圾回收)。根据这些方法声明,开发人员只需要在对应的类中实现这6个成员方法,即可实现高级的Session功能定制。

ThinkPHP内置的Session驱动扩展也是基于session_set_save_handler接口函数的。驱动类库默认存放于ThinkPHP/Extend/Driver/Session目录;类库命名规则为“Session+类库名”(类库名必须首字母大写),该名称即为SESSION_TYPE配置项中指定的名称,例如SessionDb。

接下来将以系统内置的SessionDb驱动扩展为例,详细介绍Session数据转存MySQL数据库的过程。要开启Session驱动扩展,首先需要在配置文件中配置相应选项,如以下代码所示。

978-7-111-42852-7-Part02-461.jpg

978-7-111-42852-7-Part02-462.jpg

SESSION_TABLE指定的是Session存放表,SQL代码如下所示。(www.chuimin.cn)

978-7-111-42852-7-Part02-463.jpg

当然,读者也可以使用其他数据表作为Session存放表,只需要确保结构如图9-10所示即可。

978-7-111-42852-7-Part02-464.jpg

图9-10 Session数据存放表结构

通过上述步骤,现在再使用Session函数操作Session时,将全部转存到数据表,例如增加一条Session数据,如以下代码所示。

978-7-111-42852-7-Part02-465.jpg

存放到数据表中的Session数据如图9-11所示。

978-7-111-42852-7-Part02-466.jpg

2.Session类

系统提供了一个Session扩展类,该类在ThinkPHP 2.x中是默认的Session处理机制。Session类只是对PHP原有的Session操作机制进行了封装,让其更加适合MVC开发。在ThinkPHP 3.x中使用时,需要额外手动引入该类。下面将结合示例代码,演示Sesson类的使用。

(1)增加Session

978-7-111-42852-7-Part02-467.jpg

(2)删除Session

978-7-111-42852-7-Part02-468.jpg

图9-11 Session数据存放表

(3)修改Session

978-7-111-42852-7-Part02-469.jpg

(4)获取Session

978-7-111-42852-7-Part02-470.jpg

(5)判断Session是否过期

978-7-111-42852-7-Part02-471.jpg

(6)删除所有Session

978-7-111-42852-7-Part02-472.jpg