$databases = array();
$path = '/Path/To/Directory';
$main_link = mysqli_connect('localhost', 'USERNAME', 'PASSWORD');
$files = scandir($path);
$ignore_files = array();
foreach($files as $file)
{
if (!in_array($file, $ignore_files))
{
$database = substr($file, 0, strpos($file,'.'));
$databases[] = $database;
mysqli_query($main_link, "DROP DATABASE IF EXISTS $database") or die ("$database 1" . mysqli_error($main_link));
mysqli_query($main_link, "CREATE DATABASE $database") or die ("$database 2" .mysqli_error($main_link));
$db_link = mysqli_connect('localhost', 'USERNAME', 'PASSWORD', $database);
//In here a whole database dump with scheam + data is executed.
mysqli_multi_query($db_link, file_get_contents($path.'/'.$file)) or die ("$database 4" .mysqli_error($db_link));
}
}
运行此脚本时,它很快就完成了(返回浏览器),但在浏览器完成后仍在运行查询。这是为什么?
答案 0 :(得分:14)
mysqli_query支持异步查询。请参阅mysqli_query
上的changelog。 mysqli_multi_query没有特别提到手册页上的异步。唯一的事情是mysqli_multi_query
告诉MySQL执行大量查询。由PHP来等待结果。
正如您的代码所代表的那样,您向MySQL发送大量SQL语句而不是等待任何结果。只有当第一个语句失败时mysqli_multi_query
将die
为die
。因此,该函数在第一个语句之后立即返回true,然后转到下一行。这就是PHP完成后执行查询的原因。 MySQL仍然在工作。 PHP已经开始了。
最好在继续使用代码之前循环遍历每个语句的结果。如果查询在批处理中的任何位置失败,则以下mysqli_multi_query($db_link, file_get_contents($path.'/'.$file)) or die ("$database 4" .mysqli_error($db_link));
do {
if($result = mysqli_store_result($db_link)){
mysqli_free_result($result);
}
} while(mysqli_next_result($db_link));
if(mysqli_error($db_link)) {
die(mysqli_error($db_link));
}
。
{{1}}