2015-03-13 31 views
1
最大執行時間

我從JS發送數據與AJAX到PHP那樣:將數據發送到數據庫超過30秒

$.ajax({ type: "POST", url: 'protected_page.php', data: JSON.stringify(distances), contentType: "application/json" });

數據「距離」的結構 - {ID1:陣列(95) ,ID2:陣列(95)...}。它有95個ID,每個ID有95個整數值表示距離(基本上是一個95x95矩陣)。

需要將數據插入我的表u_id | i_id1 | i_id2 | distance。下面是這樣做的PHP方法,但它超過了30秒的最大執行時間,並且只有約70000行到達數據庫。我應該改變我的數據庫的結構還是可以讓它更優化?

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

你應該只調用prepare一次。真的,這就是它的意義所在。只綁定參數並從循環內執行。我懷疑這會加快速度,但可能還不夠。

我認爲處理這個問題的最好方法是批量發送JSON。請記住,您的服務器可能會在某些時候遇到沉重的負載,因此批次應該相當小。此頁面上的進度指示器可能適用。

另一種選擇可以是構建單個SQL查詢,例如, (?,?,?,?),(?,?,?,?),(?,?,?,?)。這將最大限度地減少腳本與數據庫服務器進行通信的時間。

還有一種選擇是禁用最大執行時間。我當然不會推薦這個,但它仍然是一個選擇。

+0

謝謝,我通過構建一個多值插入語句解決了這個問題,並在10秒內發送了所有數據,仍然不是一個快速的時間,但它完成了這項工作:) – Jackstick 2015-03-13 13:01:55

+0

發送20條插入語句會更高效嗎? 500個值或1個插入語句10000個值? – Jackstick 2015-03-13 13:07:20

+0

我認爲單個查詢會更好,但您最好檢查服務器上的設置。特別是'max_allowed_pa​​cket'。你可以通過運行SHOW VARIABLES LIKE'max_allowed_pa​​cket';'來看到 – rjdown 2015-03-13 13:10:03