[原]PHP服务器端上传参数限制

1.首先我们先看最常见的配置选项,php.ini 中的配置

upload_max_filesize “2M” PHP_INI_PERDIR 在 PHP <= 4.2.3 时是 PHP_INI_ALL。 

post_max_size “8M” PHP_INI_PERDIR 在 PHP <= 4.2.3 时是PHP_INI_SYSTEM。从 PHP 4.0.3 起可用。

upload_max_filesize 配置的是 上传的文件的大小限制 默认值2M.

post_max_size 配置的是 post的请求做提交的内容的最大限制,默认值8M

这也就是我们最常见的想要上传更大的文件需要修改的配置参数。post_max_size 理论上应该比 upload_max_filesize 大,因为文件上传包含在post请求当中。

2.关于.htaccess文件中的配置选项

php_value upload_max_filesize 50M  #上传文件大小限制 默认 2M

php_value post_max_size 100M         #POST 提交数据的大小限制 默认8M

.htaccess 文件配置生效的前提条件是 该站点的虚拟主机中 配置了:AllowOverride All

3.关于HTML tag中对上传文件的大小限制:

<input type=”hidden” name=”MAX_FILE_SIZE” value=”100″ />

该参数由PHP提出,希望对于设置了该参数的表单,浏览器能够对用户选择的文件进行判断,如果超过大小直接返回$_FILES[‘error’] =2错误信息,从而避免了讲一个大文件上传完成之后才知道大小超过了。

但是,理想很美好,现实很骨感。该提议并没有被主流浏览器IE和Firefox所接受和应用,所以配置这个参数仍然是无效的。

刚刚说到了$_FILE[‘userfile’][‘error’] 的错误代码,我们就记录一下吧:

0——没有错误发生,文件上传成功。  

1——上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值。  

2——上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值。  

3——文件只有部分被上传。  

4——没有文件被上传。

这些就是最常用的了,一般来说就够用了了。

尽管说了这么多,但是实际应用中 还是会遇到不少困惑的地方,让你百思才能得解。

例如:

如果文件大小超过 upload_max_filesize 配置的大小后,会返回$_FILE[‘userfile’][‘error’] = 1的错误信息,这根据上面说的可以很清楚的知道。

但是!当文件大小超过 post_max_size 的时候会怎样呢?$_FILE[‘userfile’][‘error’] 会返回什么呢?

当然猜是猜不出来的,动手测试吧。

结果是:

    如果超出或者接近post_max_size的值,$_FILES 会被直接清空,就好像根本没有提交文件似的,根本没有错误信息。而且access.log 访问记录中会有正常的POST 记录,也不会产生错误日志。这时候好多人头都大了。上传不上去没关系,给句错误提示,我改。。现实还是残酷的。

    同样的情况 也发生在超出 memory_limit 的限制的时候 。

    memory_limit 也可以在PHP程序中 使用  ini_set(‘memory_limit’,’1024M’);  来更改内存限制。

    另外:PHP 默认的脚本运行时间是30秒,对于大文件来说 这个时间是不够的,随意脚本运行时间也要相应的调大   ini_set(‘max_execution_time’,’10’);  //0 是不限制时间 或者 set_time_limit(0);

因此综上我们应该得到一个配置php.ini 的大小限制的比较好的方案是:

memory_limit > post_max_size > upload_max_filesize

但是:

post_max_size  超过2G的话 会有一定的问题。关于这个问题在这个文章中有一些描述:http://www.cnblogs.com/xcp19870712/archive/2012/12/06/2805217.html