|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
常用的linux命令,尤其是一些能帮你提高开发效率的命令,(eg:grep,awk,sed,split等);
良多时分用户必要从网站下载文件,假如文件是能够经由过程一个流动链接公然猎取的,那末我们只需将文件寄存到webroot下的目次里就好。但年夜多半情形下,我们必要做权限把持,比方下载PDF账单,又比方下载网盘里的档案。这时候,我们一般借助于剧本代码来完成,而这无疑会增添服务器的包袱。
比方上面的代码:- <?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);?>
复制代码 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。别的,必要在设置文件中做以下设定
- location/protected/{internal;root/some/path;}
复制代码 暗示这个路径只能在Nginx外部会见,不克不及用扫瞄器间接会见避免未受权的下载。
因而PHP发送X-Accel-Redirect给Nginx:
- ]<?php$filePath=/protected/iso.img;header(Content-type:application/octet-stream);header(Content-Disposition:attachment;filename=".basename($file).");//让Xsendfile发送文件header(X-Accel-Redirect:.$filePath);?>
复制代码 如许用户就会下载到/some/path/protected/iso.img这个路径下的文件。
假如你想发送的是/some/path/iso.img文件,那末Nginx设置应当是
- location/protected/{internal;alias/some/path/;#注重最後的斜杠}
复制代码
学习linux,就意味着更快的开发效率,等更多关于软件本身或者说操作系统本身的理解。 |
|