Php .ajax()调用赢得';在上一个.ajax()调用完成之前,是否无法完成?

Php .ajax()调用赢得';在上一个.ajax()调用完成之前,是否无法完成?,php,javascript,jquery,ajax,Php,Javascript,Jquery,Ajax,所以,我正在为CSV处理脚本制作一个进度条dnc_scriber.php通过CSV检查电话号码与数据库,在单独的文件中返回匹配和不匹配的数据lines.php返回要处理的行总数,而progress.php返回已处理的行数。我使用这两个数字来创建jQuery的progressbar函数所完成工作的百分比 我的问题是doProgressBar()中的第一个.ajax()调用直到对dnc\u scriber.php的调用完成后才会完成。为了澄清这一点,当查看Chrome中的网络监视器时,向lines.

所以,我正在为CSV处理脚本制作一个进度条
dnc_scriber.php
通过CSV检查电话号码与数据库,在单独的文件中返回匹配和不匹配的数据
lines.php
返回要处理的行总数,而
progress.php
返回已处理的行数。我使用这两个数字来创建jQuery的progressbar函数所完成工作的百分比

我的问题是
doProgressBar()
中的第一个
.ajax()
调用直到对
dnc\u scriber.php
的调用完成后才会完成。为了澄清这一点,当查看Chrome中的网络监视器时,向
lines.php
发出请求的同时,向
dnc_scriber.php
发出请求,但直到
dnc_scriber.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);
progress.php

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

CSV处理器在检查过程结束时将每行的
$\u会话['lines\u processed']
递增一次

不确定这是否是问题的确切原因,但需要修复

改变

setTimeout(doProgressBar(), 100);


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

不确定这是否是问题的确切原因,但这是需要解决的问题

改变

setTimeout(doProgressBar(), 100);

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

Ajax将是同步的

lines.php
可能正在等待
dnc\u scriber.php
,因为第一个已经锁定了MySQL

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

Ajax将是同步的

lines.php
可能正在等待
dnc\u scriber.php
,因为第一个已经锁定了MySQL


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

很可能,您的服务器将每个用户的并发连接数限制为1。或者,您正在使用会话,并且第一个脚本已将其锁定。第二个脚本将被阻止,直到第一个脚本释放其对会话文件的锁定。仅在需要时使用
session\u start()
,并在使用完锁后立即使用
session\u write\u close()
释放锁


编辑:我不确定这是否有效,但你可以试试。每次要更新会话时,请调用
session\u start()
,更新会话,然后调用
session\u write\u close()
。我不确定是否允许您在脚本中多次执行此操作,但它似乎应该可以工作。

最有可能的情况是,您的服务器将每个用户的并发连接数限制为1。或者,您正在使用会话,并且第一个脚本已将其锁定。第二个脚本将被阻止,直到第一个脚本释放其对会话文件的锁定。仅在需要时使用
session\u start()
,并在使用完锁后立即使用
session\u write\u close()
释放锁


编辑:我不确定这是否有效,但你可以试试。每次要更新会话时,请调用
session\u start()
,更新会话,然后调用
session\u write\u close()
。我不确定是否允许您在脚本中多次这样做,但它似乎应该可以工作。

当使用PHP代码读取.csv文件时,是否锁定了该文件?因此,如果它必须读取它两次,它将只在前面的代码关闭流时读取它


如果打开两个浏览器并同时运行代码,会发生什么情况?两个浏览器是否同时执行,结果是否相同?还是在等待文件

使用PHP代码读取.csv文件时,是否锁定了该文件?因此,如果它必须读取它两次,它将只在前面的代码关闭流时读取它


如果打开两个浏览器并同时运行代码,会发生什么情况?两个浏览器是否同时执行,结果是否相同?还是在等待文件

服务器在任何给定时间允许多少个连接?@据我的IT人员说,服务器允许大量连接。这是一个运行lampp的内部Ubuntu开发服务器-大部分是默认值。服务器在任何给定时间允许多少个连接?@据我的It人员说,没有人服务器允许大量连接。这是一个运行LAMP的内部Ubuntu开发服务器,大部分都是默认值。很好。我没有想到,但这比我的答案更可信。我会留下我的以防万一。。。“但是,竖起大拇指!”弗兰基-有趣的是,我对你的答案也有同样的想法。在没有看到php代码的情况下很难说它是哪个。我正在使用会话。我在所有涉及的文件上使用
session\u start()
dnc\u scriber.php
设置
$\u会话['lines']
,该会话由
lines.php
读取。当它通过CSV的行时,它还会更新会话['lines\u processed']
progress.php
返回该会话变量。这可能是我的问题的根源。你有什么更好的方法来跟踪进度的建议吗?@Obi wanJacobi-我用一些你可以尝试的东西更新了我的答案。很好。我没有想到,但这比我的答案更可信。我会留下我的以防万一。。。“但是,竖起大拇指!”弗兰基-有趣的是,我对你的答案也有同样的想法。在没有看到php代码的情况下很难说它是哪个。我正在使用会话。我在所有涉及的文件上使用
session\u start()
dnc\u scriber.php
sets
$\u