《現代 PHP》學習筆記(廿一):調教

前言

本文為《現代 PHP》一書的學習筆記。

環境

  • Windows 10
  • Wnmp 3.1.0

php.ini 檔

PHP 調教雖然不能解決不良的 SQL 查詢,或是不負責任的 API 呼叫問題,但是 PHP 調教可以增進 PHP 效率和應用程式的效能。

PHP 直譯器用 php.ini 檔來部署和調教,這個檔案可能位於作業系統多個目錄的其中之一。

PHP-FRM

PHP-FRM(PHP FastCGI 程式管理者)是一套管理 PHP 相關程式的軟體,可以接收並處理來自網頁伺服器(如 nginx)的請求。

PHP-FRM 軟體建立一個主要程式(通常由作業系統最高權限使用者執行),並且控制 HTTP 請求如何和何時發送給子程式,PHP-FRM 主程式同樣也控制子 PHP 程式何時被建立(用來回應多餘的網頁應用程式流量)和摧毀(如果存在不需要的程序)。

每一個 PHP-FRM 程式都比單一 HTTP 請求存活更久,並且可以處理 10、50、100、500 或更多的 HTTP 請求。

記憶體

php.ini 檔中的 memory_limit 設定會決定每個 PHP 程式可以使用的最大限度系統記憶體。

記憶體分配

如果執行的是微型 PHP 應用程式,可以將値降低至 64M,如果執行的是需要大量記憶體的 PHP 應用程式(例如 Drupal),可能會需要用到 512M 來達到更好的效能。

記憶體消耗

可以在 PHP 腳本的尾端呼叫 memory_get_peak_usage() 函式,來輸出當前腳本所使用的記憶體。

PHP 程式平均消耗為 5 到 20MB 的記憶體,如果上傳檔案、使用圖片,這個値會更高。

程式負擔

假如分配給 PHP 總共 512MB 的記憶體,每個 PHP 程式平均消耗大約 15MB 的記憶體,那大概可以負擔 34 個 PHP-FPM 程式,但這只是估計。

系統資源

確保有足夠的系統資源來執行 PHP 應用程式並且處理網站的流量,如果不行則需要添加更多的記憶體。

Zend OPcache

PHP Zend OPcache 擴充,是一個 opcode 快取。利用快取編譯過的 opcode 來加速每個 PHP 腳本,不用為每個 HTTP 請求重複尋找、讀取、編譯 PHP 腳本。

以下是在 php.ini 檔中,建議的 Zend OPcache 設定:

1
2
3
4
5
6
opcache.validate_timestamps=1
opcache.revalidate_freq=0
opcache.memory_consumption=64
opcache.interned_strings_buffer=16
opcache.max_accelerated_files=4000
opcache.fast_shutdown=1
  • validate_timestamps 被啟用時,PHP 會根據設定的時間區間檢查 PHP 腳本是否變動。在產品階段停用這個設定即可。
  • revalidate_freq 是 PHP 檢查編譯過的 PHP 檔是否變動的頻率。設為 0 表示 PHP 必須在接受每次請求時都重新驗證檔案是否變動。
  • memory_consumption 是分配給 opcode 快取的記憶體數量。
  • interned_strings_buffer 是用來儲存實習字串的記憶體總量。實習字串是被 PHP 直譯器在幕後偵測多次出現的字串。
  • max_accelerated_file 是可以被儲存在 opcode 快取中最大數量的 PHP 腳本。
  • fast_shutdown 會要求 opcache 使用快速終結程序,釋放記憶體給 Zend Engine 記憶體管理者。這個設定總是設為開啟。

檔案上傳

如果 PHP 應用程式不接受檔案上傳時,則將檔案上傳的功能關閉,以增進應用程式的安全性。

如果接受檔案上傳,可以將 php.ini檔設定如下:

1
2
3
file_uploads=1
upload_max_filesize=10M
max_file_uploads=3
  • file_uploads 設為 1 代表開啟檔案上傳的功能。
  • upload_max_filesize 代表上傳的檔案大小上限。
  • max_file_uploads 代表一次最多可以上傳的檔案數量。

最大運行時間

每個 PHP 程式在終結前,預設可以執行的最長時間為 30 秒。

PHP 執行的時間不應該太久。如果某個任務需要花費 10 分鐘來完成,那應該將其建立在獨立的 PHP 檔,在背景用獨立程式的方式執行。

1
max_execution_time=5
  • max_execution_time 代表最大運行時間。

Session 處理

PHP 的初始 Session 處理器讓大型的應用程式更加緩慢,因為它將 Session 資料儲存於硬碟中,導致不必要的檔案 I/O 時間。

使用 Memcached 或 Redis,可以在記憶體中處理 Session 資料,被任意數量的分散式 PHP-FPM 伺服器存取,並且大幅增加未來的擴展性。

輸出緩衝區

使用較少的區塊,每個區塊裝載更多的資料在網路中傳遞的話,網路效能會有更高的效率,並且應該要降低傳遞到使用者瀏覽器的 HTTP 請求數量。

1
output_buffering=4096
  • output_bufferin 使 PHP 的輸出緩衝區在釋放到伺服器之前收集最多 4096 個位元組。

真實路徑快取

在每次引用檔案時,不用再次尋找檔案的路徑,這個快取稱為真實路徑快取。

執行大型的 PHP 應用程式時,增加 PHP 真實路徑快取的大小,可以明顯地感受到效能的提升。

1
realpath_cache_size=64k
  • realpath_cache_size 代表真實路徑快取的大小。

參考資料

  • Josh Lockhart(2015)。現代 PHP。台北市:碁峯資訊。