今天说一说 PHP 里上传文件大小的限制
废话
起因是 pandownload 作者被抓,作为韭菜的我准备放弃百度网盘,但是国内的网盘找不到让我满意的,不是限制这个就是限制那个,所以我就打算自己开发一个网盘……这会是一个系列,直到我彻底放弃对各种网盘的依赖。
我对网盘的定义:
- 有互联网就可以访问。
- 可以上传下载资源。
先给一张效果图:
这是用 layuimini 为基础开发的后台界面,我初步实现了批量上传、下载(以及其他边角功能,不然怎么来的这个界面)。
下载不用多说,给链接就能下载(滑稽)。上传的话最常见的问题就是文件大小的限制。
上传限制
上传限制主要来源于:PHP、Nginx(或 Apache)的配置、内存限制等,如果上传时报 500,代码又没有错的情况下,通常就是大小限制的问题了。
记得修改配置要重启对应软件~
PHP
打开 php.ini。Centos 默认路径为 /etc/php.ini
。
upload_max_filesize
:上传的文件的最大限制,默认 2M。memory_limit
:一个脚本所能够申请到的最大内存字节数,默认值 8M。如果不需要任何内存上的限制,必须将其设为 -1。这个配置会影响系统的性能,一般设置为系统总内存的四分之一。post_max_size
:POST 数据所允许的最大限制,这个值必须大于等于upload_max_filesize
,因为发送 POST 请求时除了文件还会带别的数据。max_execution_time
:超时时间,默认 30 秒,即如果文件太大,上传时间超过 30 秒,PHP 脚本会主动断掉,可以设置为 0,让脚本永远不过时,但可能还是会挂掉,这就是另一个话题了:如何上传大文件。max_input_time
:以秒为单位对通过 POST、GET 以及 PUT 方式接收数据时间进行限制。
主要是前三个,毕竟 2M 对于现在的文件需求来说实在太小了。
Nginx
Centos 下路径一般为 /etc/nginx/conf.d
。
client_max_body_size
:在http{ ... }
之间加入client_max_body_size 35m
来修改上传限制,默认是 8M。
Apache
Apache 主要出现在虚拟主机或者本地测试,Centos 上路径不晓得 :)。
在 httpd.conf 中找到如下配置:
FcgidMaxRequestLen
:Apache 使用 fcgid 模块时对上传文件的限制,1M 写成 1048576(即:1024 * 1024)。
多少才是合适的?
世界上所有的事情都有个度,如果妄想设置了 PHP 不超时,就不会超时,那是不可能的,凡事都要按照实际情况来看,需要考虑的点有:
- 服务器内存。对于 PHP 来说,上传一个文件相当于把整个文件加载到内存里,如果服务器内存只有 1G,那配置多少都是不可能上传 1G 的文件的,何况 1G 内存不可能只用来上传。
- 由于内存限制,对于大文件就不可能通过配置来解决上传问题,这就必须考虑“分段上传”的技术(但这不是现在讨论的点)。一般来说,如果需要测试代码或者对文件大小要求不高,那设置个一两百兆还是可以接受的。