gpt4 book ai didi

php - mysqli_multi_query 是异步的吗?

转载 作者:可可西里 更新时间:2023-11-01 13:39:24 25 4
gpt4 key购买 nike

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

运行此脚本时,它很快就完成了(返回到浏览器),但在浏览器表示完成后它仍在运行查询。这是为什么?

最佳答案

mysqli_query支持异步查询。请参阅关于 mysqli_query 的更改日志。 mysqli_multi_query没有在手册页上具体提到异步。 mysqli_multi_query 唯一做的就是告诉 MySQL 执行一组批量查询。由 PHP 来等待结果。

就您的代码而言,您将大量 SQL 语句发送到 MySQL 而不是等待任何结果。只有当第一个语句失败时,您的 mysqli_multi_query 才会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));
}

关于php - mysqli_multi_query 是异步的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6102968/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com