php-apache网站使用xsendfile下载大文件

开门见山

使用x-sendfile 代理下载,使得下载操作不走php,避免了对php网站造成访问阻塞

  1. 官方文档在此 https://tn123.org/mod_xsendfile/

踩坑经历:

 网上很多关于该方面的教程案例,但很多都没有考虑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———————————————

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值