2012-01-18 143 views
1

所以,我正在处理CSV处理脚本的进度条。 dnc_scrubber.php检查CSV并根据数据库检查电话号码,并将匹配的和不匹配的数据返回到单独的文件中。 lines.php返回要处理的总行数,而progress.php返回已处理的行数。我使用这两个数字来创建jQuery进度条函数完成的工作的百分比。.ajax()调用在上一个.ajax()调用完成之前不会完成?

我的问题是,在doProgressBar()内的第一个.ajax()呼叫没有完成,直到dnc_scrubber.php的呼叫完成。为了说明,在Chrome浏览器中查看网络监视器时,请求lines.phpdnc_scrubber.php的请求同时发出,但在dnc_scrubber.php运行完成之前没有收到响应。这里是相关的代码:

$('#progressbar').progressbar();    


$.ajax({ 
url: 'dnc_scrubber.php', 
type: 'POST', 
async: true, 
data: querystring, 
success: function(){ 
    for (i = 0; i < files.length; i++){ 
     $('#complete').append('<a href="process/MATCHED - ' + files[i] + '">MATCHED - ' + files[i] + '</a><br />'); 
     $('#complete').append('<a href="process/SCRUBBED - ' + files[i] + '">SCRUBBED - ' + files[i] + '</a><br />'); 
    } 
}      
}); 


function doProgressBar(){     
$.ajax({ 
    url: 'lines.php', 
    async: true, 
    dataType: 'json', 
    complete: function (rez) { 
     lines = JSON.parse(rez.responseText); 
     lines = parseInt(lines.lines); 

     console.log('dpg1 - lines: ' + lines); 

     $.ajax({ 
      url: 'progress.php', 
      async: true, 
      dataType: 'json', 
      complete: function (rez1) { 
       prog = JSON.parse(rez1.responseText); 
       prog = parseInt(prog.progress); 

       console.log('dpg2 - lines: ' + lines + ' prog: ' + prog); 

       if (lines > prog){ 
        var bar = (prog/lines) * 100;           
        var bar = Math.round(bar);           
        $('#progressbar').progressbar('option', 'value', bar); 
        setTimeout(doProgressBar(), 1000); 
        console.log('dpg3 - lines: ' + lines + ' prog: ' + prog + ' bar: ' + bar); 
       } else if (lines == prog){ 
        $('#progressbar').progressbar('option', 'value', 100); 
        console.log('dpg3 - lines == prog'); 
       } 

      } 
     }); 

    } 
}); 
} 



setTimeout(doProgressBar(), 100); 

这是正常的功能吗?我试图做的是不可能的?我不知所措......在此先感谢帮助

编辑: lines.php

session_start(); 
header('Content-type: application/json'); 
echo json_encode(array('lines' => $_SESSION['lines'])); 

progress.php

session_start(); 
header('Content-type: application/json'); 
echo json_encode(array('progress' => $_SESSION['lines_processed'])); 

的CSV处理器在的结尾递增$_SESSION['lines_proccessed']一个检查每个线路的过程

+0

服务器在任何给定时间允许多少个连接? – nobody 2012-01-18 20:42:40

+0

@根据我的IT人员,没有人允许大量的连接。它是一个运行lampp的内部Ubuntu开发服务器 - 主要是默认值。 – jebriggsy 2012-01-18 21:01:01

回答

2

很可能,您的服务器将每个用户的并发连接数限制为1个。或者,您正在使用会话,并且第一个脚本将其锁定。第二个脚本将被阻塞,直到第一个脚本释放其对会话文件的锁定。如果需要,只能使用session_start(),并在您完成后立即释放与session_write_close()的锁。

编辑:我不确定这是否可行,但您可以尝试。每次要更新会话时,请致电session_start(),更新会话,然后致电session_write_close()。我不确定是否允许您在脚本中多次执行此操作,但似乎应该可以正常工作。

+0

不错的一个。虽然没有,但它比我的回答更合理。为了以防万一......我会离开我的,但在这里竖起大拇指。 – Frankie 2012-01-18 20:51:39

+0

@Frankie - 滑稽,我对你的*答案有同样的想法。没有看到php代码就很难说它是什么。 – gilly3 2012-01-18 20:53:17

+0

我正在使用会话。我在所有涉及的文件上使用'session_start()'。 'dnc_scrubber.php'设置''__SESSION ['lines']',它由'lines.php'读取。它还通过CSV的行更新'$ _SESSION ['lines_processed']'。 'progress.php'返回该会话变量。 这可能是我的问题的来源。你有什么建议可以更好地追踪进展吗? – jebriggsy 2012-01-18 20:57:36

2

不确定这是否是问题的确切原因,但它是有限的兴奋需要修复。

变化

setTimeout(doProgressBar(), 100); 

setTimeout(doProgressBar, 100); 

您立即调用doProgressBar,而不是之后超时完成。

+0

谢谢,我会做出改变 – jebriggsy 2012-01-18 20:53:09

1

Ajax将是assync。

lines.php可能正在等待dnc_scrubber.php作为第一个锁定MySQL。

这只是猜测,因为我们没有你的PHP代码,但尝试手动运行这两个PHP脚本,并检查是否lines.php不等待MySQL完成。

+0

'lines.php'只是返回一个会话变量为JSON – jebriggsy 2012-01-18 20:58:10

+0

@ Obi-wan Jacobi然后检查gilly3的答案。我会离开我的,以防万一有人遇到谷歌并且有不同的问题,但我想他已经明白了。 – Frankie 2012-01-18 21:02:40

0

当您读取.csv文件与您的PHP代码是否锁定文件?所以如果它必须读两次,它只会在前面的代码关闭流时才读取它?

如果您打开2个浏览器并同时运行代码,会发生什么情况?两个浏览器在同一时间执行相同的结果吗?或者是否有文件等待?

相关问题