php mysqli несколько запросов асинхронный? - PullRequest
5 голосов
/ 24 мая 2011
$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));        
    }   
}

При запуске этого скрипта это было сделано очень быстро (возвращено в браузер), но все еще выполнялись запросы после того, как браузер сказал, что это было сделано. Почему это?

1 Ответ

14 голосов
/ 11 июля 2011

mysqli_query поддерживает асинхронные запросы.Смотрите список изменений на mysqli_query. mysqli_multi_query специально не упоминает асинхронность на странице руководства.Единственное, что делает mysqli_multi_query, это говорит MySQL выполнить большой набор запросов.PHP должен ждать результатов.

Поскольку ваш код стоит, вы отправляете большой набор SQL-операторов в MySQL и не ожидаете результатов.Только когда ваш 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));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...