即使将“post_max_size”和“upload_max_filesize”设置为 4096M,也无法在 Apache 下的 PHP 中上传大于 1GB 的文件

即使将“post_max_size”和“upload_max_filesize”设置为 4096M,也无法在 Apache 下的 PHP 中上传大于 1GB 的文件

php.ini据我了解,当使用 Apache 和 PGP 托管 Web 服务器时,其中决定最大上传大小的三个设置是:

  1. memory_limit
  2. post_max_size
  3. 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_sizeupload_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)时,在这种情况下您将耗尽内存。

相关内容