![](/img/trans.png)
[英]In PHP settings, should memory_limit > upload_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
通過這些配置,我希望能夠:
這種經歷會讓我說“通常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.