2011-05-23 29 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));   
    } 
} 

Bu komut dosyasını çalıştırırken çok hızlı bir şekilde yapıldı (tarayıcıya döndü), ancak tarayıcı tamamlandığını söyledikten sonra sorgular hala çalışıyordu. Bu neden?php mysqli çoklu sorgu eşzamansız?

+0

what * it * hala çalışıyordu * what *, ve nasıl biliyorsunuz? –

+0

Evet Bunu bilmek isterdim ... Sorgular, eşzamansız yürütülmemelidir. Çok sorgular bile (?) Çünkü sonuçları da olabilir. – Rudie

+0

@Dagon Belki bir "SHOW PROCESSLIST" yaptı ... @Chris 'top | grep mysql'm hassas olmaz, çünkü mysql daemons ve süreçleri her zaman çalışır. – Rudie

cevap

14

mysqli_query, asenkron sorguları destekler. mysqli_query adresindeki değişikliklere bakın. mysqli_multi_query, özellikle manuel sayfada async'den bahsetmez. Tek şey mysqli_multi_query, MySQL'in toplu bir dizi sorgu çalıştırmasını söyler. Sonuçları beklemek PHP'ye kalmış.

Kodunuzda olduğu gibi, toplu bir SQL ifadeleri MySQL'e gönderiyor ve herhangi bir sonuç beklemiyorsunuz. İlk ifadenin ne zaman başarısız olduğudie olacaktır. Yani, bu işlev ilk ifadeden hemen sonra doğru döner ve sonraki satıra geçer. Bu yüzden PHP bittikten sonra sorgular çalışıyor. MySQL hala çalışıyor. PHP devam etti.

Bu, kodunuzla devam etmeden önce her bir ifadenin sonuçlarına bakmanızın en iyisidir. Bir sorgu sizin partinizde herhangi bir yerde başarısız olursa, aşağıdaki die olacaktır.

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

Harika cevap brady.vitrano. Bunun için teşekkürler! –

+2

Aslında sonucu saklamanız/boşaltmanız gerekmez. Boş bir while döngüsü yeterli iken while (mysqli_next_result ($ db_link)) {} '. Dokümana bakınız: [next_result] (http://php.net/manual/en/mysqli-stmt.next-result.php), [store_result] (http://php.net/manual/en/mysqli-stmt Saklamak-result.php) –