[英]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.