使用ThinkPHP的同志应该都知道,在ThinkPHP中,可以使用数据库来处理SESSION。具体的实现过程如下:
ThinkPHP自定义SESSION驱动之数据库存储
在ThinkPHP中,SESSION相关的数据库驱动已经给了,如果你下载的是ThinkPHP完整包的话,你应该在ThinkPHP目录下看到Extend目录,在此目录下,你应该会看到Driver/Session/SessionDb.class.php文件。这个就是ThinkPHP中数据库处理SESSION的驱动。
要在ThinkPHP中启用数据库处理SESSION,你应该在配置文件中写入如下配置:
//自定义SESSION处理
'SESSION_TYPE' => 'Db',
当然,你必须写入数据库的相关配置。
启用数据库存储SESSION后,就应该创建SESSION存储的表,创建的SQL语句在SessionDb.class.php文件的注释中,你只需复制后,稍作修整,执行一下就可以了,SQL语句如下(请自行更改表前缀):
代码如下 | 复制代码 |
CREATE TABLE ly_session ( session_id varchar(255) NOT NULL, session_expire int(11) NOT NULL, session_data blob, UNIQUE KEY `session_id` (`session_id`) ); |
定义SESSION的数据库驱动也就如此简单。
ThinkPHP自定义SESSION驱动之Redis
在书写Redis驱动之前,我们有必要大概的了解一下,自定义数据库驱动是如果实现的。
ThinkPHP中自定义SESSION处理的实现原理
打开ThinkPHP目录下的Common/function.php文件,查找session函数。你将看到如下代码:
代码如下 | 复制代码 |
/** * session管理函数 * @param string|array $name session名称 如果为数组则表示进行session设置 * @param mixed $value session值 * @return mixed */ function session($name,$value='') { $prefix = C('SESSION_PREFIX'); if(is_array($name)) { // session初始化 在session_start 之前调用 /** 些处省略2000字 **/ if(C('SESSION_TYPE')) { // 读取session驱动 $class = 'Session'. ucwords(strtolower(C('SESSION_TYPE'))); // 检查驱动类 if(require_cache(EXTEND_PATH.'Driver/Session/'.$class.'.class.php')) { $hander = new $class(); $hander->execute(); }else { // 类没有定义 throw_exception(L('_CLASS_NOT_EXIST_').': ' . $class); } } // 启动session if(C('SESSION_AUTO_START')) session_start(); }elseif('' === $value){ }else{ } }elseif(is_null($value)){ // 删除session }else{ // 设置session } } |
从第13行代码开始看起:如果定义了"SESSION_TYPE"配置项(假设配置成了"Redis")的话,就会首先把这个配置项转化成小写,再让首字母转成大写后,再与Session连接,接着是载入ThinkPHP目录下的Extend/Driver/Session/SessionRedis.class.php文件;载入成功之后,便是实例化,然后调用execute方法。
首页 1 2 3 末页