开门见山
使用x-sendfile 代理下载,使得下载操作不走php,避免了对php网站造成访问阻塞
踩坑经历:
网上很多关于该方面的教程案例,但很多都没有考虑php.ini中的 memory_limit = 128M,
我电脑上默认是128M,当时为了测试下载一个790+兆的sql备份文件,使用网上常规的方法,比如
切片什么的,通通都只能下到127M就停止了,后来讲该参数调高到300M,500M,700M,{$size}M,
带来的后果是 “点击下载按钮之后,右下角一直显示等待响应”,大概会经过几十秒,甚至一两分钟之
后,开始下载,下载到{$size}M大小后,出错。
试了很多,尝试将memory_limit调整到大于下载文件大小,然后通过调整切片大小,延时大小等待,企图
可以蒙混过关,均不得治。
实在没法,下载了mod_xsendfile.c
第一步:下载mod_xsendfile.c , 编译出mod_xsendfile.so , 有的教程说要用apxs2来编译,但是
我用apxs也编译成功了,官方文档也是apxs编译, 并且这一步操作, 会自动在httpd服务目录下module下
生成mod_xsendfile.so,省去了手动复制的操作
第二步:配置 xsendfile,在apache的配置文件或者站点配置文件中,写明xsendfile为开启, 写明下载路径:
#vim /alidata/server/httpd/conf
LoadModule xsendfile_module modules/mod_xsendfile.so
XSendFile On
#vim /alidata/server/httpd/vhosts/site.conf
<VirtualHost *>
DocumentRoot /alidata/www/site
ServerName someserver
XSendFilePath /alidata/www/site/userxyz
</VirtualHost>
userxyz 就是你存放需要下载的文件的目录
第三步:php文件中编写相应的方法通过header告诉浏览器通过xsendfile去下载文件
<?php
...
if ($user->isLoggedIn())
{
header("X-Sendfile: $path_to_somefile");
header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename=\"$somefile\"");
exit;
}
?>
最后, 由于时间关系,没有研究nginx和windows下的相关配置,以后有空了再来补充
—————————————————— 有灵性的分界线 2020-9-1———————————————