我正在尝试将一个大文件从外部 API 传递给用户,(想想 100MB 或更多)
目前,我正在使用一些偏执的脚本(由于过去的失败)来尽快下载脚本。
通过“下载”,我仅指浏览器上的下载触发器,而不是文件的实际下载。只是用户可以选择他想要保存文件的位置。
set_time_limit(0);
apache_setenv('no-gzip', 1);
ini_set('zlib.output_compression', 0);
ini_set('output_buffering', 0);
ini_set('implicit_flush', 1);
for($i = 0; $i < ob_get_level(); $i++) { ob_end_flush(); }
ob_implicit_flush(1);
header('Content-Description: File Transfer');
header('Content-type: application/octet-stream');
header('Content-Transfer-Encoding: Binary');
header('Content-Disposition: attachment; filename="' . $filename . '"');
header('Cache-Control: private');
ob_flush();
flush();
$fh = fopen($external_api_url, 'rb');
while(!feof($fh))
{
echo fread($fh, 512);
ob_flush();
flush();
}
fclose($fh);
使用这个脚本,一个 50mb 的文件在下载弹出窗口出现之前仍然需要 20 秒,而更大的文件则需要更长的时间。
有什么方法可以更快地启动流?
编辑:我也尝试过 fpassthru() 和 readfile() 但是对于同一个 50mb 文件需要 40 秒,这让我觉得这种方式更好。我也玩过不同的读取大小(512、256、64,还有其他几个),但我没有注意到差异)