來源:不言 發(fā)布時間:2018-11-24 09:31:43 閱讀量:911
本篇文章給大家?guī)淼膬?nèi)容是關于php中Opcache是什么?Opcache原理和使用的介紹,有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。
一、個人實踐發(fā)現(xiàn)opcache
最近為了應對雙十一期間高流量的沖擊,小編通過壓力測試去查找服務器性能瓶頸,發(fā)現(xiàn)100并發(fā)時,QPS
并不是很高,但CPU和內(nèi)存消耗特別高,尤其是CPU消耗都100%了,而我們的容器和服務器配置都差不多升級到頂級了,這不是如此好的服務器該發(fā)揮的效果,于是小編進行了一次全面排查:
1、查看接口中數(shù)據(jù)庫查詢部分,該部分做了緩存,且redis的消耗并不是很高,排除數(shù)據(jù)庫和緩存的影響性能因素;
2、查看有沒有其他外部調(diào)用影響性能,發(fā)現(xiàn)這部分獲取數(shù)據(jù)僅僅是通過數(shù)據(jù)庫和緩存,因此排除;
3、查看接口程序代碼中有沒有復雜的邏輯計算,發(fā)現(xiàn)該部分處理的數(shù)據(jù)處理完了就直接緩存起來了,一段時間內(nèi)數(shù)據(jù)來源都是redis緩存,因此排除
4、既然已上可能造成接口瓶頸的因此都排除了,那么最有可能的是現(xiàn)在使用的laravel5.0框架造成接口性能如此低下,然后通過框架文檔、源碼及網(wǎng)上資料等發(fā)現(xiàn)laravel框架在運行時會加載大量框架文件,然后對這些文件進行編譯造成服務器CPU消耗特別高。通過這個方向,小編發(fā)現(xiàn)了PHP一個不錯的緩存PHP編譯文件的擴展opcache。
二、opcache的原理
1、Opcache是什么?
Opcache是一種通過將解析的PHP腳本預編譯的字節(jié)碼(Operate Code)存放在共享內(nèi)存中來避免每次加載和解析PHP腳本的開銷,解析器可以直接從共享內(nèi)存讀取已經(jīng)緩存的字節(jié)碼(Operate Code),從而大大提高PHP的執(zhí)行效率。
2、什么是Operate Code?
當解釋器完成對腳本代碼的分析后,便將它們生成可以直接運行的中間代碼,也稱為操作碼(Operate Code,opcode)。Opcode cache的目地是避免重復編譯,減少CPU和內(nèi)存開銷。如果動態(tài)內(nèi)容的性能瓶頸不在于CPU和內(nèi)存,而在于I/O操作,比如數(shù)據(jù)庫查詢帶來的磁盤I/O開銷,那么opcode cache的性能提升是非常有限的。但是既然opcode cache能帶來CPU和內(nèi)存開銷的降低,這總歸是好事?,F(xiàn)代操作碼緩存器(Optimizer+,APC2.0+,其他)使用共享內(nèi)存進行存儲,并且可以直接從中執(zhí)行文件,而不用在執(zhí)行前“反序列化”代碼。這將帶來顯著的性能加速,通常特別是高流量和高并發(fā)量時降低了整體服務器的內(nèi)存消耗,而且很少有缺點。
3、為什么要使用Opcode緩存?
這得從PHP代碼的生命周期說起,請求PHP腳本時,會經(jīng)過五個步驟,如下圖所示:
Zend引擎必須從文件系統(tǒng)讀取文件、掃描其詞典和表達式、解析文件、創(chuàng)建要執(zhí)行的計算機代碼(稱為Opcode),最后執(zhí)行Opcode。每一次請求PHP腳本都會執(zhí)行一遍以上步驟,如果PHP源代碼沒有變化,那么Opcode也不會變化,顯然沒有必要每次都重行生成Opcode,結(jié)合在Web中無所不在的緩存機制,我們可以把Opcode緩存下來,以后直接訪問緩存的Opcode豈不是更快,啟用Opcode緩存之后的流程圖如下所示:
因此使用了Operate Code緩存之后,PHP代碼會直接獲取opcode后直接執(zhí)行,中間的三個步驟會省略掉因此會大幅提高PHP代碼執(zhí)行效率
三、Opcache的安裝和使用
1、安裝
1 2 3 4 5 6 7 8 9 10 |
|
2、使用
1 2 3 |
|
3、配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
|