mysqli_multi_query 是异步的吗?
$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));
}
}
当运行这个脚本时,它完成得非常快(返回浏览器),但在浏览器说它完成后它仍在运行查询.这是为什么?
When running this script it was done very quickly (returned to browser), but it was still running queries after the browser said it was done. Why is this?
推荐答案
mysqli_query 支持异步查询.请参阅 mysqli_query
上的变更日志.mysqli_multi_query 在手册页上没有特别提到异步.mysqli_multi_query
唯一要做的就是告诉 MySQL 执行一组查询.等待结果由 PHP 决定.
mysqli_query supports async queries. See changelog on mysqli_query
. mysqli_multi_query does not mention async on the manual page specifically. Only thing mysqli_multi_query
does is tell MySQL to execute a bulk set of queries. It's up to PHP to wait for the results.
就您的代码而言,您向 MySQL 发送大量 SQL 语句而不等待任何结果.只有当第一条语句失败时,您的 mysqli_multi_query
才会消亡
.因此,该函数在第一条语句之后立即返回 true 并移动到下一行.这就是在 PHP 完成后执行查询的原因.MySQL 仍在工作.PHP 已经向前发展.
As your code stands, your sending a bulk set of SQL statements to MySQL and not waiting for any results. Only time your mysqli_multi_query
will ever die
is when the first statement fails. So, that function returns true immediately after the first statement and moves on to the next line. That's why the queries are executing after the PHP is finished. MySQL is still working. PHP has moved on.
在继续执行代码之前,最好循环查看每个语句的结果.如果查询在批处理中的任何地方失败,以下内容将死亡
.
It's best that you loop through the results of each statement before moving on with your code. The following will die
if a query fails anywhere in your batch.
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));
}
相关文章