PHP的mysqli多查询异步?PHP的mysqli多查询异步?(php mysqli multi

2019-05-12 03:57发布

$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));        
    }   
}

当运行此脚本这是非常迅速完成(返回到浏览器),但它仍在运行的查询浏览器之后说,这是完成。 为什么是这样?

Answer 1:

mysqli_query支持异步查询。 查看更新日志mysqli_query 。 mysqli_multi_query没有提及手册页上的异步明确。 唯一mysqli_multi_query确实是让MySQL执行批量组查询。 它是由PHP等待结果。

当你的代码代表,您发送批量组SQL语句到MySQL的,而不是等待任何结果。 只有你的时间mysqli_multi_query永远不会die的,当第一语句失败。 因此,该函数的第一个语句后立即返回true,并移到下一行。 这就是为什么PHP完成后查询被执行。 MySQL是仍在工作。 PHP已经转移。

这是最好的,你遍历每个语句的结果与你的代码在移动之前。 下面将die ,如果查询在批处理的任何地方失败。

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));
}


文章来源: php mysqli multi query asynchronous?
标签: php mysqli