iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 14
1
Modern Web

成為 Modern PHPer系列 第 14

Day 14:php.ini 的設定

PHP 的設定密密麻麻,不同情境套用不同設定

前言

php.ini 是 PHP 執行時所套用的設定檔,裡面設定包括但不限於記憶體大小限制、檔案上傳限制、程式最長執行時間等等。

如果只希望做快速檢查,可以使用 psecio/iniscan 來掃瞄既有的 ini 檔案是否存在安全風險。

通用概念

記憶體限制

設定名稱:memory_limit

通常我們會設定 Memory Limit,但數值大小視機器本身而定。這個值預設為 128M,事實上這在大部份環境都很夠用。

  • 若是在開發環境,這個值最高可以到主機記憶體的 50%
  • 若是在生產環境,這個值建議維持 128M,不過對於比較吃重的程式(如進行 PDF 的產生、圖像處理),最高可設定為執行主機的 50%(但不應低於 128M)

執行時間限制

設定名稱:max_execute_time

為了避免無窮迴圈或過久的等待,通常會設定一個執行時間限制。這個值預設是 30(秒),不過在 cli 環境時不受限制。

一般來說,會執行超過 30 秒的程式建議都利用 Queue 的概念下去實做(發訊息給 Message Queue,另外用程式去 MQ 裡抓資料執行)

檔案上傳

設定名稱:file_uploadsupload_max_filesizemax_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 的話是非常耗費效能的,因為每次在調用輸出(例如 echoprint)之後都會呼叫 flush() 這個函數。

實際路徑快取

設定名稱:realpath_cache_sizerealpath_cache_ttl

對於會載入多個 PHP 檔案的應用程式(例如 composer 就是很好的例子),如果每次都必須重複在檔案系統中搜索路徑,勢必會對系統效能造成影響。

經由設定 realpath_cache_size 可以加速系統在 includerequire 的效率。不過這個值並不容易確定大小,因為每個系統的規模不盡相同。

可以先將這個值設定得稍微大一些,然後在要執行程式的末端加入var_dump(realpath_cache_size()) 以取得路徑會耗費多少快取。

進階討論

記憶體限制

因為大部份的 PHP 環境都是以 FastCGI 與 Web Server 溝通,故線上環境的記憶體限制應該從 PHP-FPM 的 Process 數量下去做討論。

在預設設定下,PHP-FPM 會動態管理其子行程的數量(位於 php-fpm.conf 中的 pm 設定),並最大限制為 5 個。

通常會建議記憶體限制為「最大子行程數 * 每個子行程所需記憶體」,因為子行程所需記憶體每個系統都不同,所以這有賴於實際測試之後才能確定。

順帶一提,如果是在實體主機或虛擬主機這類資源較充份的地方可以使用 dynamic 動態管理 PHP-FPM 的子行程數;如果是在 Container 或較受限的地方建議使用 static 效率會較高。

後記

總結一下今天的內容

  • 記憶體限制最高為主機的 50%
    • 若值低於 128M 以 128M 為最底限
    • 可用 php-fpm memory cost * php-fpm process count 去優化這個值
  • 最長執行時間不應超過 30 秒
    • 如果有程式會執行超過 30 秒應該用 MQ 去解決
  • 檔案上傳要注意 max_post_size 這個值
    • max_post_size > upload_max_filesize * max_file_upload
  • 線上環境中,實際路徑快取務必要設定

上一篇
Day 13:PHP 佈署概述
下一篇
Day 15:PHP 語言快取機制
系列文
成為 Modern PHPer30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言