PHP 的設定密密麻麻,不同情境套用不同設定
php.ini
是 PHP 執行時所套用的設定檔,裡面設定包括但不限於記憶體大小限制、檔案上傳限制、程式最長執行時間等等。
如果只希望做快速檢查,可以使用 psecio/iniscan 來掃瞄既有的 ini 檔案是否存在安全風險。
設定名稱:memory_limit
通常我們會設定 Memory Limit,但數值大小視機器本身而定。這個值預設為 128M,事實上這在大部份環境都很夠用。
設定名稱:max_execute_time
為了避免無窮迴圈或過久的等待,通常會設定一個執行時間限制。這個值預設是 30(秒),不過在 cli 環境時不受限制。
一般來說,會執行超過 30 秒的程式建議都利用 Queue 的概念下去實做(發訊息給 Message Queue,另外用程式去 MQ 裡抓資料執行)
設定名稱:file_uploads
、upload_max_filesize
、max_file_uploads
預設檔案上傳是開啟的,但預設最大限制僅有 2M,且可以上傳 20 個檔案。
這邊可以依照自己真實的情況設定,不過為了續傳上的考量(尤其是在移動網路的環境),建議應該在超過 2M 時以分片上傳的方式執行。
另外,post_max_size
(預設 8M)這個值也會影響檔案上傳大小,所以如果 upload_max_files
* max_file_upload
超過 8M 也要注意。
設定名稱:ouput_buffering
考量到 TCP 連線的特性,相較於把同一份資料切成較小的多塊,較大的少量資料塊在網路的利用上會有比較好的效率。
預設的 output_buffering
是 4096,implicit_flush
為 false。
值得一提的是,implicit_flush
如果為 On 的話是非常耗費效能的,因為每次在調用輸出(例如 echo
、print
)之後都會呼叫 flush()
這個函數。
設定名稱:realpath_cache_size
、realpath_cache_ttl
對於會載入多個 PHP 檔案的應用程式(例如 composer 就是很好的例子),如果每次都必須重複在檔案系統中搜索路徑,勢必會對系統效能造成影響。
經由設定 realpath_cache_size
可以加速系統在 include
及 require
的效率。不過這個值並不容易確定大小,因為每個系統的規模不盡相同。
可以先將這個值設定得稍微大一些,然後在要執行程式的末端加入var_dump(realpath_cache_size())
以取得路徑會耗費多少快取。
因為大部份的 PHP 環境都是以 FastCGI 與 Web Server 溝通,故線上環境的記憶體限制應該從 PHP-FPM 的 Process 數量下去做討論。
在預設設定下,PHP-FPM 會動態管理其子行程的數量(位於 php-fpm.conf 中的 pm
設定),並最大限制為 5 個。
通常會建議記憶體限制為「最大子行程數 * 每個子行程所需記憶體」,因為子行程所需記憶體每個系統都不同,所以這有賴於實際測試之後才能確定。
順帶一提,如果是在實體主機或虛擬主機這類資源較充份的地方可以使用 dynamic
動態管理 PHP-FPM 的子行程數;如果是在 Container 或較受限的地方建議使用 static
效率會較高。
總結一下今天的內容
max_post_size
這個值
max_post_size
> upload_max_filesize
* max_file_upload