让DB_xxx 数据库连接模式也能支持session存数据库
注对应文件:
3.1.x => /ThinkPHP/Extend/Driver/Session/SessionDb.class.php
3.2.x =>/ThinkPHP/Library/Think/Session/Driver/Db.class.php
)
在使用 ThinkPHP 时有些人喜欢用 DB_xxx 模式连接数据库(如:DB_MYli
在这个文件中的第48行中,我们可以看见:
$host = explode(',',C('DB_HOST'));
$port = explode(',',C('DB_PORT'));
$name = explode(',',C('DB_NAME'));
$user = explode(',',C('DB_USER'));
$pwd = explode(',',C('DB_PWD'));
OK,这就很明显了,应该调用这个驱动时,是从非DB_xxx模式下获取数据库连接信息的。然后我们稍微改造一下。把这段代码前后加点东西:$this->sessionDSN=C('SESSION_DSN')?C('SESSION_DSN'):'';
//分布式数据库
if(empty($this->sessionDSN)){
$host = explode(',',C('DB_HOST'));
$port = explode(',',C('DB_PORT'));
$name = explode(',',C('DB_NAME'));
$user = explode(',',C('DB_USER'));
$pwd = explode(',',C('DB_PWD'));
}else{
$this->sessionDSN=C($this->sessionDSN);
$scheme=parse_url($this->sessionDSN);
if(!$scheme){
//抛出错误信息,这句好像没啥用,如果数据库链接失败 TP 就会用系统自带的SESSION方法,只是个习惯。
throw_exception('缺少 SESSION_DSN 配置');
return false;
}
$host = array($scheme['host']);
$port = array($scheme['port']);
$name = array(ltrim($scheme['path'],'/'));
$user = array($scheme['user']);
$pwd = array($scheme['pass']);
}
这里我用了 $this->sessionDSN 所以我们还需要在类头上加句(个人习惯,这个参数只是在这个 open 方法中用到了,可以不用在这里定义,但是要对应改一下上面的代码。【这不会?看书去吧.......】) /**
* session保存的数据库连接
*/
protected $sessionDSN = '';
OK,改造完成。上面代码里写到 sessionDSN 这个东西是从 配置文件中 获取的。那么我们的配置文件就是这样的(其他的不多说了)return array(
'DB_MYLINK' => 'mysql://root:root@localhost:3306/db_test',
'SESSION_OPTIONS'=>array(
'type'=> 'db',
'expire'=>64400,
),
'SESSION_DSN'=>'DB_MYLINK',
)
OK, 你可以测试一下你的session 有没有进入数据库了,本人自己是试过可以的,不行的话,留个言什么的,有空会回一下的。另外说的是这个可以不改的,具体你懂得。