眾所周知php是一種解釋型語言,它的執行可分為以下幾個流程:
Scanning(Lexing) ,將PHP程式碼轉換為語言片段(Tokens)
Parsing, 將Tokens轉換成簡單而有意義的表達式
Compilation, 將表達式編譯成Opocdes
Execution, 順次執行Opcodes,每次一條,從而實現PHP腳本的功能。
這樣一來的話,對於同一個文件,反覆請求,就要不斷解析、編譯和執行PHP腳本,消耗過多資源。
php傳統運作方式:
為了解決這個問題,opcode快取技術應運而生。
當解釋器完成對腳本程式碼的分析後,便將它們產生可以直接執行的中間程式碼,也稱為操作碼(Operate Code,opcode)。 Opcode 快取就是將編譯好的Opcode碼快取在記憶體中,下次再執行這個腳本時,直接會去找到快取下的opcode碼,直接執行最後一步,而不再需要中間的步驟了,其目地是避免重複編譯,減少CPU 和記憶體開銷。
當解釋器完成對腳本程式碼的分析後,便將它們產生可以直接執行的中間程式碼,也稱為操作碼(Operate Code,opcode)。 Opcode 快取就是將編譯好的Opcode碼快取在記憶體中,下次再執行這個腳本時,直接會去找到快取下的opcode碼,直接執行最後一步,而不再需要中間的步驟了,其目地是避免重複編譯,減少CPU 和記憶體開銷。
Opcache其他的快取工具最大的不同,也可以說是優勢,就是它已經進入php原始碼樹,成為官方產品,會一直跟著php更新,而其他的已經很久不更新了,目前對於新版的php都不支援或相容性很差。其次,經過測試,opcache的效率也比其他工具高。
那麼要如何開啟使用opcache呢?
既然opcahce已經進入php原始碼樹,那麼作為內建的工具,開啟方式肯定很簡單了,下面便是推薦設定:
zend_extension=.././...php_opcache.dll(路径) opcache.memory_consumption=128 #共享内存opcache.interned_strings_buffer=8 #存储临时字符串opcache.max_accelerated_files=4000 #缓存文件数opcache.revalidate_freq=60 #缓存时间opcache.fast_shutdown=1opcache.enable_cli=1 opcache.enable=1 #是否开启opcode缓存
你只需要將前面的;去掉就可以了。
當然opcache有很多配置,這裡就不一一列舉,上面這幾條是標配,可以滿足一般需求。
理論上講,php檔案越大,邏輯越複雜,那麼opcache的效果就越明顯,而且在速度和抗並發上有非常大的作用。
在本機環境測試結果如下(電腦效能有限):
#有明顯的效率提升。
要注意到是,opcache既然會快取住檔案第一次執行的opcode,那麼在測試環境就不要開了,原因你懂得,開發時程式碼改來改去,結果卻不變………..
要手動清除opcache緩存,需要運行opcache_reset()來清除,所以如果線上配置了opcache,需要清除的話可以用這個函數。
以上是opcode 快取讓php如虎添翼的詳細內容。更多資訊請關注PHP中文網其他相關文章!