多个选项卡,多个while


Multiple tabs, Multiple while

我正在运行多个带有while循环的PHP脚本。这是在插入和读取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个选项卡时,它只是不断加载。。。所以要打开12个选项卡,我需要有2个浏览器,每个浏览器应该有6个选项卡打开。。。任何帮助都将不胜感激

Dagon解决方案是最好的,但如果您需要用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 pthreads(12个CPU x 20个内核),达到了服务器的极限,具有1024个异步连接和3X 12Go RAID X4 SSD 1to。所以我想它也应该对你有用。。。。