如何设计一个性能好的文件上传服务器?

存储桶用习惯了好像还真没考虑过这个问题,
其实对php的文件上传一直以来都有很多疑问,为啥设置上传大小的时候要设置php内存的限制,难道每个上传的文件都必须要吃满自身大小的服务器内存?如果是这样的话,并发一高,服务器内存不就直接满了?
另外,为啥要先由服务器缓存到一个目录,再由move_uploaded_file移动到自己需要上传的目录,这样的话,如果上传文件很大,这个过程又会很费时,为啥不能一步到位的把文件上传到自己要的目录呢?
还有一点,如果在上传的时候需要验证的话,我们好像也必须要等到上传文件到服务器的缓存目录后,再进行判断,就不能直接在文件头里判断,然后如果不对的话就终止文件的上传么?

《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 16
  1. 不吃内存, 是限制文件大小
  2. 如果不写到磁盘, 那么上传 1GB 的文件就占用 1GB 的内存, 那不可接受 鸟哥说的 PHP 文件上传原理: www.laruence.com/2009/09/26/1103.h...

理论上上传文件, 无非就是解析请求头, 然后开始读取 body, 这个 body 怎么读就是关键. , php-fpm 直接把文件写入到文件, 让 PHP 开发者易用, 这块确实有"问题", 多了一次读写文件. 增加易用性 理论上你直接读取上传的的文件, 必定消耗这么大的内存. Go 看着用流去切片读取. 待我研究一下.

2年前 评论
poker_face (楼主) 2年前
seth-shi (作者) 2年前
seth-shi (作者) 2年前
poker_face (楼主) 2年前
poker_face (楼主) 2年前
seth-shi (作者) 2年前
seth-shi (作者) 2年前
  1. 文件是存硬盘,不是存内存,所以限制上传文件大小和限制php内存是两回事,没有直接联系
  2. move_uploaded_file只要不跨盘符,那就只是改个标记,很快的,你可以试试从你D盘剪切粘贴一个大文件到D盘的另一个目录
  3. 有一个叫uploadprogress的扩展能满足你的需求

uploadprogress:pecl    github

2年前 评论
poker_face (楼主) 2年前
renxiaotu (作者) 2年前
poker_face (楼主) 2年前
renxiaotu (作者) 2年前
renxiaotu (作者) 2年前

如果使用服务器存储,可以使用分片上传,上传完成后服务器统一文件流操作合并成一个文件,这样文件不用全部一次性读进内存。

如果使用云存储,可以配合现在第三方存储自带的文件上传,后台服务器PHP只是配合做一些上传令牌鉴权之类。

2年前 评论

MinIO - 多云对象存储 ,提供高性能、兼容 S3 的对象存储。

了解一下 :min.io/

2年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!