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