前言
本文為《現代 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 | opcache.validate_timestamps=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 | file_uploads=1 |
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。台北市:碁峯資訊。