php - 多个选项卡,多个 while

标签 php mysql multithreading session

我正在运行多个具有 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 个 params ,正如您所拥有的(非常非常少),插入 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 的服务器的限制。所以我想它也应该适合你......

关于php - 多个选项卡,多个 while,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36972425/

相关文章:

php - 需要动态添加复选框

php - python的parse_str?

PHP 动态创建嵌套元素

MySQL 查询速度慢,发送/检查的行数等于 0

mysql - mysql中如何组织Json存储多对多关系

c++ - 在 Qt 线程之间发送大量数据

.net - 线程安全的一次计算最佳实践

php - 使用默认样式值编辑段落标签

mysql - 在 SQL 中不使用聚合函数的最高/最低值

c# - 手动使 C# 线程超时