php的memory_limit,upload_max_filesize和post_max_filesize之间的关系

时间:2011-02-24 15:42:15

标签: php apache configuration file-upload

底线
我是否需要关注设置 post_max_filesize >> memory_limit

详情
This answer表明上传的文件不需要适合php的memory_limit。 php docs表明整个帖子应该符合php的内存限制。

我发现文档令人惊讶,我希望有人可以详细说明。例如,请使用以下php配置:

; config A
memory_limit = 50M
upload_max_filesize = 100M
post_max_filesize = 1000M
max_file_uploads = 10    

; config B
memory_limit = 50M
upload_max_filesize = 10M
post_max_filesize = 1000M
max_file_uploads = 100    

通过这些配置,我希望能够:

  • 将10x100mb文件上传到服务器 A
  • 和100x10mb文件到服务器 B
  • < / ul>我还希望:
    • 使用上传到服务器 A 的10个文件中的任何一个是个问题(50M包中100M的文件......)。
    • 使用上传到服务器 B 的100个文件中的任何一个是可以的(10 <50)。
    尝试使用较少的圆形但等效相关的数字,我发现这些期望是正确的。

    这种经历会让我说“通常memory_limit应该大于 upload_max_filesize ”;相反,php docs说:

      

    一般来说,memory_limit应该大于 post_max_size

    如果不是,为什么会发生什么?

    当我的PHP代码被执行时,我看不到所有发布的文件都在内存中的证据。在我看来,我所拥有的只是一个$ _FILES路径,这些路径只能在磁盘上找到文件。在我能够反省环境之前,php是否会在内存中保留整个帖子?我是否需要关注设置 post_max_filesize &gt;&gt; memory_limit

    除了
    违反手册的规则不会导致严重损坏的服务器(w / php5.3 apache2.2 debian 6)。

3 个答案:

答案 0 :(得分:14)

PHP将接受单独小于upload_max_filesize的上传文件,并且一起占用少于post_max_size个字节。关于memory_limit的PHP文档是错误的,它不需要保存发布的文件内容。

以下配置适用于Apache2模块和CGI,并接受小于1G的文件。

 upload_max_filesize = 1G
 post_max_size = 1G
 memory_limit = 32M

答案 1 :(得分:2)

  

我需要关注吗?   设置post_max_filesize&gt;&gt;   memory_limit的?

只有当您计划将整个文件读入内存并且您读入的文件大于您分配给PHP的空间(即memory_limit)时,在这种情况下您将耗尽内存

答案 2 :(得分:-2)

我个人的经验是你必须拥有一个高于post_max_size和upload_max_size的memory_limit。

post_max_size指的是整个POSTed数据。这包括文件本身可能包含的任何表单字段。 upload_max_size是文件在该上载中可允许的最大大小。

例如。如果post_max_size为10mb,upload_max_size为1mb,你可以上传9个文件,每个文件大小为1mb,为什么有9个文件?因为POST数据的一部分是文件元数据 - 文件名,mimetype,文件大小等...这都占用了一些空间,所以你的9个文件实际上占用了9.01兆字节左右。 0.99剩余的文件对于另一个文件来说太小了,因此即使它符合upload_max_size限制,也无法上传第10个文件。

对于memory_limit,您不仅要为上传的文件留出足够的“空间”,还必须记住此限制适用于整个脚本。一个10mb的memory_limit只允许上传一个9兆字节的文件,因为PHP本身以及所有相关的代码和库都会吸收(比方说)1兆字节。

即使文件没有保存在内存中 - 它们会尽快转储到临时文件中,但它们会通过STDIN从Apache传入PHP。 PHP必须从该流中读取文件并将它们复制到您在$ _FILES数组的['tmp_name']部分中使用的临时文件中。

无论出于何种原因,PHP似乎基本上都在执行“file_get_contents()”并批量处理文件,而不是进行流式复制。因此要求memory_limit超过允许的最大文件大小。