標榜十年來最大改版的PHP 7,最大亮點是翻倍的效能提升,但若只是現有網站的舊版PHP環境升級到新版,還不足以充分發揮PHP 7的能耐。
密技1 啟用Zend Opcache
PHP 7 主要開發者惠新宸也公開了5個PHP開發者一定要知道的新版效能密技。
Opcache是一個將預先編譯的腳本程式快取在共用記憶體的功能,但PHP預設設定會關閉這項功能,因此,很多開發者會忘了善用這個優化機制。即使不啟用Opcache,PHP 7的效能已可超越5.6版,啟用後還可以更快。可以直接在php.ini檔中加入以下設定來啟用Opcache。
end_extension=opcache.so opcache.enable=1 opcache.enable_cli=1"
密技2 使用新版編譯器
要將PHP腳本程式編譯成二進位檔時,惠新宸推薦使用GCC 4.8版以上的編譯器。他解釋,因為GCC 4.8版以上才會開啟Global Register對opline和execute_data的支援,有助於提高5%的效能。儘管舊版GCC支援,但舊版這項支援功能還有臭蟲,因此,惠新宸建議GCC得升級到4.8版以上。
密技3 啟用HugePage
啟用Linux系統的HugePage(大型暫存分頁機制)可讓PHP的Text段落和記憶體中的分頁都改用HugePage來儲存,來減少TLB(Translation Lookaside Buffer)遺失而提高效能。原本系統記憶體多以4KB來分頁,但啟用HugePage後則改以2MB來分頁。
CPU存取記憶體時,得查表才能得知虛擬定址和記憶體定址間的轉換,CPU會透過TLB暫存來加速查表。
若分頁單位越小,分頁筆數就越多,查表時就會得建立越多TLB,容易造成暫存資料的遺失而得重查,啟用了大型HugePage分頁設定就能減少TLB數量而降低遺失的問題。
若以CentOS 6.5為例,可透過sudo sysctl vm.nr_hugepages=512指令,來分配512個預留的大型暫存分頁,然後在php.ini設定檔中加入 opcache.huge_code_pages=1的敘述就能啟用。
★ 延伸閱讀密技3 《讓你的PHP 7更快之Hugepage》
密技4 Opcache檔案快取
開啟了Opcache File Cache功能後,可以將Opcache將Opcode暫存到外部檔暗中,有助於改善某些腳本程式的效能。
只需在php.ini設定檔中加入opcache.file_cache=/tmp,就可以在/tmp目錄下快取Opcode二進位檔案,可跨PHP生命周期存在。
密技5 使用PGO預執行最佳化
如果PHP環境只用於執行單一程式,例如只來執行WordPress或Drupal,惠新宸建議,使用者可重新編譯PHP 7並使用GCC的PGO預執行最佳化機制,來編譯出一個專為你量身打造的特定PHP 7版本,來提高效能。
例如要優化WordPress 4.1時,可下達make prof-gen指令後,先用hp-cgi執行100次WordPress首頁程式來產生Profile資訊,再執行make prof-clean和make prof-use && make install,來編譯出一個量身打造的專屬高效能PHP 7版本。
惠新宸也選擇了WordPress 4.1作為優化場景,並示範編譯指令。
$ make prof-gen $ sapi/cgi/php-cgi -T 100 /home/huixinchen/local/www/htdocs/wordpress/index.php >/dev/null $ make prof-clean $ make prof-use && make install