[英]Ajax call inside each loop
我發現了很多與此主題相關的帖子。 但是我發現的解決方案並不適合我。 一些專家建議更改代碼結構,但是我不確定該怎么做。
我想要的是:
1)從SQL數據庫獲取電影列表
2)從網站上獲取每部電影的信息
我遇到的問題:發生PHP MAX_TIMEOUT。
我認為的解決方案:分別為每部電影調用異步請求
瓶頸:異步請求過多
您能建議如何實現嗎(如果可能的話,只使用JS,而不是jquery)?
網絡上的一些解決方案:
1)使用ASYNC = FALSE ....我不想使用SYNC req,沒有必要再使用Ajax
2)收集所有數據,然后一次調用Ajax ...好吧,我首先這樣做了..但這是一個長腳本(從Web上獲取電影信息),因此最終導致PHP MAX_TIMEOUT
3)增加PHP MAX_TIMEOUT ...不可行,我不知道要增加多少。
JS
function loadData(mArray){
mArray = [{"movieid":"1","title":"10 Things I Hate About You"},{"movieid":"2","title":"100 Girls"}]; // TO SIMLYFY, I PUT THIS CODE HERE .. NORMALLY I GET THIS ARRAY USING ANOTHER AJAX CALL
for (var i = 0; i < mArray.length; i++) {
var obj = mArray[i];
webAjaxcall(obj["mid"],obj["title"]); // DEFINITELY NOT A GOOD IDEA
}
return true;
}
function webAjaxcall(mid,title){
var xmlhttp=new XMLHttpRequest();
xmlhttp.onreadystatechange=function(){
if (xmlhttp.readyState==4 && xmlhttp.status==200){
//DO SOMETHING
}
}
xmlhttp.open("POST","file2.php",true);
xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
params = "title="+title+"&mid="+mid;
xmlhttp.send(params);
}
以防萬一有人想知道我如何填充JS數組:
文件1
$sql = "SELECT `movieid`,`title` FROM movielist";
$result = mysql_query($sql) or die(mysql_error());
while($row=mysql_fetch_assoc($result)){
$output[] = $row;
}
exit(json_encode($output));
文件2
$json=file_get_contents("http://www.website.com/?t=".rawurlencode($moviename));
$info=json_decode($json);
DO SOMETHING
AJAX來獲得電影列表
var xmlhttp=new XMLHttpRequest();
var myarr;
xmlhttp.onreadystatechange=function(){
if (xmlhttp.readyState==4 && xmlhttp.status==200){
myarr = xmlhttp.responseText;
loadData(JSON.parse(myarr));
}
}
xmlhttp.open("POST","file1.php",true);
xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
params = "fname=<?php echo $ses_id;?>";
xmlhttp.send(params);
注: ASYNC = FALSE
同步裝置,該裝置一切都會按順序發生,一個呼叫等待阻斷代碼前面,最終的結果。
解決方案/意見:假設您要提取數據的站點(或API)無法在單個請求中處理多個結果,則能夠處理此數量的循環ajax請求的唯一方法是緩存ajax結果直接在您的SQL數據庫中:
::pseudo-architecture::
讓我們假設以下PHP文件:
index.php
$(document).ready()
函數,該函數循環遍歷所有“未緩存”的電影,並為尚未緩存的每個條目以適當的GET
參數異步調用get.php 。 這樣,它不會影響頁面加載時間,因為它是在頁面加載后發生的。 ::pseudocode::
for movie in movies
if object has cached data and date retrieved is less than [some time ago]
return data from SQL db
else
display a "caching in progress" notification for that title
send GET request to get.php
注意:您可能需要根據對服務器的強大程度來排隊/延遲對get.php的請求,以免一次運行1000個單獨的線程。
get.php
$_GET
參數,並將請求轉發到您的第三方API /網站。 ::pseudocode::
send 200 ok status code and connection-close header
get $_GET parameters
retrieve API data for your movie by sending $_GET parameters
cache to your SQL db once data is returned
最終,頁面是實時加載的,並且為了查看新數據,您需要刷新頁面(或者,如果您真的想花哨的話,可以使用WebSockets通知客戶端)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.