`

PHP更快的提供文件下载的方法

    博客分类:
  • 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 = urlencode($filename);

  $encoded_filename = str_replace("+", "%20", $encoded_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-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 = urlencode($filename);

  $encoded_filename = str_replace("+", "%20", $encoded_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-Disposition: attachment; filename="' . basename($file) . '"');

  //让Xsendfile发送文件

  header("X-Sendfile: $file");

1
4
分享到:
评论

相关推荐

    phpword.zip

    `\PhpOffice\PhpWord\IOFactory`类提供了读写文件的方法,如`load()`用于加载文档,`save()`用于保存文档。 5. **导出格式**:除了默认的.docx格式,PHPWord还支持导出为PDF、HTML、ODT等多种格式,满足不同场景的...

    php快速删除目录及目录中的文件,比ftp还要快[修改版].

    虽然FTP提供了一种删除文件和目录的方法,但它的速度受到网络延迟和带宽限制的影响,因此在本地或服务器内部操作时,使用PHP可能确实更快。 至于标签中的"快乐王子",这可能是指一个编程挑战或者项目代号,与实际的...

    PHP版ip数据库,比sql更好,更快

    标题提到的"PHP版ip数据库,比sql更好,更快",这可能是指一个特定的PHP库或工具,用于快速地查询和处理IP地址信息,而且它声称比传统的SQL数据库在某些方面表现更优。 首先,我们来理解IP数据库。IP数据库通常包含...

    phpstudy php5.2.17nts 下载

    2. 解压下载的压缩包,通常会有一个名为“php5.2.17nts”的文件,这便是我们要使用的PHP解释器。 3. 进入PHPStudy的配置界面,选择添加新的PHP版本,指向解压后的PHP目录。 4. 配置环境变量,确保系统能够识别PHP...

    PHP WEB文件管理源码

    此外,提供的文件如"源码下载.txt"可能包含获取和安装源码的说明,而".txt"和".url"文件可能是文档链接或教程资源,帮助用户更好地理解和使用该源码。"Explore"可能是一个用于探索系统结构或功能的目录,包含更多源...

    php基础-快速入门文档php

    1. **安装 Apache 服务器**:提供 Web 服务,支持 PHP 文件的解析。 2. **安装 PHP**:处理并解释 PHP 代码。 3. **安装 MySQL**:存储和管理应用数据。 **具体操作**: - 下载 PHP:[PHP 官方网站]...

    中文php文档for Dash (Mac)

    3. **文件操作**: 包括文件的读写、上传下载、目录管理等相关函数和方法。 4. **网络编程**: 如HTTP协议的使用,发送HTTP请求,处理cookies和session。 5. **数据库交互**: 介绍如何使用PHP连接和操作各种数据库,...

    Dash版PHP中文离线文档

    这份"Dash版PHP中文离线文档"为开发者提供了一种方便、快捷的方式来查阅PHP的相关知识,无需网络连接即可在Dash这款优秀的文档阅读工具中使用。 Dash是一款功能强大的代码片段管理和文档查看工具,适用于Mac操作...

    PHP文档规范及phpDoc指南-共享版

    通过提供源代码目录,可以生成该目录下所有PHP文件的文档。这有助于了解整个项目的结构和组件。 3.3 生成指定文件的文档 如果只需要针对单个文件生成文档,可以在命令中指定该文件的路径。 3.4 指定文档标题 通过`...

    php建站源码免费下载

    在提供的文件列表中,`说明_Readme.html`通常包含有关源码的详细信息,如安装指南、使用方法和注意事项。`EPWebV1.02`可能是PHP建站源码的一个具体版本,它可能是一个完整的网站系统,包括用户管理、内容发布、评论...

    php 5.6版本下载

    1. **性能提升**:PHP 5.6在性能上相对于之前的版本有所优化,能够更快地处理代码,提高网站的响应速度,为用户提供更好的体验。 2. **新功能引入**:PHP 5.6引入了`finally`语句,这使得异常处理更加规范和简洁。...

    php多文件上传类.zip

    "php中文网免费下载站.txt" 和 "php中文网下载站.url" 可能是与这个类库相关的文档或链接,提供了更多学习资源和社区支持,对于初学者来说是非常有价值的参考资料。 总的来说,"php多文件上传类.zip" 提供了一个...

    SW下载系统 (PHP文本下载系统)

    SW下载系统是一个基于PHP开发的文本下载平台,其主要功能是提供便捷的文件上传和下载服务,特别适合用于分享各种类型的文本文件。该系统的核心特点是使用PHP语言进行编程,这使得它具有良好的跨平台性和易扩展性。在...

    PHP5中文手册,PHP5中文帮助文档

    在PHP5中,文件和目录操作接口得到了优化,如文件读写、目录遍历、文件上传下载等功能。手册将指导开发者如何安全有效地进行这些操作。 **6. 数据库交互** PHP5支持多种数据库驱动,如MySQLi和PDO,提供了丰富的...

    10天学会PHP之PHP快速入门

    理解类、对象、属性、方法、继承、封装和多态性,将帮助你构建更健壮和可维护的代码。此外,PHP7引入了一些新特性,如Nullable类型、返回类型声明、void返回类型、统一异常处理等,这些都是进阶学习的重要部分。 ...

    让PHP更快的提供文件下载的代码

    于是, 很多时候, 我们采用让PHP来做转发, 为用户提供文件下载. 复制代码 代码如下: &lt;?php $file = “/tmp/dummy.tar.gz”; header(“Content-type: application/octet-stream”); header(‘Content-Disposition:...

    php7.3.8(官网下载).zip

    这些改进使得代码执行速度更快,资源消耗更少,从而提高了整体的Web应用程序性能。7.3版本还引入了对intl_idn_to_ascii函数的Unicode 11支持,增强了对异国字符的支持。 "php7.3.8(官网下载).chm"是官方发布的...

    phpSpreadsheet.zip

    - 使用CSV格式:当只需要文本数据且不需要复杂的格式时,CSV是更快、更节省内存的选择。 **总结** PHPSpreadsheet是PHP开发中的强大工具,用于处理Excel文件。通过理解和应用上述概念,你可以轻松地实现Excel文件...

    基于PHP的快速PHP下载网站管理系统 v1.20.zip

    这个管理系统很可能包含了源代码、数据库结构、配置文件以及可能的文档和示例数据,帮助用户快速搭建和运行一个PHP下载网站。 【标签】"PHP"是这个系统的关键词,PHP(Hypertext Preprocessor)是一种广泛使用的...

Global site tag (gtag.js) - Google Analytics