簡體   English   中英

php mysqli 多查詢異步?

[英]php mysqli multi query asynchronous?

$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。

就您的代碼而言,您向 MySQL 發送大量 SQL 語句而不等待任何結果。 只有當第一個語句失敗時,您的mysqli_multi_query才會die 因此,function 在第一條語句之后立即返回 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));
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM