【问题标题】:Multiple tabs, Multiple while多个选项卡,多个同时
【发布时间】:2016-05-01 21:56:50
【问题描述】:

我正在运行多个具有 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 个标签... 任何帮助将不胜感激

【问题讨论】:

  • 2 小时?为什么不将其作为后台进程运行?你为什么要使用浏览器?我猜这 6 个标签用于 6 个线程?请不要这样做
  • 如果运行需要很长时间,则将其作为后台任务运行,而不是在网络浏览器中运行
  • 以上也可以在一个查询中完成,不需要循环。
  • 我无法将其作为后台进程运行,因为我需要查看输出。这只是脚本的一部分。它缺少回声。
  • INSERT INTO New_Table_Users ('first_name','last_name','ID') SELECT ('first_name','last_name','ID') FROM old_Users Where age &lt; 18

标签: php mysql multithreading session


【解决方案1】:

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。所以我想它也应该对你有用....

【讨论】:

    猜你喜欢
    • 2015-08-04
    • 2017-03-04
    • 1970-01-01
    • 2013-02-22
    • 2011-10-01
    • 2021-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多