让DB_xxx 数据库连接模式也能支持session存数据库

浏览:1921 最后更新:2015-11-30 08:50 分类:驱动 关键字: session mysql session存mysql

注对应文件:
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_MYlink=>'mysql://root:root@localhost:3306/db_test'),但是在这种连接模式下 TP 中的 SessionDb 是不支持的。好像有人遇到过这样的问题。闲来没事就看看怎么回事,于是乎就让我来说说吧。

在这个文件中的第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 有没有进入数据库了,本人自己是试过可以的,不行的话,留个言什么的,有空会回一下的。

另外说的是这个可以不改的,具体你懂得。
评论( 相关
后面还有条评论,点击查看>>