Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is mysqli_multi_query asynchronous?

Tags:

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

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?

like image 705
Chris Muench Avatar asked May 23 '11 21:05

Chris Muench


People also ask

How to execute multiple queries in PHP MySQL?

Multiple statements or multi queries must be executed with mysqli::multi_query(). The individual statements of the statement string are separated by semicolon. Then, all result sets returned by the executed statements must be fetched.

What is Multiquery?

Executes one or multiple queries which are concatenated by a semicolon. Queries are sent asynchronously in a single call to the database, but the database processes them sequentially.

What is the Mysqli function to check if there any more results from a multi query?

The mysqli_more_results() function / mysqli::more_results checks if there are any more results from a multi query. Return value: Returns TRUE if one or more result sets are available from a previous call to mysqli_multi_query(), otherwise FALSE.


1 Answers

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.

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));
}
like image 153
brady.vitrano Avatar answered Sep 19 '22 18:09

brady.vitrano