仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 354|回复: 7
打印 上一主题 下一主题

[其他Linux] linux教程之在Nginx中利用X-Sendfile头提拔PHP文件下载的功能(针对年夜文件下载) ...

[复制链接]
小女巫 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 12:26:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
常用的linux命令,尤其是一些能帮你提高开发效率的命令,(eg:grep,awk,sed,split等);
良多时分用户必要从网站下载文件,假如文件是能够经由过程一个流动链接公然猎取的,那末我们只需将文件寄存到webroot下的目次里就好。但年夜多半情形下,我们必要做权限把持,比方下载PDF账单,又比方下载网盘里的档案。这时候,我们一般借助于剧本代码来完成,而这无疑会增添服务器的包袱。
比方上面的代码:
  1. <&#63;php//用户身份认证,若考证失利跳转authenticate();//猎取必要下载的文件,若文件不存在跳转$file=determine_file();//读取文件内容$content=file_get_contents($file);//发送符合的HTTP头header("Content-type:application/octet-stream");header(Content-Disposition:attachment;filename=".basename($file).");header("Content-Length:".filesize($file));echo$content;//大概readfile($file);&#63;>
复制代码
1、如许做有甚么成绩?
如许做意味着我们的程序必要将文件内容从磁盘经由一个流动的buffer往轮回读取到内存,再发送给前端web服务器,最初才抵达用户。当必要下载的文件很年夜的时分,这类体例将损耗大批内存,乃至激发php历程超时或溃散。Cache也很头疼,更不必说中止重连的情形了。
一个幻想的办理体例应当是,由php程序举行权限反省等逻辑判别,统统经由过程后,让前台的web服务器间接将文件发送给用户――像Nginx如许的前台更擅长处置静态文件。如许一来php剧本就不会被I/O堵塞了。
2、甚么是X-Sendfile?
X-Sendfile是一种将文件下载哀求由后端使用转交给前端web服务器处置的机制,它能够打消后端程序既要读文件又要处置发送的压力,从而明显进步服务器效力,出格是处置年夜文件下载的情况下。
X-Sendfile经由过程一个特定的HTTPheader来完成:在X-Sendfile头中指定一个文件的地点来公告前端web服务器。当web服务器检测到后端发送的这个header后,它将疏忽后真个其他输入,而利用本身的组件(包含缓存头和断点重连等优化)机制将文件发送给用户。
不外,在利用X-Sendfile之前,我们必需分明这并非一个尺度特征,在默许情形下它是被年夜多半web服务器禁用的。而分歧的web服务器的完成也纷歧样,包含划定了分歧的X-Sendfile头格局。假如设置恰当,用户大概下载到0字节的文件。
利用X-Sendfile将同意下载非web目次中的文件(比方/root/),即便文件在.htaccess回护下克制会见,也会被下载。
分歧的web服务器完成了分歧的HTTP头
SENDFILE头利用的WEB器X-SendfileApache,Lighttpdv1.5,CherokeeX-LIGHTTPD-send-fileLighttpdv1.4X-Accel-RedirectNginx,Cherokee
利用X-SendFile的弱点是你得到了对文件传输机制的把持。比方假如你但愿在完成文件下载后实行某些操纵,好比只同意用户下载文件一次,这个X-Sendfile是没法做到的,由于背景的php剧本其实不晓得下载是不是乐成。
3、如何利用?
Apache请参考mod_xsendfile模块。上面我先容Nginx的用法。
Nginx默许撑持该特征,不必要加载分外的模块。只是完成有些分歧,必要发送的HTTP头为X-Accel-Redirect。别的,必要在设置文件中做以下设定
  1. location/protected/{internal;root/some/path;}
复制代码
暗示这个路径只能在Nginx外部会见,不克不及用扫瞄器间接会见避免未受权的下载。

因而PHP发送X-Accel-Redirect给Nginx:
  1. ]<&#63;php$filePath=/protected/iso.img;header(Content-type:application/octet-stream);header(Content-Disposition:attachment;filename=".basename($file).");//让Xsendfile发送文件header(X-Accel-Redirect:.$filePath);&#63;>
复制代码
如许用户就会下载到/some/path/protected/iso.img这个路径下的文件。
假如你想发送的是/some/path/iso.img文件,那末Nginx设置应当是
  1. location/protected/{internal;alias/some/path/;#注重最後的斜杠}
复制代码


学习linux,就意味着更快的开发效率,等更多关于软件本身或者说操作系统本身的理解。
简单生活 该用户已被删除
沙发
发表于 2015-1-18 09:47:33 | 只看该作者
众所周知,目前windows操作系统是主流,在以后相当长的时间内不会有太大的改变,其方便友好的图形界面吸引了众多的用户。
愤怒的大鸟 该用户已被删除
板凳
发表于 2015-1-24 17:41:34 | 只看该作者
编程学习及开发,Linux是免费,开源的操作系统,并且可开发工具相当多,如果您支持自由软件,一定要同广大热爱自由软件人士一同为其不懈努力。
因胸联盟 该用户已被删除
地板
发表于 2015-2-2 11:50:06 | 只看该作者
学习Linux应具备的。[书籍+网络资源]
变相怪杰 该用户已被删除
5#
发表于 2015-2-23 10:48:13 | 只看该作者
当然你不需搭建所有服务,可以慢慢来。自己多动手,不要非等着别人帮你解决问题。
乐观 该用户已被删除
6#
发表于 2015-3-7 08:37:29 | 只看该作者
把这个问题放在其他Linux社区请求帮助也是一种选择。如果Linux得不到答案,请不要以为我们觉得无法帮助你。有时只是看到你问题的人不知道答案罢了。这时换一个社区是不错的选择。
再现理想 该用户已被删除
7#
发表于 2015-3-14 19:18:55 | 只看该作者
其实老师让写心得我也没怎么找资料应付,自己想到什么就写些什么,所以不免有些凌乱;很少提到编程,因为那些在实验报告里已经说了,这里再写就多余了。
活着的死人 该用户已被删除
8#
发表于 2015-3-21 15:23:50 | 只看该作者
Linux操作系统这个名词记得在很早以前就听过,但当时并不知道具体是什么样的操作系统,只知道是一个与嵌入式密切相关的操作系统。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-11-16 10:20

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表