修正了几次代码后都无法办理,那就只能换一种办法了。
多次搜索后,创造了一种直接返回 x-sendfile 头实现文件下载办法,完美办理了我的问题。

Nginx

Nginx默认支持x-sendfile模式,以是利用起来十分方便。

php流下载应用xsendfile晋升PHP文件下载效力 Bootstrap

虚拟域名的配置文件,添加如下内容

#假造下载路径location /down/{internal; #只许可内部访问,防止盗链alias /home/www/myweb/public/uploads/utool/;}

PHP返回header

$filename = 'test.zip';$file_path = '/down/test.zip';//物理真实路径是 /home/www/myweb/public/uploads/utool/test.zip ,至于为什么请自行脑补header('Content-type: application/octet-stream');header('Content-Disposition: attachment; filename="'.$filename.'"');header('X-Accel-Redirect:'.$file_path);

就这么轻松的两步就实现了大文件的下载,是不是很大略。

Apache

Apache须要加载 module mod_xsendfile 模块来实现相对应的功能,以是轻微繁芜一点

加载 module mod_xsendfile

从[项目地址](https://github.com/nmaier/mod_xsendfile)高下载对应的 mod_xsendfile.so,放到apache的modules目录下.然后修正 http.conf ,添加如下内容

LoadModule xsendfile_module modules/mod_xsendfile.so

开启 xsendfile

修正虚拟域名的配置文件,添加如下内容

# 开启XSendFileXSendFile On<Directory "D:/wamp/www/myweb/public/uploads/utool/"># 只许可本地链接,防止盗链<IfDefine APACHE24>Require local </IfDefine></Directory>

PHP返回header头

$filename = 'test.zip';$file_path = 'D:/wamp/www/myweb/public/uploads/utool/test.zip';header('Content-type: application/octet-stream');header('Content-Disposition: attachment; filename="'.$filename.'"');header('X-Sendfile:'.$file_path);

利用 x-sendfile 模式后,PHP只需返回header头,后续就不须要处理,以是效率有了明显提升。

如果不才载过程中,涌现中文文件名乱码的情形,可以利用函数 rawurlencode 对文件名做转码,这样就能办理乱码问题。