2016-05-01 110 views
0

我正在運行多個PHP腳本,它們有一個while循環。這同時插入並從MySQL數據庫讀取。多個標籤,多個

這是一個漫長的過程,所以它需要長達2個小時。 我需要做的是在同一瀏覽器中的多個選項卡中打開腳本。 當我這樣做,並在多個選項卡中打開腳本時,我無法打開超過6個選項卡。任何超過6的選項卡只是保持加載並不顯示任何內容。 當去其他瀏覽器它的工作原理,但是當我到達6個選項卡它也是如此。

代碼:

<?php 
    ini_set('memory_limit', -1); 
    ob_implicit_flush(TRUE); 
    set_time_limit(0); 

    $sqlselect = "SELECT * FROM old_Users Where age < 18"; 
    $content2 = mysqli_query($conn,$sqlselect); 

    While($row = mysqli_fetch_assoc($content2)){ 
    $Sql = "INSERT INTO New_Table_Users('first_name','last_name','ID') VALUES('".$row["firstname"]."','".$row["lastname"]."','".$row["idd"]."'); 
    mysqli_query($conn,$sql); 
    } 
?> 

的問題不是關於RAM,CPU,因爲每當我打開一個新的瀏覽器,它工作正常,但是當我嘗試打開7'th標籤它只是不斷加載.. 。 所以要打開12個標籤我需要有2個每個瀏覽器應該有6個選項卡中打開... 任何幫助將非常感激

+0

2小時?你爲什麼不把它作爲後臺進程運行?爲什麼你使用瀏覽器呢?我猜6個選項卡是6線程?請不要這樣做 –

+0

如果需要很長時間才能運行,那麼將其作爲後臺任務運行,而不是在網絡瀏覽器中運行 –

+0

也可以在一個查詢中完成上述操作,無需循環。 –

回答

0

袞的解決方案是最好的,但如果你需要在PHP處理的東西,仍然能夠快速插入。

使用PDO(對不起,不喜歡mysqli)雖然比你呼吸做得更快。這將以很少的查詢(批次)插入所有數據。它甚至可能只有一個插入。

警告:這種技術很快但知道你的極限。它需要RAM或更少的同時插入。

根據所插入內容的大小,根據RAM容量限制同時插入的數量。用3個參數,就像你(非常少)一樣,插入10000個合理的聲音。嘗試各種方法來查看數據庫和服務器如何處理它。

ini_set('memory_limit', -1); 
set_time_limit(0); 

$table = 'New_Table_Users'; // inserted table name 
$nb_max_insert = 10000; // number of maximum simultaneous insert 
$age=18;// param age 

$stmt = $conn->prepare("SELECT * FROM old_Users Where age < ?"); 
$stmt->bindParam(1, $age, PDO::PARAM_INT); // prepare binder 

try { 
    $stmt->execute(); 
    $result = $stmt->fetchAll(PDO::FETCH_ASSOC); 
} catch (PDOException $e) { 
    var_dump('error main'); 
} 

if (count($result) !== 0) { 

    $data = array();// extract needed data , yes you are using * in you query. mheeeee 
    foreach ($result as $key => $el) { 
     $row['first_name'] = $el['first_name']; 
     $row['last_name'] = $el['last_name']; 
     $row['ID'] = $el['ID']; 
     array_push($data, $row); 
    } 

    $batches = array_chunk($data, $nb_max_insert);// split data into batches 

    foreach ($batches as $key => $batch) { 

     foreach ($batch as $d) { 
      $question_marks[] = '(' . query_placeholders('?', sizeof($d)) . ')'; // create question_marks sequence for PDO 
      $insert_values = array_merge($insert_values, array_values($d));// what to insert 
     } 
     $sql = "INSERT INTO $table (" . implode(",", array_keys($row)) . ") VALUES " . implode(',', $question_marks); //concat the query 
     $stmt = $conn->prepare($sql); 
     try { 
      $stmt->execute($insert_values); 
     } catch (PDOException $e) { 
      var_dump('error batch'); 
     } 
    } 
} 

注:我用它來插入幾百萬行成巨大的表,跨越PHP7並行線程(12個CPU×20個內核)到達服務器的用3X 12Go RAID X4 SSD -1至1024個異步連接的限制。所以我想它應該也適合你......