【网盘那点事】文件上传大小限制

icy2003 程序 2020-04-19 23:44:00 150 0条

今天说一说 PHP 里上传文件大小的限制

废话

起因是 pandownload 作者被抓,作为韭菜的我准备放弃百度网盘,但是国内的网盘找不到让我满意的,不是限制这个就是限制那个,所以我就打算自己开发一个网盘……这会是一个系列,直到我彻底放弃对各种网盘的依赖。

我对网盘的定义:

  1. 有互联网就可以访问。
  2. 可以上传下载资源。

先给一张效果图:

92523-pxrvf2hewda.png

这是用 layuimini 为基础开发的后台界面,我初步实现了批量上传、下载(以及其他边角功能,不然怎么来的这个界面)。

下载不用多说,给链接就能下载(滑稽)。上传的话最常见的问题就是文件大小的限制。

上传限制

上传限制主要来源于:PHP、Nginx(或 Apache)的配置、内存限制等,如果上传时报 500,代码又没有错的情况下,通常就是大小限制的问题了。

记得修改配置要重启对应软件~

PHP

打开 php.ini。Centos 默认路径为 /etc/php.ini

  1. upload_max_filesize:上传的文件的最大限制,默认 2M。
  2. memory_limit:一个脚本所能够申请到的最大内存字节数,默认值 8M。如果不需要任何内存上的限制,必须将其设为 -1。这个配置会影响系统的性能,一般设置为系统总内存的四分之一。
  3. post_max_size:POST 数据所允许的最大限制,这个值必须大于等于 upload_max_filesize,因为发送 POST 请求时除了文件还会带别的数据。
  4. max_execution_time:超时时间,默认 30 秒,即如果文件太大,上传时间超过 30 秒,PHP 脚本会主动断掉,可以设置为 0,让脚本永远不过时,但可能还是会挂掉,这就是另一个话题了:如何上传大文件。
  5. max_input_time:以秒为单位对通过 POST、GET 以及 PUT 方式接收数据时间进行限制。

主要是前三个,毕竟 2M 对于现在的文件需求来说实在太小了。

Nginx

Centos 下路径一般为 /etc/nginx/conf.d

  1. client_max_body_size:在 http{ ... } 之间加入 client_max_body_size 35m 来修改上传限制,默认是 8M。

Apache

Apache 主要出现在虚拟主机或者本地测试,Centos 上路径不晓得 :)。

在 httpd.conf 中找到如下配置:

  1. FcgidMaxRequestLen:Apache 使用 fcgid 模块时对上传文件的限制,1M 写成 1048576(即:1024 * 1024)。

多少才是合适的?

世界上所有的事情都有个度,如果妄想设置了 PHP 不超时,就不会超时,那是不可能的,凡事都要按照实际情况来看,需要考虑的点有:

  1. 服务器内存。对于 PHP 来说,上传一个文件相当于把整个文件加载到内存里,如果服务器内存只有 1G,那配置多少都是不可能上传 1G 的文件的,何况 1G 内存不可能只用来上传。
  2. 由于内存限制,对于大文件就不可能通过配置来解决上传问题,这就必须考虑“分段上传”的技术(但这不是现在讨论的点)。一般来说,如果需要测试代码或者对文件大小要求不高,那设置个一两百兆还是可以接受的。
标签: php, nginx

非特殊说明,本博所有文章均为博主原创。