Intereting Posts
Автоматическое обновление DIV через 10 минут Как я могу разместить php-скрипт в сетевом веб-приложении dotnet, размещенном на Azure Как я могу поместить двойные кавычки внутри строки в ответ ajax JSON от php? Joomla: вызов вспомогательной функции изнутри модели? Как загрузить всю почту с вложениями на сервер с помощью PHP IMAP? Печать всех определенных переменных и значений SQL-запрос для сопоставления строки, разделенной запятыми, для строки с разделителями-запятыми? PHP / MySQL: динамический подготовленный оператор с запросом на вставку / обновление Как предотвратить добавление одного и того же продукта в корзину более одного раза в magento Реструктурировать контактную форму php Почему в ячейке используется левая и верхняя набивка с использованием TCPDF в php? Как обновить файл на Google Диске v3 PHP управление кешем браузера Предупреждение «Excel нашел нечитаемый контент» при открытии файлов Excel, сделанных с помощью PHPExcel Codeigniter 3 Удалить проблемы index.php

php mysqli multi query асинхронный?

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