将数据发送到数据库的最大执行时间超过30秒

时间:2015-03-13 11:18:31

标签: php ajax json

我使用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(); 
            }
        }
    }
 }

}

1 个答案:

答案 0 :(得分:0)

您只应拨打prepare一次。真的,这就是它的重点。仅绑定参数并在循环内执行。我怀疑它会加快速度,但可能还不够。

我认为处理此问题的最佳方法是批量发送JSON。请记住,您的服务器可能会在某些时候遇到重负荷,因此批次应该相当小。页面上的进度指示器可能适合此处。

另一种选择可能是构建单个SQL查询,例如(?,?,?,?),(?,?,?,?),(?,?,?,?)。这将最大限度地缩短脚本与数据库服务器进行通信的时间。

另一种选择是禁用最长执行时间。我当然不会推荐这个,但它仍然是一个选择。