Php 同步优化ajax调用

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',

我有一些ajax脚本,可以触发大约250个同步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。现在脚本运行速度与以前相比非常快。