用 PHP 做檔案下載功能時遇到的記憶體問題

一般來說,為了避免使用者上傳了什麼奇奇怪怪的檔案被執行,會將上傳的檔案放在網頁根目錄以外的地方,再利用 PHP 將檔案內容輸出給 Client。

最簡單的方法是用 readfile 這個函式直接將檔案內容輸出,然而如果允許上傳的檔案比較大的話, readfile 會一次將檔案讀到記憶體內,造成記憶體用量超出上限的問題。

這個不能單純將記憶體上限提高來解決,不然只要同時幾個人下載檔案就會造成伺服器記憶體用盡。我想目前最簡單的方法是利用 stream 的功能來做:

這樣子就可以了,經測試下載數百 MB 的檔案也不會直接造成 PHP 錯誤。

發佈留言