PHP apache X-sendfile扩展实现文件下载
来源:互联网 发布:医疗网络咨询培训 编辑:程序博客网 时间:2024/06/03 09:26
网站中下载文件是一个经常用到的功能,可是看起来很简单的,做的时候各种问题出现,内心崩溃的有没有。。。
不多说我们进入正题
往往网上答案千篇一律是这样的:
//源文件路径$thefile='test.text';//文件下载$fileinfo = pathinfo($filename);header('Content-type: application/x-'.$fileinfo['extension']);header('Content-Disposition: attachment; filename='.$fileinfo['basename']);header('Content-Length: '.filesize($filename));readfile($thefile);exit();
或是这样的
//源文件路径$thefile='test.text';$filename=$thefile;$file = fopen($filename, "rb");Header( "Content-type: application/octet-stream ");Header( "Accept-Ranges: bytes ");Header( "Content-Disposition: attachment; filename= 4.doc");$contents = "";while (!feof($file)) { $contents .= fread($file, 8192);}fclose($file);
以上下载小文件完全没有问题,但是我要的是下载大文件,大文件,大文件,你就粘贴给我看这个???
于是我放弃了 某度,用了google。
1.首先 打开php.ini 查找 memory_limit 修改 你想占用内存,我服务器内存大所以调的高,看情况调整。
memory_limit = 1024M
好了我们来试试下载大文件
$file = fopen($file_dir,"r"); // 输入文件标签Header("Content-type: application/octet-stream");Header("Accept-Ranges: bytes");Header("Accept-Length: ".filesize($file_dir));Header("Content-Disposition: attachment; filename=" . $attach['name']);// 输出文件内容echo fread($file,filesize($file_dir));fclose($file);exit();
真的能下载几百兆文件了,好开心。但是我的网站怎么打不开了呢?what?什么鬼?你玩我吧?崩溃的边缘
好吧!我看看什么问题!继续google,好吧!问题是
这种方式可以实现文件的下载,但是这种下载方式相当耗资源,长期占用服务端脚本资源和服务器内存资源,消耗很大。
php函数下载文件把php内存占用完了,怎么解决?
当然继续google!万能google又让我看到了希望。
查阅资料,我们可以借助X-sendfile模块来实现更高效率的文件下载。
X-sendfile是现代操作系统支持的一种高性能网络IO方式,服务端脚本程序比如php负责构造请求头信息,然后下载的时候不需要php参与,web服务器直接处理X-Sendfile头信息,并且把响应的文件直接发送给浏览器客户端;这样避免了内存占用。
首先我们要查看Apache的版本信息:phpinfo();
然后下载对应的X-sendfile模块包(下载地址:https://github.com/nmaier/mod_xsendfile)。
linux有更快捷的安装方法:参考地址:http://blogs.isb.bj.edu.cn/miles/2014/02/20/installing-mod_xsendfile-on-centos-6/
yuminstallmod_xsendfile
linux:我的是centos
1.打开如下路劲,里面有个xsendfile.conf(前提是你安装mod成功后)
cd/etc/httpd/conf.modules.d
2.vi打开xsendfile.conf,添加如下两行,保存退出(:wq),重启httpd(systemctl restart httpd)
vi xsendfile.conf
LoadModule xsendfile_module modules/mod_xsendfile.soXSendFile onXSendFilePath /var/www
windows:
1、将解压出来的mod_xsendfile.so文件拷贝到Apache的modules目录下,一定要选择相应的版本24就是2.4,22就是2.2
2、配置Apache的conf目录下的httpd.conf文件,加入以下代码:
LoadModule xsendfile_module modules/mod_xsendfile.soXSendFile onXSendFilePath F:/网站路劲(或你的文件目录)
3、重启Apache服务,重启成功。
这些工作完成之后我们就可以借助X-sendfile来实现文件下载了:
$ua = $_SERVER["HTTP_USER_AGENT"];$filename = $attach['name'];$encoded_filename = urlencode($filename);$encoded_filename = str_replace("+", "%20", $encoded_filename);// 输入文件标签$realpath = realpath($file_dir);header('Content-Type: application/octet-stream');//处理中文文件名,避免文件名乱码$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: $realpath");exit();
好激动赶紧试试,下载大文件没问题,网站可以正常访问,要的就是这效果,嘎嘎嘎。
吐槽一下:某度很多都是复制粘贴一个字不多一个字不少,一毛一样,关键是他还没试过这代码有没有用,我真不知道这有什么意思
- PHP apache X-sendfile扩展实现文件下载
- PHP X-sendfile实现文件下载
- php以不同名字下载同一个文件(x-sendfile)
- php nginx用x-sendfile控制文件下载权限
- Apache,Nginx,Lighttpd分别使用X-sendfile功能提升文件下载性能
- Apache,Nginx,Lighttpd分别使用X-sendfile功能提升文件下载性能
- Apache 的 X-sendfile
- 使用 Nginx 的 X-Sendfile 机制提升 PHP 文件下载性能
- 使用Nginx的X-Sendfile机制提升PHP文件下载性能
- Yii sendFile文件下载设置
- Apache Solr php pecl扩展solr for 4.x下载地址
- 转:RoR网站如何利用lighttpd的X-sendfile功能提升文件下载性能
- RoR网站如何利用lighttpd的X-sendfile功能提升文件下载性能
- 使用 Nginx 的 X-Sendfile 机制控制文件访问权限(php版)
- PHP实现文件下载
- PHP实现文件下载
- PHP实现文件下载
- PHP实现文件下载
- Linux使用nfs映射远程服务器磁盘目录
- Python目录下中没有Script文件夹
- cos中的文件结构(DF/EF/MF/FID/AID/SFI..)
- Win7技巧
- 用CSS固定DIV层在页面顶部和底部(兼容IE6)
- PHP apache X-sendfile扩展实现文件下载
- 次表面反射二
- SpringMVC史上最全最强详细示例实战教程
- 关于javascript的匿名函数
- BZOJ 4013: [HNOI2015]实验比较
- PHP性能分析,测试
- 关于安卓开发的一些tips(持续更新)
- 阿里云Centos 7.5安装Mysql(命令行)
- 如何区别指针数组和数组指针?