底线:
我是否需要关注设置 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
通过这些配置,我希望能够:
这种经历会让我说“通常memory_limit应该大于 upload_max_filesize
”;相反,php docs说:
一般来说,memory_limit应该大于
post_max_size
。
如果不是,为什么会发生什么?
当我的PHP代码被执行时,我看不到所有发布的文件都在内存中的证据。在我看来,我所拥有的只是一个$ _FILES路径,这些路径只能在磁盘上找到文件。在我能够反省环境之前,php是否会在内存中保留整个帖子?我是否需要关注设置 post_max_filesize
>> memory_limit
的
除了
违反手册的规则不会导致严重损坏的服务器(w / php5.3 apache2.2 debian 6)。
答案 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>> 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超过允许的最大文件大小。