Javascript 异步上载多个文件时浏览器/服务器是否挂起?

Javascript 异步上载多个文件时浏览器/服务器是否挂起?,javascript,php,apache,asynchronous,xmlhttprequest,Javascript,Php,Apache,Asynchronous,Xmlhttprequest,对此可能有一个简单的答案,但我不知道: 问题是我正在通过XMLHttpRequests上传多个文件,并从for循环调用它。循环浏览必须上载的文件(使用webkitdirectory的整个文件夹)。如果我没有大量的文件,这部分都可以工作,但我可能有多达300个文件,或者可能永远不会超过1000个。我从Github项目中获得了原始代码: ,但我对其进行了一些编辑以满足我的需要。我认为关键代码基本上还是一样的 经过一些预处理后,会出现一个循环,循环遍历要上载的文件列表,并调用一个函数将文件上载到服务器

对此可能有一个简单的答案,但我不知道:

问题是我正在通过XMLHttpRequests上传多个文件,并从for循环调用它。循环浏览必须上载的文件(使用webkitdirectory的整个文件夹)。如果我没有大量的文件,这部分都可以工作,但我可能有多达300个文件,或者可能永远不会超过1000个。我从Github项目中获得了原始代码:

,但我对其进行了一些编辑以满足我的需要。我认为关键代码基本上还是一样的

经过一些预处理后,会出现一个循环,循环遍历要上载的文件列表,并调用一个函数将文件上载到服务器:

for (var i = 0; i < picker.files.length; i++) {
    var file = picker.files[i];
    if (processflag[i] == false) {
        let lineitem = statusitem(file, "Skipped (.hidden file)");
        listing.insertAdjacentHTML('beforeend', lineitem);
    }
    else {
    sendFile(file);
    }
}
move_uploaded_file($file_tmp, $upload_path);
HTML并没有那么重要

<div class="picker">
    <input type="file" id="picker" name="fileList" webkitdirectory multiple data-timestamp = "">
</div>
以及将上载移动到服务器上的文件夹:

for (var i = 0; i < picker.files.length; i++) {
    var file = picker.files[i];
    if (processflag[i] == false) {
        let lineitem = statusitem(file, "Skipped (.hidden file)");
        listing.insertAdjacentHTML('beforeend', lineitem);
    }
    else {
    sendFile(file);
    }
}
move_uploaded_file($file_tmp, $upload_path);
发送到服务器的邮件包括:

-----------------------------19160542578905591423661131170
Content-Disposition: form-data; name="timestamp"
2020-05-09-15-44-36
-----------------------------19160542578905591423661131170
Content-Disposition: form-data; name="counter"
24
-----------------------------19160542578905591423661131170
Content-Disposition: form-data; name="total"
25
-----------------------------19160542578905591423661131170
Content-Disposition: form-data; name="webkitpath"
POST_T1_FS_TSE_SAG_2MM_12001/IM-0009-0025.dcm
-----------------------------19160542578905591423661131170
Content-Disposition: form-data; name="file"; filename="POST_T1_FS_TSE_SAG_2MM_12001/IM-0009-0025.dcm"
Content-Type: application/dicom
顺便问一下,上传的文件是否也会转到服务器上的a/tmp目录

问题是,对于一小部分文件(比如8个左右),一切似乎都可以正常工作,但对于大量文件(例如,即使只有25个),浏览器或服务器“挂起”。我正在使用Apache在MAMP服务器上运行一切,Apache日志看起来很好,PHP日志也一样,我没有看到任何错误

它确实会连续快速地发送大量AJAX请求

我不熟悉FF开发工具中的“计时”选项卡,但在发出最后一个请求时,“阻塞”计时显示为1.38秒。看起来所有文件都被上传到了服务器上,但是浏览器对该虚拟主机没有响应

我认为这可能与连续触发那么多异步请求有关。我可以尝试同步发出这些请求,看看是否需要太长时间,或者使用某种承诺,或者限制活动异步请求的数量,但我不确定如何做到这一点

我不确定这是否也是服务器端问题。单个文件约为1MB,但可能更大,整个文件夹约为256MB,但也可能更大

这显然是服务器端的问题。有一个进程运行的可执行文件似乎挂起了服务器,从而挂起了浏览器:

$proc = proc_open($exec,[
    1 => ['pipe','w'],
    2 => ['pipe','w'],
],$pipes);
. . . .
从命令行运行大约需要30秒,但看起来所有文件都被发送到服务器并保存了,所以似乎是最后一个进程导致了问题

CLI的输出为:

XMIT: .........................................................................
I: Received Store Response (Success)
I: Sending file: /Users/sscotti/Desktop/newtelerad2/dicomtemp/DEV01/2020-05-10-05-44-14/UC5457343/T1_TSE_SAGITTAL_2MM_6001/IM-0003-0021.dcm
I: Converting transfer syntax: Little Endian Explicit -> Little Endian Explicit
I: Sending Store Request (MsgID 18, MR)

但是大约300倍,每个文件1个。如果有一种解析STDOUT输出的好方法(例如I、W、e),那就太好了。

一定是服务器端的问题。如果我省略了所有服务器端处理,只返回状态代码200,那么所有请求都已完成,所有文件已发送,而不是浏览器挂起。这一定是服务器端问题。如果省略所有服务器端处理,只返回状态代码200,则所有请求都已完成,所有文件已发送,而不是浏览器挂起。