abd*_*him 5 javascript php ajax
我找到了很多关于这个主题的帖子.但我找到的解决方案并不适合我.一些专家建议改变代码结构,但我不知道我该怎么做.
我想要的:
1)从SQL数据库中
获取电影列表2)从每个电影的网站获取信息
我遇到的问题: PHP MAX_TIMEOUT发生.
解决方案我想:分别为每部电影调用async req
瓶颈:太多异步请求
能否请您建议如何实现(如果可能只有JS,请不要jquery)?
网上的一些解决方案:
1)使用ASYNC = FALSE ....我不想使用SYNC req,无意义使用Ajax然后
2)收集所有数据,然后进行一次Ajax调用...好吧,我先做了..但它是一个长脚本(从网上获取电影信息),所以最终导致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);
}
Run Code Online (Sandbox Code Playgroud)
以防任何人想知道我如何填充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));
Run Code Online (Sandbox Code Playgroud)
文件2
$json=file_get_contents("http://www.website.com/?t=".rawurlencode($moviename));
$info=json_decode($json);
DO SOMETHING
Run Code Online (Sandbox Code Playgroud)
AJAX获得MOVIELIST
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);
Run Code Online (Sandbox Code Playgroud)
注意: ASYNC = FALSE表示同步,这意味着一切都会按顺序发生,一个调用等待前一个调用,最终导致阻塞代码。
解决方案/意见:假设您提取数据的站点(或 API)无法处理单个请求中的多个结果,那么您能够处理如此大量循环 ajax 请求的唯一方法就是缓存 ajax结果直接在您的 SQL 数据库中:
::pseudo-architecture::
我们假设有以下 PHP 文件:
索引.php
$(document).ready()循环遍历所有“未缓存”电影的函数,为每个尚未缓存的条目使用适当的参数异步调用get.php 。GET这样,它就不会影响页面加载时间,因为它是在页面加载后发生的。::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
Run Code Online (Sandbox Code Playgroud)
注意:您可能需要根据服务器的强大程度对 get.php 的请求进行排队/延迟,以免同时运行 1000 个单独的线程。
获取.php
$_GET从 index.php 的 ajax 循环发送的参数并将请求转发到您的第 3 方 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
Run Code Online (Sandbox Code Playgroud)
最终,页面会实时加载,为了查看新数据,您需要刷新页面(或者如果您想变得更奇特,可以使用WebSockets做一些事情来通知客户端)。
| 归档时间: |
|
| 查看次数: |
1072 次 |
| 最近记录: |