2011-05-23 26 views
5
$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));   
    } 
} 

Al ejecutar esta secuencia de comandos, se realizó muy rápidamente (se devolvió al navegador), pero aún se estaban ejecutando consultas después de que el navegador dijo que se había hecho. ¿Por qué es esto?php mysqli ¿multi consulta asíncrona?

+0

qué * it * seguía ejecutándose * qué *, y ¿cómo lo sabes? –

+0

Sí, me gustaría saberlo también ... Las consultas no deberían ejecutarse de manera asíncrona. Incluso múltiples consultas (?) Porque también pueden tener resultados. – Rudie

+0

@Dagon Tal vez hizo una LISTA DE PROCESOS 'SHOW' ... @Chris' top | grep mysql' no sería preciso, porque los demonios y procesos de mysql siempre se están ejecutando. – Rudie

Respuesta

14

mysqli_query admite consultas asincrónicas. Consulte changelog en mysqli_query. mysqli_multi_query no menciona la sincronización en la página del manual específicamente. Lo único que mysqli_multi_query hace es decirle a MySQL que ejecute un conjunto masivo de consultas. Depende de PHP esperar los resultados.

Como su código es válido, envía un conjunto masivo de instrucciones SQL a MySQL y no espera ningún resultado. La única vez que su mysqli_multi_query será die es cuando falla la primera instrucción. Entonces, esa función devuelve verdadero inmediatamente después de la primera declaración y pasa a la siguiente línea. Es por eso que las consultas se están ejecutando después de que PHP finalizó. MySQL todavía está funcionando. PHP ha avanzado.

Lo mejor es que recorra los resultados de cada instrucción antes de continuar con su código. Lo siguiente será die si una consulta falla en cualquier parte de su lote.

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

Gran respuesta brady.vitrano. ¡Gracias por esto! –

+2

No necesita almacenar/liberar el resultado. Un ciclo while vacío es suficiente 'while (mysqli_next_result ($ db_link)) {}'. Consulte la documentación: [next_result] (http://php.net/manual/en/mysqli-stmt.next-result.php), [store_result] (http://php.net/manual/en/mysqli-stmt .store-result.php) –