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

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

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 16
  1. 不吃内存, 是限制文件大小
  2. 如果不写到磁盘, 那么上传 1GB 的文件就占用 1GB 的内存, 那不可接受 鸟哥说的 PHP 文件上传原理: www.laruence.com/2009/09/26/1103.h...

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

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

uploadprogress:pecl    github

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

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

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

1年前 评论

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

了解一下 :min.io/

1年前 评论

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