javascript - XMLHttpRequest ReadyState HEADERS_RECEIVED 等待下载整个文件

标签 javascript php ajax apache xmlhttprequest

According to MDNXMLHttpRequest readyState 事件触发 5 个事件,如下所列。

0    UNSENT              open()has not been called yet.
1    OPENED              send()has not been called yet.
2    HEADERS_RECEIVED    send() has been called, and headers and status are available.
3    LOADING             Downloading; responseText holds partial data.
4    DONE                The operation is complete.

这似乎表明 HEADERS_RECEIVED 在整个文件下载之前就可用,尤其是在长时间传输期间。但是,在我的测试中,虽然事件确实按此顺序触发,但 HEADERS_RECEIVEDLOADING 几乎与 DONE 事件同时触发.

这是一个说明我的问题的基本示例。 OPENED 事件会立即触发,但 HEADERS_RECEIVEDLOADINGDONE 都会等待 5 秒。我在 Firefox 和 Chrome 中的本地 Apache 2.4 服务器上使用 PHP 5.5 运行了此测试。

JavaScript:

var xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function(){
    console.log("readyState:", xmlhttp.readyState);
};
xmlhttp.open("GET", "handler.php", true);
xmlhttp.send();

handler.php:

<?php
header( 'Content-Type: text/plain' );
echo "start\n";
sleep( 5 );
echo "end\n";

似乎在内容之前获取 header 的唯一方法是首先发出 HEAD 请求,然后发出完整请求。这是预期的行为还是我错过了什么?

更新:

使用通过慢速网络共享符号链接(symbolic link)的 1GB 文件,或输出大量输出的 PHP 文件(如下例)确实会更快地触发 HEADERS_RECEIVED。不过这似乎有些不靠谱。我尝试过使用 PHP 的 flush sleep 之前起作用,但没有帮助。

<?php
header( 'Content-Type: text/plain' );
echo "start\n";
$i = 10000000;
while( $i-- ){
    echo "1\n";
}
echo "end\n";

有没有一种方法可以可靠地发送 header ,而无需等待内容发送?

最佳答案

至少在您的示例中,我猜测 PHP 在 sleep 之后才真正刷新缓冲区(从而发送 header ),但我不确定如果您这样做,这是否可以解释这种行为在使用实际文件下载时遇到过这种情况。

关于javascript - XMLHttpRequest ReadyState HEADERS_RECEIVED 等待下载整个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26685554/

相关文章:

javascript - 编写指令时出现 Angular、未定义的外部库

javascript - TypeScript 定义与默认导出不匹配

php - preg_split 由空格和制表符外引号

php - jQuery tokeninput 插件,返回 1 个字符数字的结果时出现问题

javascript - 我希望 Android 软键盘在没有 JAVA 的情况下在正确的时刻有一个 "Done"按钮

javascript - 使用围绕非格式化文本的颜色和变量格式化 console.log

php - Php/HTML 中的无序列表

java - 单击按钮时如何从 php 中的下拉菜单项调用 Java 文件

ajax - 当我在 Nightmarejs 中单击 ajax 时如何使用回调

javascript - Jquery Ajax .load() 不起作用