簡體   English   中英

php的memory_limit,upload_max_filesize和post_max_filesize之間的關系

[英]Relationship between php’s memory_limit, upload_max_filesize and post_max_filesize

底線
我是否需要關注設置post_max_filesize >> memory_limit

細節
這個答案表明上傳的文件不需要適合php的memory_limit。 php文檔建議整個帖子應該符合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。
我也希望如此:
  • 使用上傳到服務器A的10個文件中的任何一個都是一個問題(50M包中的100M文件......)。
  • 使用上傳到服務器B的100個文件中的任何一個都可以(10 <50)。
在嘗試較少但又等效相關的數字時,我發現這些期望是正確的。

這種經歷會讓我說“通常memory_limit應該大於upload_max_filesize ”; 相反,php 文檔說:

一般來說,memory_limit應該大於post_max_size

如果不是,為什么會發生什么?

當我的PHP代碼執行時,我看不到所有發布的文件都在內存中的證據。 在我看來,我所擁有的只是一個$ _FILES路徑,這些路徑只能在磁盤上找到文件。 在我能夠反省環境之前,php是否會在內存中保留整個帖子? 我是否需要關注設置post_max_filesize >> memory_limit

在旁邊:
違反手冊的規則不會導致嚴重損壞的服務器(w / php5.3 apache2.2 debian 6)。

PHP將接受單獨小於upload_max_filesize上傳文件,並且一起占用少於post_max_size字節。 關於memory_limit的PHP文檔是錯誤的,它不需要保存發布的文件內容。

以下配置適用於Apache2模塊和CGI,並接受小於1G的文件。

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

我是否需要關注設置post_max_filesize >> memory_limit?

只有當您計划將整個文件讀入內存並且您讀入的文件大於您分配給PHP的空間(即memory_limit )時,在這種情況下您將耗盡內存。

我個人的經驗是你必須擁有一個高於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超過允許的最大文件大小。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM