在用PHP进行文件上传的操做中,须要知道怎么控制上传文件大小的设置,而文件可传大小是受到多种因素制约的,现总结以下: php
一、php.ini:upload_max_filesize 所上传的文件的最大大小。默认值2M。
二、php.ini:memory_limit 本 指令设定 了一个脚本所可以申请到的最大内存字节数,默认值8M。若是不须要任何内存上的限制,必须将其设为 -1。若是内存不够,则可能出现错误:Fatal error: Allowed memory size of X bytes exhausted (tried to allocate Y bytes)(通常导入数据库时,若是数据库太大,就会报错,改这个就能够)
三、php.ini:post_max_size 设定POST数据所容许的最大大小。此设定也影响到文件上传。要上传大文件,该值必须大于 upload_max_filesize。
四、php.ini:max_execution_time = 30 ; Maximum execution time of each script, in seconds
五、php.ini:max_input_time = 60 ; Maximum amount of time each script may spend parsing request data
六、若是用到mysql的BLOB进行二进制文件存储,则须要设置my.ini:max_allowed_packet=xxM
七、httpd.conf
在 Apache 里面有一个选项是 LimitRequestBody, 这个选项能够限制用户送出的 HTTP 请求内容。这个选项能够在 .htaccess 或 httpd.conf 里使用,而若是在 httpd.conf 内使用,分别能够用在 virtualhost 或目录属性设定。而 LimitRequestBody 的设定值是介乎 0 (无限制) 至 2147483647 (2GB)。
例如要在目录 D:/AppServ/www 设定上传限制为 100K,能够在 .htaccess 或 httpd.conf 加入如下语句: html
若是透过 .htaccess 设定,储存档案后会当即生效;如透过 httpd.conf 设定,需要从新启动 Apache。 mysql
PHP关于文件上传部分,特别提到表单隐藏域:MAX_FILE_SIZE,意思是接收文件的最大尺寸。文档中给出的例子以下: sql
这的确是一个很是棒的主张,但在现实中却暂时没法实现。不是由于这个限制能够“被简单地绕过”,而是IE和FireFox这两个主流浏览器都不支持这个特性。PHP的这个建议还没有被采纳。
MAX_FILE_SIZE还有一个用场:后台PHP会判断接收到的文件大小是否大于这个值,若是超出,$_FILES['thisfile'] ['error']会被设置为UPLOAD_ERR_FORM_SIZE(2),同时放弃保存临时文件,将$_FILES['thisfile'] ['size']置0。
这个例子,没问题,表现正常,当我试图上传一个40多K的文件时,PHP程序报告“文件超过MAX_FILE_SIZE”。
可是,若是咱们将表单中的MAX_FILE_SIZE从30000减小到1000,情形又如何呢? 数据库
问题就出在main/rfc1867.c中 判断文件是 否超长的这部分代码上。php每次从buffer中读取FILLUNIT字节长度的内容后,首先判断“已经读到的内容长度(total_bytes)”是 否大于MAX_FILE_SIZE,而后再增长“已经读到的内容长度(total_bytes)”。这样一来,和预计的结果之间至多会有FILLUNIT 字节的偏差,而FILLUNIT=1024*5=5K。(点击bug了解详细内容)
这就是说,当MAX_FILE_SIZE<5K时,上传一个大于MAX_FILE_SIZE,可是小于5K的文件是没有问题的。
固然,由于这个设置很容易被绕过,因此服务器端编程不该当依赖于MAX_FILE_SIZE。并且,5K究竟是个很小的数值,对大多数上传文件的表单来讲没有影响。 编程
PHP中post_max_size,upload_max_filesize, MAX_FILE_SIZE的设置,和客户端上传给服务器端的流量大小无关。
Apache服务器从客户端接收长度不超过LimitRequestBody字节数的请求,而后传送给php模块,php模块再决定是否保存成临时文件,设置$_FILES全局变量,移交给script进一步处理。
这个Apache的LimitRequestBody选项缺省值=0,容许Request body的最大字节数是2G(Linux + Apache) 浏览器