技术饭
tp5简单的数据库导入还原:MYSQL_ATTR_USE_BUFFERED_QUERY
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不到。
文明上网理性发言!