美文网首页
超大文件下载-PHP

超大文件下载-PHP

作者: 芳君君 | 来源:发表于2018-03-06 21:47 被阅读176次

综述

文件下载一直是PHP的痛,传统的做法是 PHP 读取文件后,通过输出到缓冲区到用户浏览器,这里的弊端显而易见。
首先,PHP-FPM 是堵塞工作的,如果文件比较大,需要耗费一个 PHP 线程处理;
其次,使用 PHP 处理文件下载,非常浪费宝贵的内存空间。
理想的情况下,我们可以采用 云存储 和 CDN 去解决这个问题,但是对于需要验证用户信息的私有文件来说,这里就不适用了。

下面介绍四种方法去解决这个问题

私有文件解决方法:

1、X-Accel:

PHP:
header('Content-type: application/octet-stream');
header('Content-Disposition: attachment; filename="protected.pdf"');
header("X-Accel-Redirect: /protected/protected.pdf");
Nginx:
location /protected/{
      internal;   # 禁止外部访问   
      root   /files/protected;    
}

internal 指令指定某个location只能被“内部的”请求调用,外部的调用请求会返回”Not found” (404)
“内部的”是指下列类型:
• 指令error_page重定向的请求。
• ngx_http_ssi_module模块中使用include virtual指令创建的某些子请求。
• ngx_http_rewrite_module模块中使用rewrite指令修改的请求。

引用:
https://www.nginx.com/resources/wiki/start/topics/examples/x-accel/
https://segmentfault.com/q/1010000002981993

2、Swoole:
上面的方法不是最完美的,因为需要启动一个 PHP 进程来生成 Header,所以,用 swoole 专门处理文件下载这一块,用户验证、下载删除 也很容易做。

3、Nginx-Lua-Redis(大雾):
如果我们不适用 PHP,也是有方法的,下载的连接包含用户的授权token,lua 拿到用户 cookie 的 id 后,查询 reids 的 hash,如果存在token,就放下载,否则返回404.

引用:http://nginx.org/en/docs/http/ngx_http_core_module.html#aio

相关文章

  • 超大文件下载-PHP

    综述 文件下载一直是PHP的痛,传统的做法是 PHP 读取文件后,通过输出到缓冲区到用户浏览器,这里的弊端显而易见...

  • 文件下载

    常见的文件格式: 文件下载HTML 图片文件下载PHP

  • windows下 用nginx部署php项目

    nginx下载地址 php下载 配置PHP 解压后在文件夹中找到php.ini-development文件复制一份...

  • mac下安装composer

    1、下载composer的php文件 2、运行php文件,然后就会自动下载一个composer.phar的文件 3...

  • PHP 通过Nginx x-sendfile实现文件鉴权下载

    通过php鉴权,文件下载由 nginx 实现;比使用php readfile() 高效; 比如下载的文件为: /d...

  • PHP文件下载

    注意事项:1.不能用ajax请求 可以用window.location.href()等传过来 //文件下载 fun...

  • PHP文件下载

    PHP文件下载

  • php文件下载

    今天对照视频做了一个图片下载程序,下载的图片老提示文件过大,或者文件被损坏,用记事本打开源文件跟程序下载的图片发现...

  • IIS 下部署 PHP

    一、先下载PHP 下载MySQL1、安装对应的VC++ 二、配置PHP1、下载包解压缩到 d:/php 文件夹 ...

  • 2018-03-25windows下配置php+composer

    下载php压缩包 解压至特定目录 修改配置文件将php.ini-development文件改为php.ini 添加...

网友评论

      本文标题:超大文件下载-PHP

      本文链接:https://www.haomeiwen.com/subject/vturfftx.html