你们的产品已经准备好了。然而,还有一些小的改进空间,所以我将为您指出这些改进。另请参阅下面我关于X-Sendfile和X-Accel-Redirect的注释。
更换这些线路:
ob_clean();
flush();
具有以下功能:
while (@ob_end_clean());
关键是,如果输出缓冲区中已经有东西,您不想将其清除,只想将其清除。如果刷新它,将在可下载文件内容的前面加上输出缓冲区内容,这只会损坏可下载文件。请参见:
http://php.net/manual/en/function.ob-end-clean.php这一行之后:
$file = /path/to/file/above/root.zip;
添加以下内容以确保服务器级别的GZIP压缩已关闭。这可能不会对您当前的web主机造成影响,但将站点移到其他位置,如果没有这些行,您可能会看到脚本严重中断。
@ini_set(\'zlib.output_compression\', 0);
if(function_exists(\'apache_setenv\')) @apache_setenv(\'no-gzip\', \'1\');
header(\'Content-Encoding: none\');
<小时>
Caution: 在较大的文件(例如超过20MB的文件)上使用这种PHP驱动的文件下载技术时要小心。为什么?两个原因:
PHP有内部内存限制。如果readfile()
如果将文件读入内存并提供给访问者,则脚本将失败。
此外,PHP脚本也有时间限制。如果访问速度非常慢的访问者需要很长时间才能下载较大的文件,则脚本将超时,用户将体验到下载尝试失败,或收到部分/损坏的文件。
Caution: 还要注意,PHP驱动的文件下载使用
readfile()
该技术不支持可恢复的字节范围。因此,暂停下载或下载被以某种方式中断,不会让用户有继续的选项。他们需要重新开始下载。可以在PHP中支持范围请求(resume),但这是
tedious.
从长远来看,我的建议是,您应该开始寻找一种更有效的服务受保护文件的方法,即X-Sendfile 在Apache中,以及X-Accel-Redirect 在Nginx中。
X-Sendfile和X-Accel-Redirect都使用相同的基本概念。与其要求PHP之类的脚本语言将文件拉入内存,不如简单地告诉web服务器进行内部重定向,并提供其他受保护文件的内容。简而言之,您可以去掉上面的大部分内容,并将解决方案简化为header(\'X-Accel-Redirect: ...\')
.