让PHP更快的提供文件下载 【转】
一般来说, 我们可以通过直接让URL指向一个位于Document Root下面的文件, 来引导用户下载文件.
但是, 这样做, 就没办法做一些统计, 权限检查, 等等的工作. 于是, 很多时候, 我们采用让PHP来做转发, 为用户提供文件下载.
- <?php
- $file = "/tmp/dummy.tar.gz";
- header("Content-type: application/octet-stream");
- header('Content-Disposition: attachment; filename="' . basename($file) . '"');
- header("Content-Length: ". filesize($file));
- readfile($file);
但是这个有一个问题, 就是如果文件是中文名的话, 有的用户可能下载后的文件名是乱码.
于是, 我们做一下修改(参考: :
- <?php
- $file = "/tmp/中文名.tar.gz";
- $filename = basename($file);
- header("Content-type: application/octet-stream");
- //处理中文文件名
- $ua = $_SERVER["HTTP_USER_AGENT"];
- $encoded_filename = rawurlencode($filename);
- if (preg_match("/MSIE/", $ua)) {
- header('Content-Disposition: attachment; filename="' . $encoded_filename . '"');
- } else if (preg_match("/Firefox/", $ua)) {
- header("Content-Disposition: attachment; filename*=\"utf8''" . $filename . '"');
- } else {
- header('Content-Disposition: attachment; filename="' . $filename . '"');
- }
- header("Content-Length: ". filesize($file));
- readfile($file);
恩, 现在看起来好多了, 不过还有一个问题, 那就是readfile, 虽然PHP的readfile尝试实现的尽量高效, 不占用PHP本身的内存, 但是实际上它还是需要采用MMAP(如果支持), 或者是一个固定的buffer去循环读取文件, 直接输出.
输出的时候, 如果是Apache + PHP mod, 那么还需要发送到Apache的输出缓冲区. 最后才发送给用户. 而对于Nginx + fpm如果他们分开部署的话, 那还会带来额外的网络IO.
那么, 能不能不经过PHP这层, 直接让Webserver直接把文件发送给用户呢?
今天, 我看到了一个有意思的文章: How I PHP: X-SendFile.
我们可以使用Apache的module mod_xsendfile, 让Apache直接发送这个文件给用户:
- <?php
- $file = "/tmp/中文名.tar.gz";
- $filename = basename($file);
- header("Content-type: application/octet-stream");
- //处理中文文件名
- $ua = $_SERVER["HTTP_USER_AGENT"];
- $encoded_filename = rawurlencode($filename);
- if (preg_match("/MSIE/", $ua)) {
- header('Content-Disposition: attachment; filename="' . $encoded_filename . '"');
- } else if (preg_match("/Firefox/", $ua)) {
- header("Content-Disposition: attachment; filename*=\"utf8''" . $filename . '"');
- } else {
- header('Content-Disposition: attachment; filename="' . $filename . '"');
- }
- //让Xsendfile发送文件
- header("X-Sendfile: $file");
X-Sendfile头将被Apache处理, 并且把响应的文件直接发送给Client.
Lighttpd和Nginx也有类似的模块, 大家有兴趣的可以去找找看
原文地址:http://www.laruence.com/2012/05/02/2613.html
转载于:https://www.cnblogs.com/hejia/p/4058869.html
让PHP更快的提供文件下载 【转】相关推荐
- 让PHP更快的提供文件下载
为什么80%的码农都做不了架构师?>>> 转载于:https://my.oschina.net/fsmwhx/blog/110825
- 如何为我们的应用程序提供一个更小、更快的视频通话库
正文字数:2848 阅读时长:4分钟 在研究如何使视频通话在未来更高效,更易于扩展时,Facebook意识到,最好的方法是从头开始重新设计库并重写整个库,也就是Rsys. 作者 / Ishan Kh ...
- 与阿里云整个生态体系共同成长,更快更好的为房地产行业客户提供高价值的服务。...
免费开通大数据服务:https://www.aliyun.com/product/odps "最早是新业务要做,但是买服务器来不及,管理员没到位,而且新业务的成本很高,是否能成功也是未知,因 ...
- 与阿里云整个生态体系共同成长,更快更好的为房地产行业客户提供高价值的服务。
免费开通大数据服务:https://www.aliyun.com/product/odpsyu "最早是新业务要做,但是买服务器来不及,管理员没到位,而且新业务的成本很高,是否能成功也是未知 ...
- 目标检测经典论文——YOLOv2论文翻译(纯中文版):YOLO9000:更好、更快、更强
目标检测经典论文翻译汇总:[翻译汇总] 翻译pdf文件下载:[下载地址] 此版为纯中文版,中英文对照版请稳步:[YOLOv2中英文对照版] YOLO9000:更好.更快.更强 Joseph Redmo ...
- 更快更稳更优质:华为云CDN下载加速解决方案测评
目录 一.前言 二.下载业务面临的三大难题 1.业务下载缓慢 2.业务稳定性受挑战 3.高昂的运维成本 三.完美解决方案:CDN下载加速 四.为什么选择华为云? 1.快速高效,极致体验 2.稳定可靠, ...
- 更快更稳更安全!天翼云CDN了解一下
近年来,数字化转型正催生各行各业掀起新一轮的信息变革.作为我国经济发展的"血液",金融行业的一举一动都牵动着国民经济的神经.相对于其他行业,金融业务因其"高敏感性.高价值 ...
- 比Momentum更快:揭开Nesterov Accelerated Gradient的真面目NAG 梯度下降
d为累计梯度 作为一个调参狗,每天用着深度学习框架提供的各种优化算法如Momentum.AdaDelta.Adam等,却对其中的原理不甚清楚,这样和一条咸鱼有什么分别!(误)但是我又懒得花太多时间去看 ...
- 使用现场总线更快更远
使用现场总线更快更远 Going faster and further with Fieldbus PROCENTEC等行业专家表示,基于RS-485的现场总线技术(PROFIBUS®)和工业以太网( ...
最新文章
- c# winform 关于给静态全局变量赋值的问题
- char nchar varchar nvarchar varchar2区别
- ASP.NET MVC 3 RTM
- 【机器视觉】 set_fuzzy_measure_norm_pair算子
- 最近任务-2012.05.14
- envi中的sg滤波_ENVI滤波
- [转载]MIT牛人解说数学体系
- java编写一个程序_计算已知长和宽的长方形的周长,请教一下大佬们,我们java留了一个作业,编写程序,定义一个接口Comput,声明计算周长和面积的方法...
- java 中文乱码的解决方法
- sqlserver修改实例名
- 华为u8825d解锁工具_黔隆科技刷机教程VIVOY55L.PD1613忘记密码刷机解锁降级救砖解屏幕锁账户锁教程...
- Atitit 增强代码健壮性 出错继续执行恢复模式,就像vbs那样我以为我可以使用Try/Catch,但是我找不到异常后是否可以继续执行代码,并且找不到如何在最后显示错误消息。目录PHP
- 【代码优化】构造器参数繁多时候,考虑使用builder模式
- 人脸识别技术大起底,你了解多少?
- 论文常用出图软件(Matlab,XMind,Viso,ppt)以及格式选择(eps,svg,tif,png)
- 计算机制图应用领域,计算机制图对测绘工程的应用
- xbox手柄usb连接linux python控制
- 2019奥林匹克计算机竞赛试题,2019-2020年小学数学奥林匹克竞赛试题及答案三年级...
- qt将html加载到资源文件,web页面嵌入到Qt
- Las Vegas 与回溯组合法解八皇后问题
热门文章
- iar升级芯片库_顶10个GPU!阿里巴巴重磅发布含光800芯片
- XamarinAndroid组件教程设置自定义子元素动画(二)
- android handler的机制和原理_一文搞懂handler:彻底明白Android消息机制的原理及源码
- 结构方程模型_简单易懂,结构方程模型思路总结
- python中break可以用在for和if中吗_Python的for和break循环结构中使用else语句的技巧...
- 简单快捷方法:CAJ 文件转 成PDF文件
- 脑电分析系列[MNE-Python-15]| Epochs数据可视化
- [建筑可视化]Evermotion-Archinteriors for UE4
- 虚拟人春节搞事情!先在央视《对话》,又跟李玉刚组团除夕出道
- 2021人工智能年度评选结果揭晓!AI落地最佳参考在此奉上