我正在运行多个带有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。所以我想它也应该对你有用。。。。