我使用AJAX将数据从JS发送到PHP:
$.ajax({
type: "POST",
url: 'protected_page.php',
data: JSON.stringify(distances),
contentType: "application/json"
});
数据"距离"结构化 - {id1:Array(95),id2:Array(95)...}。它有95个ID,每个id有95个整数值表示距离(基本上是95x95矩阵)。
需要将数据插入到我的表u_id | i_id1 | i_id2 | distance
中。下面是执行该操作的PHP方法,但它超过了30秒的最大执行时间,并且~10 000中只有约700行到达数据库。我应该更改数据库的结构还是以某种方式使其更优化?
function postDistances2($mysqli){
if ( getenv("REQUEST_METHOD") !== "POST" ) return;
if ( $distance = json_decode(file_get_contents("php://input"),true) ) {
$keys = [];
$user_id = $_SESSION['user_id'];
foreach ($distance as $key => $value) {
array_push($keys,$key);
}
foreach($distance as $key=>$value){
for($i=0;$i<sizeof($value);$i++){
if ($insert_stmt = $mysqli->prepare("INSERT INTO image_distances (u_id, i1_id, i2_id, distance) VALUES (?, ?, ?, ?)")) {
$insert_stmt->bind_param('iiid', $user_id, $key, $keys[$i], $value[$i]);
// Execute the prepared query.
$insert_stmt->execute();
}
}
}
}
}
答案 0 :(得分:0)
您只应拨打prepare
一次。真的,这就是它的重点。仅绑定参数并在循环内执行。我怀疑它会加快速度,但可能还不够。
我认为处理此问题的最佳方法是批量发送JSON。请记住,您的服务器可能会在某些时候遇到重负荷,因此批次应该相当小。页面上的进度指示器可能适合此处。
另一种选择可能是构建单个SQL查询,例如(?,?,?,?),(?,?,?,?),(?,?,?,?)。这将最大限度地缩短脚本与数据库服务器进行通信的时间。
另一种选择是禁用最长执行时间。我当然不会推荐这个,但它仍然是一个选择。