2018-05-17 15:16:54 1544瀏覽
今天小編主要是想給大家分享一下PHP中opcode緩存簡單用法,本篇文章扣丁學(xué)堂PHP在線學(xué)習(xí)小編結(jié)合實例形式分析opcode的概念、原理、簡單開啟與使用方法,對PHP開發(fā)感興趣的小伙伴們可以了解一下。本文會列出代碼,小伙伴可以好好閱讀。
1、什么是opcode
解釋器分析代碼之后,生成可以直接運行的中間代碼,就稱做操作碼,opcode
2、解釋器與編譯器的區(qū)別
解釋器是生成了中間代碼后直接運行中間代碼,運行時的控制權(quán)還是在解釋器手里。
編譯器則是生成了中間代碼之后還進(jìn)一步優(yōu)化代碼,生成可以直接運行的目標(biāo)程序 ,但不執(zhí)行,等待用戶觸發(fā)執(zhí)行,他的控制權(quán)在目標(biāo)程序,和編譯器無關(guān)。
3、php是解釋型語言,他的原理與編譯有點相似,包括詞法分析,語法分析,語義分析.....,php解釋器的核心引擎就是zend engine
4、php如何查看一段代碼的opcode
安裝php的parsekit擴展,通過擴展的api就可以查看php的opcode,如parsekit_compile_string()
php -r "var_dump(parsekit_compile_string('print 1+1;'));"
5、opcode有生成
首先要經(jīng)過詞法分析,腳本代碼可以看做是一系列單詞組合,解釋器要對這些單詞進(jìn)行分類,并打上記號
比如print,我們查看php源碼包中的zend/zend_language_scanner.l在這個文件中我們就可以查找到pirnt對應(yīng)的標(biāo)記。T_PRINT
找到標(biāo)記之后接下來就是語法分析,在zend/zend_language_parser.y中,我們可以找到T_PRINT對應(yīng)的函數(shù)
接著在zend/zend_compile.c中找到這個函數(shù)實現(xiàn)代碼,這個函數(shù)就是實現(xiàn) 了opcode的轉(zhuǎn)換。所有的opcode都是用戶整數(shù)來表示 的。
6、 開啟opcode緩存
生成opcode是需要系統(tǒng)開銷的,每一次執(zhí)行都要生成一次opcode,這樣的開銷還是可觀的,所以php的優(yōu)化必須開啟opcode的緩存,來避免重復(fù)的編譯。
php的opcode緩存有APC,eAccelerator,XCache,這些都是把opcode放在共享內(nèi)存中。
以APC為例:在php.ini中設(shè)置
apc.cache_by_default = on
通過
<?php print_r(apc_cache_info());?>
可以查看緩存的情況,
7、opcode緩存過期
opcode緩存是會過期的,如果過期就要得新生成一次,當(dāng)然也可以跳過過期檢查的機制,在php.ini中設(shè)置
apc.stat=off
這樣程序代碼的修改得通過重啟服務(wù)器來生效。
8.腳本的跟蹤與分析,可以使用xdebug來跟蹤,用xdebug可以實現(xiàn)性能跟蹤器,找到程序的執(zhí)行瓶頸,從而優(yōu)化程序。
xdebug.profiler_output_dir = /tmp/xdebug xdebug.profiler_output_name = cachegrind.out.%p
xdebug的函數(shù)跟蹤:
xdebug.trace_output_dir = /tmp/xdebug xdebug.trace_output_name = trace.%c
window下可以用wincachegrind查看xdebug的報告文件。
以上就是小編給大家分享的PHP中opcode緩存簡單用法,希望對小伙伴們有所幫助,想要了解更多內(nèi)容的小伙伴可以登錄扣丁學(xué)堂官網(wǎng)查看更多內(nèi)容。扣丁學(xué)堂是專業(yè)的PHP培訓(xùn)機構(gòu),不僅有專業(yè)的老師和與時俱進(jìn)的課程體系,還有大量的PHP在線視頻供學(xué)員觀看學(xué)習(xí)哦。
【關(guān)注微信公眾號獲取更多學(xué)習(xí)資料】
查看更多關(guān)于“php培訓(xùn)資訊”的相關(guān)文章>>