2016-05-01 77 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个异步连接的限制。所以我想它应该也适合你......