技术饭

tp5简单的数据库导入还原:MYSQL_ATTR_USE_BUFFERED_QUERY

copylian    0 评论    7726 浏览    2017.03.11

tp5简单的数据库导入还原:MYSQL_ATTR_USE_BUFFERED_QUERY,这几天在用tp5开发数据库的备份与还原的时候,碰到了一个数据库问题,就是tp5的数据库execute()方法无法执行sql文件,网上有些解释是说要设置:['MYSQL_ATTR_USE_BUFFERED_QUERY'=>true]即可,但是我经过测试还是不行,本人现在用的tp5版本是5.0.7,那么也只能采用其他的方式了。

public function import($content)
   {
       //原生pdo方式可以导入,但是效率与数组遍历的方式差不多
       try{
           $opts = [];
           $dns = config('database.type') . ':host=' . config('database.hostname') . ';port=' . config('database.hostport') . ';dbname=' . config('database.database') . ';charset=' . config('database.charset');
           $pdo = new \PDO($dns, config('database.username'), config('database.password'), $opts);
           $pdoP = $pdo->prepare($content);
           $pdoP->execute ();
           return true;
       } catch (\PDOException $e){
           return $e->getMessage();
       }

       //使用数组遍历导入,但是效率低下,如果数据量大的话无法使用,而且不会执行use databasename操作,只能操作当前数据库
      $db_config = config('database');
       $db_config['params'] = ['MYSQL_ATTR_USE_BUFFERED_QUERY' => true];
       $db = Db::connect($db_config, 'database');
       if(!empty($content) && is_array($content)) {
           foreach ($content as $key => $value) {
               $true[$key] = $db->execute($value);
           }
       }
       return true;

       //直接使用mysqli原生导入,效率快,但是只针对mysql数据库,适合数据量大的
       $mysqli = mysqli_connect(config('database.hostname'), config('database.username'), config('database.password'), config('database.database'), config('database.hostport'));
       $mysqli->set_charset(config('database.charset'));
       $mysqli->multi_query($content);
       $mysqli->close();
       return true;
}

直接使用mysqli原生的效率最高,由于pdo一直要prepare,然后一条一条执行数据,所以我测试的时候时间高达8s,而使用mysqli的话1s不到。

飓风呀
感谢你的支持,我会继续努力!
扫码打赏,感谢您的支持!
tp5 数据库 导入 还原 

文明上网理性发言!

  • 还没有评论,沙发等你来抢