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));
}
}
При запуске этого скрипта это было сделано очень быстро (возвращено в браузер), но он все еще выполнял запросы после того, как браузер сказал, что это было сделано. Почему это?
1 ответ
mysqli_query поддерживает асинхронные запросы. Смотрите список изменений на mysqli_query
, mysqli_multi_query не упоминает async на странице руководства специально. Единственное, что 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));
}