一般来说, 我们可以通过直接让URL指向一个位于Document Root下面的文件, 来引导用户下载文件.

但是, 这样做, 就没办法做一些统计, 权限检查, 等等的工作.  于是,  很多时候,  我们采用让PHP来做转发, 为用户提供文件下载.

  1. <?php
  2. $file = "/tmp/dummy.tar.gz";
  3. header("Content-type: application/octet-stream");
  4. header('Content-Disposition: attachment; filename="' . basename($file) . '"');
  5. header("Content-Length: ". filesize($file));
  6. readfile($file);

但是这个有一个问题, 就是如果文件是中文名的话, 有的用户可能下载后的文件名是乱码.

于是, 我们做一下修改(参考: :

  1. <?php
  2. $file = "/tmp/中文名.tar.gz";
  3. $filename = basename($file);
  4. header("Content-type: application/octet-stream");
  5. //处理中文文件名
  6. $ua = $_SERVER["HTTP_USER_AGENT"];
  7. $encoded_filename = rawurlencode($filename);
  8. if (preg_match("/MSIE/", $ua)) {
  9. header('Content-Disposition: attachment; filename="' . $encoded_filename . '"');
  10. } else if (preg_match("/Firefox/", $ua)) {
  11. header("Content-Disposition: attachment; filename*=\"utf8''" . $filename . '"');
  12. } else {
  13. header('Content-Disposition: attachment; filename="' . $filename . '"');
  14. }
  15. header("Content-Length: ". filesize($file));
  16. 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直接发送这个文件给用户:

  1. <?php
  2. $file = "/tmp/中文名.tar.gz";
  3. $filename = basename($file);
  4. header("Content-type: application/octet-stream");
  5. //处理中文文件名
  6. $ua = $_SERVER["HTTP_USER_AGENT"];
  7. $encoded_filename = rawurlencode($filename);
  8. if (preg_match("/MSIE/", $ua)) {
  9. header('Content-Disposition: attachment; filename="' . $encoded_filename . '"');
  10. } else if (preg_match("/Firefox/", $ua)) {
  11. header("Content-Disposition: attachment; filename*=\"utf8''" . $filename . '"');
  12. } else {
  13. header('Content-Disposition: attachment; filename="' . $filename . '"');
  14. }
  15. //让Xsendfile发送文件
  16. 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更快的提供文件下载 【转】相关推荐

  1. 让PHP更快的提供文件下载

    为什么80%的码农都做不了架构师?>>>    转载于:https://my.oschina.net/fsmwhx/blog/110825

  2. 如何为我们的应用程序提供一个更小、更快的视频通话库

    正文字数:2848  阅读时长:4分钟 在研究如何使视频通话在未来更高效,更易于扩展时,Facebook意识到,最好的方法是从头开始重新设计库并重写整个库,也就是Rsys. 作者 / Ishan Kh ...

  3. 与阿里云整个生态体系共同成长,更快更好的为房地产行业客户提供高价值的服务。...

    免费开通大数据服务:https://www.aliyun.com/product/odps "最早是新业务要做,但是买服务器来不及,管理员没到位,而且新业务的成本很高,是否能成功也是未知,因 ...

  4. 与阿里云整个生态体系共同成长,更快更好的为房地产行业客户提供高价值的服务。

    免费开通大数据服务:https://www.aliyun.com/product/odpsyu "最早是新业务要做,但是买服务器来不及,管理员没到位,而且新业务的成本很高,是否能成功也是未知 ...

  5. 目标检测经典论文——YOLOv2论文翻译(纯中文版):YOLO9000:更好、更快、更强

    目标检测经典论文翻译汇总:[翻译汇总] 翻译pdf文件下载:[下载地址] 此版为纯中文版,中英文对照版请稳步:[YOLOv2中英文对照版] YOLO9000:更好.更快.更强 Joseph Redmo ...

  6. 更快更稳更优质:华为云CDN下载加速解决方案测评

    目录 一.前言 二.下载业务面临的三大难题 1.业务下载缓慢 2.业务稳定性受挑战 3.高昂的运维成本 三.完美解决方案:CDN下载加速 四.为什么选择华为云? 1.快速高效,极致体验 2.稳定可靠, ...

  7. 更快更稳更安全!天翼云CDN了解一下

    近年来,数字化转型正催生各行各业掀起新一轮的信息变革.作为我国经济发展的"血液",金融行业的一举一动都牵动着国民经济的神经.相对于其他行业,金融业务因其"高敏感性.高价值 ...

  8. 比Momentum更快:揭开Nesterov Accelerated Gradient的真面目NAG 梯度下降

    d为累计梯度 作为一个调参狗,每天用着深度学习框架提供的各种优化算法如Momentum.AdaDelta.Adam等,却对其中的原理不甚清楚,这样和一条咸鱼有什么分别!(误)但是我又懒得花太多时间去看 ...

  9. 使用现场总线更快更远

    使用现场总线更快更远 Going faster and further with Fieldbus PROCENTEC等行业专家表示,基于RS-485的现场总线技术(PROFIBUS®)和工业以太网( ...

最新文章

  1. c# winform 关于给静态全局变量赋值的问题
  2. char nchar varchar nvarchar varchar2区别
  3. ASP.NET MVC 3 RTM
  4. 【机器视觉】 set_fuzzy_measure_norm_pair算子
  5. 最近任务-2012.05.14
  6. envi中的sg滤波_ENVI滤波
  7. [转载]MIT牛人解说数学体系
  8. java编写一个程序_计算已知长和宽的长方形的周长,请教一下大佬们,我们java留了一个作业,编写程序,定义一个接口Comput,声明计算周长和面积的方法...
  9. java 中文乱码的解决方法
  10. sqlserver修改实例名
  11. 华为u8825d解锁工具_黔隆科技刷机教程VIVOY55L.PD1613忘记密码刷机解锁降级救砖解屏幕锁账户锁教程...
  12. Atitit 增强代码健壮性 出错继续执行恢复模式,就像vbs那样我以为我可以使用Try/Catch,但是我找不到异常后是否可以继续执行代码,并且找不到如何在最后显示错误消息。目录PHP
  13. 【代码优化】构造器参数繁多时候,考虑使用builder模式
  14. 人脸识别技术大起底,你了解多少?
  15. 论文常用出图软件(Matlab,XMind,Viso,ppt)以及格式选择(eps,svg,tif,png)
  16. 计算机制图应用领域,计算机制图对测绘工程的应用
  17. xbox手柄usb连接linux python控制
  18. 2019奥林匹克计算机竞赛试题,2019-2020年小学数学奥林匹克竞赛试题及答案三年级...
  19. qt将html加载到资源文件,web页面嵌入到Qt
  20. Las Vegas 与回溯组合法解八皇后问题

热门文章

  1. iar升级芯片库_顶10个GPU!阿里巴巴重磅发布含光800芯片
  2. XamarinAndroid组件教程设置自定义子元素动画(二)
  3. android handler的机制和原理_一文搞懂handler:彻底明白Android消息机制的原理及源码
  4. 结构方程模型_简单易懂,结构方程模型思路总结
  5. python中break可以用在for和if中吗_Python的for和break循环结构中使用else语句的技巧...
  6. 简单快捷方法:CAJ 文件转 成PDF文件
  7. 脑电分析系列[MNE-Python-15]| Epochs数据可视化
  8. [建筑可视化]Evermotion-Archinteriors for UE4
  9. 虚拟人春节搞事情!先在央视《对话》,又跟李玉刚组团除夕出道
  10. 2021人工智能年度评选结果揭晓!AI落地最佳参考在此奉上