[Modern PHP] 第二章 新特性之六 Zend OPcache
Zend OPcache
位元組程式碼快取技術對於PHP來說並不新鮮。我們很早就有了Alternative PHP Cache(APC)、eAccelerator、ionCube和XCache這些獨立的擴充,它們都可以作為我們的可選方案。但是在PHP的每個核心發布版本中都沒有它們的身影。直到現在PHP 5.5.0後,PHP才有了自己內建的位元組程式碼快取:Zend OPcache。
首先,讓我來解釋一下什麼是位元組碼以及它的重要性。PHP是一種解釋語言。當PHP解譯器執行一個PHP指令碼時,解譯器解析PHP的指令碼代碼,將PHP代碼編譯成一組Zend Opcodes(機器碼指令),最終執行這些位元組碼。PHP檔案在每次請求時都會重複上面的步驟。這樣做未免太浪費了,尤其是每次HTTP請求時PHP指令碼都要一次又一次的執行解析、編譯和執行。如果我們有辦法能夠緩衝住這些編譯好的位元組碼就可以縮短應用程式的回應時間,並且能夠減輕系統資源的壓力。你真幸運。
位元組程式碼快取能夠儲存編譯後的PHP位元組碼。這意味著每次請求時PHP解譯器不再需要讀取、解析和編譯PHP代碼,而是可以直接從記憶體中讀取編譯後的位元組碼並執行。這大大節省了時間,極大的提升了應用程式的效能。
開啟Zend OPcache
Zend OPcache預設是不啟用的,你需要在安裝編譯PHP時明確的開啟Zend OPcache才行。
如果你使用的是虛擬機器主機,請確保你選擇的是一家能夠提供PHP 5.5.0及以上版本並且開啟Zend OPcache的優秀服務商。
如果你自己編譯PHP(假設你使用的是VPS或者伺服器託管),你必須在PHP的 ./configure命令後添加一個參數
--enable-opcache
在PHP編譯完成後,你還需要在phpini檔案中指定Zend OPcache擴充的路徑,參照下面的樣本:
zend_extension=/path/to/opcache.so
在PHP編譯成功後會立刻顯示Zend OPcache擴充的檔案路徑的。如果你忘了像我說的這麼做,你也可以執行下面的命令來擷取PHP所有擴充存放的路徑地址:
php-config --extension-dir
如果你在使用無與倫比的Derick Rethans開發流行調試工具Xdebug,在php.ini檔案中,Zend OPcache擴充必須在Xdebug擴充之前載入。
在你更新了php.ini檔案並且重啟PHP進程後就可以使用了。如果需要確認Zend OPcache是否正確安裝,可以建立一個PHP檔案包含下面的內容:
在瀏覽器中查看這個PHP檔案,並且下拉捲軸直到看到Zend OPcache擴充那一段資訊,2-2所示。如果你沒有看到這段資訊,就表示Zend OPcache並沒有在運行。
圖 2-2 Zend OPcache INI設定
配置Zend OPcache
在Zend OPcache啟用的情況下,你可以在php.ini設定檔中配置Zend OPcache。下面是我喜歡使用的OPcache設定:
opcache.validate_timestamps =1 // 在生產環境中使用"0"
opcache.revalidate_freq =0
opcache.memory_consumption =64
opcache.interned_strings_buffer =16
opcache.max_accelerated_files =4000
opcache.fast_shutdown =1
想瞭解更多關於這些Zend OPcache設定的資訊可以閱讀第八章。在PHP.net上可以擷取到完整的設定列表。
使用Zend OPcache
這部分內容很簡單,因為Zend OPcache一旦啟用就會自動工作。Zend OPcache會自動將編譯後的PHP位元組程式碼快取到記憶體中並自動執行混存後的位元組碼。
當INI參數 opcache.validate_timestamps設定為false(0)時需要格外小心。這種情況下,Zend OPcache不會檢測你的PHP指令碼的改動,因此你必須在改動了PHP檔案後手動的去清除Zend OPcaches的位元組程式碼快取才行。這個設定對線上的產品伺服器有很大的協助,但是會給開發帶來很大的不便。你可以在開發時使用下面的php.ini的配置設定來啟用自動的檔案檢測:
opcache.validate_timestamps = 1
opcache.revalidate_freq = 0