php.ini
据我了解,当使用 Apache 和 PGP 托管 Web 服务器时,其中决定最大上传大小的三个设置是:
memory_limit
post_max_size
upload_max_filesize
正如我所读到的,memory_limit
必须大于post_max_size
并且post_max_size
必须大于upload_max_filesize
。从那里开始,无论如何,最低的,也就是upload_max_filesize
在 Apache 设置中,实际上是上传大小的真正限制。
因此,如果上述内容属实,那么通过运行 Apache 的 PHP 上传到 Web 服务器的真正最大文件大小是否等于设备托管上的物理内存?除了磁盘写入限制之外,即 NTFS 如何将文件大小限制为每个文件 4GB?
我之所以问这个问题,是因为我的post_max_size
和upload_max_filesize
都设置为 4096M,但上传略小于 1GB 的文件没有问题,而上传超过 1GB 的文件则没有问题。那么,这会memory_limit
是造成这种情况的一个因素吗?
答案1
你问:
因此,如果上述内容属实,那么通过运行 Apache 的 PHP 上传到 Web 服务器的真正最大文件大小是否等于设备托管上的物理内存?
不。你正确地理解了错误的建议,memory_limit
这会让你认为情况确实如此,但事实memory_limit
与文件上传大小几乎没有关系。memory_limit
这纯粹与 PHP 进程内存有关,与文件传输过程无关。
原因如下……
使用 PHP 和 Apache 上传文件时唯一需要关注的两件事是:
post_max_size
:设置允许发布数据的最大大小。此设置也会影响文件上传。要上传大文件,此值必须大于upload_max_filesize
。一般来说,memory_limit
应该大于post_max_size
。upload_max_filesize
:上传文件的最大大小。
memory_limit
在这样的设置下,与文件传输完全无关。它memory_limit
所做的只是控制每个 PHP 进程在内部处理某些内容时获得的内存量。文件传输与 无关memory_limit
。
memory_limit
:这设置了允许脚本分配的最大内存量(以字节为单位)。这有助于防止编写不当的脚本耗尽服务器上所有可用的内存。请注意,若要不受内存限制,请将此指令设置为 -1。
话虽如此,如上所述,PHP 手册说道:
一般而言,
memory_limit
应大于post_max_size
。
这毫无意义,如果你仔细想想,就会觉得这是一个错误。这memory_limit
是 PHP 进程在 RAM 中可以处理的数据量的限制。但是 — — 正如我之前所说 — — 文件传输是一个流式数据处理过程,PHP 不会将文件内容在 RAM 中存储超过所需的时间,然后再将其写入文件系统。
Stack Overflow 上的这个答案也同样如此。并且另一个答案解释得更加雄辩和简洁:
仅当您计划将整个文件读入内存并且读入的文件大于分配给 PHP 的空间(即
memory_limit
)时,在这种情况下您将耗尽内存。