【问题标题】:Is mysqli_multi_query asynchronous?mysqli_multi_query 是异步的吗?
【发布时间】:2011-05-23 21:00:08
【问题描述】:
$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));        
    }   
}

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

【问题讨论】:

  • 什么it仍在运行what,你怎么知道?
  • 是的,我也想知道...查询不应该执行异步。甚至是多个查询 (?),因为它们也可以有结果。
  • @Dagon 也许他做了一个SHOW PROCESSLIST...@Chris top | grep mysql 不会准确,因为mysql 守护进程和进程一直在运行。
  • 也许,也许不是,这就是我问的原因:-)
  • 我只是在各种 mysql 数据库上执行显示表,它们一直在增长(因为我的脚本创建表并填充数据)。脚本执行完成后,需要 2 分钟时间才能将数据填充到数据库中。

标签: php mysqli


【解决方案1】:

mysqli_query 支持异步查询。请参阅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));
}

【讨论】:

  • 您实际上不需要存储/释放结果。一个空的 while 循环就足够了 while(mysqli_next_result($db_link)) {}。请参阅文档:next_resultstore_result
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-27
  • 2017-02-19
  • 2015-08-03
  • 2019-01-05
  • 2021-03-30
  • 2019-01-13
相关资源
最近更新 更多