php mysqli多查询异步?

Chr*_*nch 5 php mysqli

$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));        
    }   
}
Run Code Online (Sandbox Code Playgroud)

运行此脚本时,它很快完成(返回浏览器),但在浏览器完成后仍然运行查询.为什么是这样?

bra*_*ano 14

mysqli_query支持异步查询.请参阅changelog mysqli_query.mysqli_multi_query没有特别提到手册页上的异步.唯一mysqli_multi_query能告诉MySQL执行大量查询.由PHP来等待结果.

正如您的代码所代表的那样,您向MySQL发送大量SQL语句而不是等待任何结果.只有在第一个陈述失败时你的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));
}
Run Code Online (Sandbox Code Playgroud)

  • 您实际上不需要存储/释放结果.一个空的while循环就足够了(while(mysqli_next_result($ db_link)){}`.请参阅文档:[next_result](http://php.net/manual/en/mysqli-stmt.next-result.php),[store_result](http://php.net/manual/en/mysqli-stmt .store-result.php) (2认同)