Php 同步优化ajax调用
我有一些ajax脚本,可以触发大约250个同步PHP调用。这是我的剧本Php 同步优化ajax调用,php,javascript,ajax,Php,Javascript,Ajax,我有一些ajax脚本,可以触发大约250个同步PHP调用。这是我的剧本 $(document).ready(function(){ $("#generate").html("<div class='modal'><p>Initializing...</p></div>"); $.ajax({ url:'/fetch around 250 url from database.php',
$(document).ready(function(){
$("#generate").html("<div class='modal'><p>Initializing...</p></div>");
$.ajax({
url:'/fetch around 250 url from database.php',
async:false,
dataType: 'json',
success: function(data){
$.each(data,function(key,val){
$("#generate").html("<div class='modal'><p>Fetching "+val.url+"</p></div>");
saveimage(val.url);
}
$("#generate").html("<div class='modal'><p>done</p></div>");
finalcreate();
},
});
});
function saveimage(){
$.ajax({
url: 'do some php work.php',
async: false,
});
}
function finalcreate(){
$.ajax({
url: 'do some php work.php',
async: false,
});
}
$(文档).ready(函数(){
$(“#generate”).html(“初始化…””;
$.ajax({
url:“/从database.php获取大约250个url”,
async:false,
数据类型:“json”,
成功:函数(数据){
$。每个(数据、函数(键、值){
$(“#生成”).html(“获取”+val.url+””;
saveimage(val.url);
}
$(“#generate”).html(“done”);
finalcreate();
},
});
});
函数saveimage(){
$.ajax({
url:'do some php work.php',
async:false,
});
}
函数finalcreate(){
$.ajax({
url:'do some php work.php',
async:false,
});
}
在第一部分中,脚本从数据库获取250多个url,对于每个url脚本,使用另一个ajax调用执行一些php计算。循环结束时,脚本执行最后一个ajax调用
当我在firefox中运行这个程序时,它只成功运行了40个URL,然后浏览器会显示一个对话框,可以选择用户是否要停止这个脚本,如果用户想运行这个脚本,那么脚本会在接下来的40个URL中再次运行,相同的过程会一直持续到最后。
如何优化此脚本,我不希望浏览器显示选项停止此脚本。请帮助
谢谢,Ajax调用需要很长时间才能完成,因为它与远程服务器通信。最慢的事情是向服务器发送一个查询。您应该向服务器发送一个包含所有所需数据的批处理请求,这将分离数据并对其进行处理。完成所有操作的速度应该快250倍左右。尝试以下方法:
function nextrequest() {
if (requests.length == 0) {
$("#generate").html("<div class='modal'><p>done</p></div>");
finalcreate();
return;
}
var val = requests.pop();
$("#generate").html("<div class='modal'><p>Fetching "+val.url+"</p></div>");
saveimage(val.url);
}
var requests = [];
$(document).ready(function(){
$("#generate").html("<div class='modal'><p>Initializing...</p></div>");
$.ajax({
url:'/fetch around 250 url from database.php',
dataType: 'json',
success: function(data){
requests = data;
nextrequest();
},
});
});
function saveimage(){
$.ajax({
url: 'do some php work.php',
success: function(data) {
// do something...
nextrequest();
}
});
}
function finalcreate(){
$.ajax({
url: 'do some php work.php',
});
}
函数nextrequest(){
if(requests.length==0){
$(“#generate”).html(“done”);
finalcreate();
返回;
}
var val=requests.pop();
$(“#生成”).html(“获取”+val.url+””;
saveimage(val.url);
}
var请求=[];
$(文档).ready(函数(){
$(“#generate”).html(“初始化…””;
$.ajax({
url:“/从database.php获取大约250个url”,
数据类型:“json”,
成功:功能(数据){
请求=数据;
nextrequest();
},
});
});
函数saveimage(){
$.ajax({
url:'do some php work.php',
成功:功能(数据){
//做点什么。。。
nextrequest();
}
});
}
函数finalcreate(){
$.ajax({
url:'do some php work.php',
});
}
您将所有URL存储在一个全局变量中,每次请求完成时,您都会得到下一个URL,直到所有URL都被使用为止,(requests.length==0)
,您将调用最后一个请求
这样,用户仍然可以在页面上执行其他操作,并且您可以在每次请求完成时显示进度。此外,一个好消息是,您可以一次调用2次或更多次,以加快处理速度。为每个ajax请求留出一些时间间隔
success: function(data){
$.each(data,function(key,val){
$("#generate").html("<div class='modal'><p>Fetching "+val.url+"</p></div>");
setTimeout(saveimage(val.url),3000);
}
成功:函数(数据){
$。每个(数据、函数(键、值){
$(“#生成”).html(“获取”+val.url+””;
setTimeout(saveimage(val.url),3000);
}
< /代码>如果它们是同步的,你就不能做任何事情。这是一个浏览器的事情。为什么你需要它们同步?你的Ajax不是Ajax。我会考虑重写这一点来实际地处理你的URL。更好的是,在PHP端实现一些批处理,这样你就不需要在这么多的地方发出这么多的HTTP请求。同步仅用于向用户端显示脚本的进度。如果我使用异步请求,则在完成循环之前,脚本将调用“finalcreate()”函数。如何管理这些事情?我希望仅在saveimage()之后调用finalcreate方法函数。有什么想法吗?。@JayC从数据库中获取url不会花费太多时间,实际耗时的事情是saveimage调用,如果我从http请求中获取url,然后调用ajax请求来保存图像,那么我想我也会遇到同样的问题。@Arjun Jain:您获取脚本超时正是因为您正在同步触发这些请求Ajax请求可以以各种方式链接在一起,这将完全避免这个问题,因为异步请求将允许用户界面仍然具有响应性。非常感谢jadkik94。现在脚本运行速度与以前相比非常快。