【问题标题】:Why does this AJAX request take so long when it should make multiple calls?为什么这个 AJAX 请求应该进行多次调用时需要这么长时间?
【发布时间】:2009-06-08 18:21:58
【问题描述】:

我向 PHP 脚本发出 AJAX 请求,该脚本从一个发生变化的文本文件中返回一个数字。此 AJAX 请求应每 3 秒发生一次。但是,AJAX 请求只发出一次,它不会返回任何内容,并且萤火虫显示 AJAX GET 请求仍在发出中。几分钟后它返回并产生一个数字。它应该打了多个电话,但它只打了一个电话,它只是带着最终的答案回来了。我正在努力弄清楚这是怎么发生的!? :(

//this is called first which calls getStatus which should get the progres of the
//conversion. This AJAX request takes a long time to come back which may hinder the
//getStatus coming back quickly maybe?
function convertNow(validURL){

       startTime = setTimeout('getStatus();', 6000);
       $.ajax({
       type: "GET",
       url: "main.php",
       data: 'url=' + validURL + '&filename=' + fileNameTxt,
       success: function(msg){  
       }//function     
     });//ajax

}//function convertNow

function getStatus(){

    $.ajax({
    type: "POST",
    url: "fileReader.php",
    data: 'textFile=' + fileNameTxt,
    success: function(respomse){
    textFileResponse = respomse.split(" ");
    $("#done").html("Downloading" + textFileResponse[0]);

    if(textFileResponse[0]=='100.0%'){
            $("#loading").hide("slow");
        $("#done").html("Complete");   
        return;
    }
        continueTime = setTimeout('getStatus();', 3000); 
    }
    });//ajax
}

第二个 JavaScript 函数调用的 PHP 脚本是这样的:

$fileName = $_POST['textFile'];
//calls an external script to get the text file output
$result = file_get_contents($_SESSION['serverURL']."fileReader.php?textFile=$fileName");
echo $result;

以上是否正确,我的逻辑是否在上面捕获?还是上面的意思是只会发出一个AJAX请求?

这个问题与another question 有关。我以前认为很慢的 PHP 脚本。我希望这个问题现在与 JavaScript 相关。

感谢大家的帮助。

【问题讨论】:

    标签: php javascript jquery ajax


    【解决方案1】:

    我想知道这段代码什么时候可以工作。假设在 Javascript 中实现类似的东西的整个想法是值得怀疑的。首先,因为您在 JavaScript 中根本没有任何同步技术,但是在您的代码中,您依赖于特定的代码执行顺序,而 99% 的情况并非如此。通过设置:

    setTimeout( "getStatus", 6000); 
    

    你创建了一种并发,因此你可以让第二个脚本先执行,虽然你延迟了它,但是两个请求可以同时到达服务器,所以第二个脚本可能不会返回任何东西,所以成功函数将不再执行。
    我强烈建议您考虑重新设计您的应用程序,因为问题根本不在 Javascript 部分。

    顺便说一句,我认为 $.ajax 调用的使用必须是:

    $.ajax({
    type: "POST",
    url: "fileReader.php",
    data: { param1: value1, param2:value2...etc},
    success: function(respomse){ ...}});
    

    PS。响应需要很长时间才能返回的事实指向服务器端的问题,而不是您的 Javascript 代码中的问题。如果我们开始讨论日志记录并且您提到了 firebug,您可以使用 console.log("msg") 将您的消息登录到 firebug 控制台。

    【讨论】:

    • 你说得对,它不是 JS 部分。原来是 PHP 问题,很长一段时间都没有回来,因为正在制作另一种 AJAX 方法,我认为它阻止了它!我需要重新设计它!
    【解决方案2】:

    我不确定你是否可以这样做

    setTimeout("getStatus();",3000);
    

    但我知道你可以做到

    setTimeout(getstatus,3000);
    

    我不确定你遇到了什么缓慢,但我会尝试在 ajax 之前放入警报,并在成功时,打印到 php 中的日志(可能的开始和结束),并在设置 continueTimeout 时的 javascript,甚至可能在超时触发时发出警报... 喜欢:

    function getStatus(){
      alert('getStatus Started');
      $.ajax({
        type: "POST",
        url: "fileReader.php",
        data: 'textFile=' + fileNameTxt,
        success: function(respomse){
          alert('ajax success');
          textFileResponse = respomse.split(" ");
          $("#done").html("Downloading" + textFileResponse[0]);
          if(textFileResponse[0]=='100.0%'){
            $("#loading").hide("slow");
            $("#done").html("Complete");   
            return;
            }
          alert('starting continuetime');
          continueTime = setTimeout(**getStatus**, 3000); 
          }
        });//ajax
      }
    

    【讨论】:

    • 或者如果使用 firebug 或 webkit,使用 console.log() 代替 alerts。
    • 是的,或者甚至创建一个带有错误 ID 的文本区域并使用它来显示: var log = $('#errorlogging'); log.val(log.val() + "错误信息...\n");
    • 使用简单的警报版本进行调试,就像你做 Lathan 一样。我发现 getstatus 函数只有在一次成功的尝试和 AJAX 请求的响应时才会返回。 AJAX 调用的延续永远不会达到。所以那个PHP脚本的处理一定超级慢!!
    • 我对 php 不太熟悉,但是有没有办法可以打印到服务器错误日志?或者在开始和结束时获取服务器的当前时间来计算php运行所需的时间?
    【解决方案3】:

    最好使用 setInterval 而不是 setTimeout

    在使用新变量时也不要忘记“var”。

    如果传递的参数是正确的并且ajax请求仍然没有返回任何东西那么罪魁祸首是服务器端。

    【讨论】:

    • 如果你像你说的那样“每 3 秒”一次,你想要 setInterval,而不是 setTimeout,setTimeout 只会在延迟后触发一次。
    • 实际上他不想一直运行这些函数,这就是他使用 setTimeout 的原因。你可以看到,他以“乒乓”的方式称呼他们,每个人都在一定的条件下称呼另一个人。
    【解决方案4】:

    fileReader.php 是否在无限循环中调用自己?

    听起来确实如此。通过查看那里的小代码sn-p,它看起来也确实如此。 (这是完整的代码吗?)

    如果fileReader.php 是,那么它可能会在Web 服务器允许每个客户端进行尽可能多的调用,然后它会被搁置,这就解释了为什么您没有收到堆栈溢出错误。当 ajax 超时(60 秒后或其他时间)时,整个 fileReader.php 调用堆栈就会消失,而您只剩下第一个 ajax 的答案。或者,您可能会得到第一个fileReader-call 的答案。呃不确定。

    也许尝试添加

    if(!isset($_POST['textFile'])){echo "ERR: POST['textfile'] not set!"; exit(-1);}
    

    在您显示的fileReader.php-文件中的部分之前。

    【讨论】:

      猜你喜欢
      • 2012-08-09
      • 1970-01-01
      • 2012-04-29
      • 1970-01-01
      • 2011-08-27
      • 2011-12-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多