知识大全 让PHP更快的为用户提供文件下载

Posted 文件

篇首语:峥嵘过去已经彪炳史册,璀璨当下正在不断延伸,光明未来需要踏实开拓。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 让PHP更快的为用户提供文件下载相关的知识,希望对你有一定的参考价值。

让PHP更快的为用户提供文件下载  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

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

   但是 这样做 就没办法做一些统计 权限检查 等等的工作 于是 很多时候 我们采用让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)

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

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

   $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(“+” “% ” $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*=”utf “ $filename ” )

   else

   header( Content Disposition attachment filename=“ $filename ” )

  

   header( Content Disposition attachment filename=“ $filename ” )

   header(“Content Length “ filesize($file))

   readfile($file)

   输出的时候 如果是Apache + PHP mod 那么还需要发送到Apache的输出缓冲区 最后才发送给用户 而对于Nginx + fpm如果他们分开部署的话 那还会带来额外的网络IO

   恩 现在看起来好多了 不过还有一个问题 那就是readfile 虽然PHP的readfile尝试实现的尽量高效 不占用PHP本身的内存 但是实际上它还是需要采用MMAP(如果支持) 或者是一个固定的buffer去循环读取文件 直接输出

    那么 能不能不经过PHP这层 直接让Webserver直接把文件发送给用户呢?

   今天 我看到了一个有意思的文章 How I PHP X SendFile

   我们可以使用Apache的module mod_xsendfile 让Apache直接发送这个文件给用户

   $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(“+” “% ” $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*=”utf “ $filename ” )

   else

   header( Content Disposition attachment filename=“ $filename ” )

  

   header( Content Disposition attachment filename=“ basename($file) ” )

   //让Xsendfile发送文件

   header(“X Sendfile $file”)

cha138/Article/program/PHP/201311/21065

相关参考

知识大全 php ajax用户注册检测代码

  实只要简单的实现ajax的检测用户名正规点要分三个文件我这里简单点:  第一个indexphp<!DOCTYPEPUBLIC"//WC//DTDXHTMLTransitional//EN""

知识大全 把网页生成word文档并提供下载

  在php中如何把中的内容生成到word文档中  php把中的内容生成到word文档中时不居中显示问题即会默认按照web视图进行显示  php把中的内容生成到word文档中时相关样式不兼容问题  正

知识大全 使用PHP会话(Session)实现用户登陆功能

使用PHP会话(Session)实现用户登陆功能  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!&n

知识大全 PHP取得用户浏览器和系统函数

PHP取得用户浏览器和系统函数  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  //操作系统fun

知识大全 如何打开PHP文件,PHP文件怎么打开

如何打开PHP文件,PHP文件怎么打开?  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  “php

开立专用户要提供的资料有哪些?

营业执照正本、开户证明、组织机构代码证、税务登记证正本、企业法人身份证、开户许可证、专款专用的文件、授权书等。

文件服务器程序是专为提供网络服务的网络管理软件,它的作用是()

文件服务器程序是专为提供网络服务的网络管理软件,它的作用是()A、直接与网络服务器硬盘和网卡驱动程序连接。B、为本地的应用提供各类网络服务。C、对用户访问服务器的权限和数据加密进行管理。D、对多个用户

文件服务器程序是专为提供网络服务的网络管理软件,它的作用是()

文件服务器程序是专为提供网络服务的网络管理软件,它的作用是()A、直接与网络服务器硬盘和网卡驱动程序连接。B、为本地的应用提供各类网络服务。C、对用户访问服务器的权限和数据加密进行管理。D、对多个用户

知识大全 PHP文件下载的原理及实现

PHP典型模块与项目实战大全:PHP文件下载的原理及实现  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下

知识大全 新浪微博API开发简介之PHP基础篇-用户授权

新浪微博API开发简介之PHP基础篇-用户授权  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  现