让php提供更快的文件下载代码
复制代码代码如下所示:
< PHP
文件;
标题(内容类型:应用程序/字节流);
头('content-disposition:附件文件名=。basename(文件)。);
标题(内容长度:。文件大小(文件));
ReadFile(文件);
但问题是,如果文件是中文名,有些用户可以下载文件的名称是一个随机代码。
因此,我们做出改变(参考)::
复制代码代码如下所示:
< PHP
文件;
为文件名= basename(文件);
标题(内容类型:应用程序/字节流);
文件名中文/治疗
UA _server美元美元{ =http_user_agent};
encoded_filename美元= urlencode($文件名);
encoded_filename美元= str_replace(+
如果(preg_match( / / MSIE
头('content-disposition:附件文件名=。encoded_filename美元。);
} else if(preg_match( / / 火狐
标题(内容配置:依恋;文件名=utf8。文件名;
{人}
头('content-disposition:附件文件名=。文件名;
}
头('content-disposition:附件文件名=。文件名;
标题(内容长度:。文件大小(文件));
ReadFile(文件);
好了,现在看起来好多了,但是有一个问题,那就是ReadFile,而PHP ReadFile来实现高效,不占用内存,但它仍然需要使用mmap(如果支持的话),或固定循环缓冲区直接读取文件的输出。
如果输出是Apache + PHP mod mod,它也需要发送到Apache的输出缓冲区。最后,它将被发送给用户。Nginx + FPM,如果他们单独部署,它会带来额外的网络IO ..
那么,你能直接将文件直接引导到用户,而不必经过PHP层吗
今天,我看到了一篇有趣的文章:我x-sendfile PHP。
我们可以使用Apache的模块mod_xsendfile让Apache发送此文件,直接向用户:
复制代码代码如下所示:
< PHP
文件;
为文件名= basename(文件);
标题(内容类型:应用程序/字节流);
文件名中文/治疗
UA _server美元美元{ =http_user_agent};
encoded_filename美元= urlencode($文件名);
encoded_filename美元= str_replace(+
如果(preg_match( / / MSIE
头('content-disposition:附件文件名=。encoded_filename美元。);
} else if(preg_match( / / 火狐
标题(内容配置:依恋;文件名=utf8。文件名;
{人}
头('content-disposition:附件文件名=。文件名;
}
头('content-disposition:附件文件名=。basename(文件)。);
/ /让xsendfile发送文件
标题(x-sendfile:文件);
的x-sendfile头将由Apache处理和发送响应文件直接给客户。
Lighttpd和Nginx有相似的模块,和人们在寻找感兴趣的。