nginx使用XSendfile模块让php更快下载文件实战

php中文网
发布: 2016-06-20 12:29:11
原创
1605人浏览过

nginx使用xsendfile模块让php更快下载文件实战

https://www.markdream.com/technologies/programs/nginx-x-accel-redirect-php-practise.shtml?utm_source=tuicool&utm_medium=referral

引言

最近有点闲暇时间了,[email protected]

让PHP更快的提供文件下载》后,利用实际项目中的业务场景觉得有必须要去优化附件下载功能了。鸟哥的文章里面主要介绍的基于apache来做XSendfile讲解的,我有点强迫症,我对我的生产环境《顶岗实习管理系统》进行升级改造,我的webserver是nginx,所以基于nginx官方网站的 XSendfile

说明特做此改造笔记。

Picsart AI Image Generator
Picsart AI Image Generator

Picsart推出的AI图片生成器

Picsart AI Image Generator 37
查看详情 Picsart AI Image Generator

我的webroot目录在/var/vhost/demo,demo目录中存在一个uploadfiles文件夹,这个文件夹是存放用户上传的文件。比如一个用户上传一个hello.docx文件,那么它对应的物理路径应该是/var/vhost/demo/xsendfile/uploadfiles/hello.docx,如果我们以直接路径“http://demo.markdream.com/xsendfile/uploadfiles/hello.docx”来访问的话,那么我想对这个文件进行下载统计或者隐藏实体路径的话就只能使用php readfile()方法来把文件装载到内存中,在转发给客户端,如果文件超大的话,你的服务器估计很悬。所以我们要改进php下载方式,就是引言所阐述的利用nginx的XSendfile方式来传送文件给客户端,nginx默认已经包含了senfile模块了,你如果安装完nginx你会在nginx.conf文件会看到“sendfile on;”,OK说明你可以直接使用了不像apache那么复杂还要重新加载组件编译等等。好了我贴下我的配置文件和代码。

立即学习PHP免费学习笔记(深入)”;

我的nginx虚拟主机配置文件

server {        listen 80;        server_name demo.markdream.com;        root /var/vhost/demo;        index  index.php;		# 这个是定义读取你的文件的目录的url开头  直接访问是不可以的 只能通过        location /protected {                internal;                alias   /var/vhost/demo/uploadfiles;        }        location ~ \.php$ {           fastcgi_pass   127.0.0.1:9000;           fastcgi_index  index.php;           fastcgi_param  SCRIPT_FILENAME  $document_root/$fastcgi_script_name;           include        fastcgi_params;        }}
登录后复制

一个简单的php下载文件脚本,downloads.php

<?php//eg: http://demo.markdream.com/xsendfile/downloads.php?filename=hello.docx// 获取文件名$filename = $_GET["filename"];// 你可以在这里写下你的查询数据库等你所想的功能 ……header ( "Content-type: application/octet-stream" );// 处理中文文件名$ua = $_SERVER ["HTTP_USER_AGENT"];if (preg_match ( "/MSIE/", $ua )) { $encoded_filename = rawurlencode ( $filename ); 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 . '"' );}// 就这么简单一句话搞定 注意“protected”是和nginx配置文件的 protected要一致header("X-Accel-Redirect: /protected/" . $filename);?>
登录后复制

愉悦的demo

http://demo.markdream.com/xsendfile/downloads.php?filename=hello.docx

参考

  1. http://wiki.nginx.org/XSendfile
  2. http://www.laruence.com/2012/05/02/2613.html
  3. http://kovyrin.net/2006/11/01/nginx-x-accel-redirect-php-rails/

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号