我正在运行多个具有 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/