【发布时间】:2012-06-07 23:55:59
【问题描述】:
我有大量数据要发送到浏览器,大概 100mb 左右。我已将它们分成较小的文件,以便模拟流式传输。假设我有 200 个文件,每个文件 500kb。我在 javascript 中构建了一个包含 200 个文件的数组,然后对其进行循环并为每个文件进行 ajax 调用。它工作正常。然后我想改进它,所以我对服务器上的所有内容进行了 gzip 压缩,它们下降到原始块大小的 20% 左右。我的 ajax 调用以下文件:
fileserver.php?file=/temp/media_C46_20110719_113332_ori-0.js.gz
在 fileserver.php 中,我有,非常简单:
$filepath = isset($_GET['file']) ? $_GET['file'] : '';
if($filepath!=''){
if(substr($filepath,-2,2)=='gz'){
header("Content-Type: text/plain" );
header("Content-Length: " .(string)(filesize($filepath)) );
header("Content-Encoding: gzip");
readfile(filepath);
}
else{
header("Location: ".$filepath );
}
}
同样,这完全有效。问题是它需要永远!在 chrome 中查看我的网络选项卡,需要 15 秒左右才能获得 100kb 的块。我可以在不到一秒钟的时间内直接下载该文件。上面的 php 脚本几乎不需要任何时间来运行。我知道客户端(浏览器)需要花费一些时间来扩充内容,但它必须少于一秒。那么什么需要15秒!我可以使用其他任何工具来检查这一点吗?
我知道我可以在 apache 中设置标头变量,但我无权访问它,并且在 php 中进行设置在功能上是等效的,对吧?这些是要设置的正确标题吗?
【问题讨论】:
-
为什么首先要绕道 PHP 脚本?直接在 Web 服务器中启用 .js 文件的压缩不是更有意义吗?
-
我在上一段中提到过,我无权编辑 Web 服务器。它在功能上是等效的,对吧?
-
您也可以尝试将 Content-type 更改为
application/x-gzip -
这并不等同:必须启动一个占用内存的 PHP 进程来提供文件。 (但这不应该导致 15 秒的延迟。)不过,在 Apache 的配置中或(如果可能的话)在
.htaccess文件中执行此操作会好得多