本文給大家介紹了PHP中opcode緩衝簡單用法,分享給大家參考一下
1.什麼是opcode
解譯器分析代碼之後,產生可以直接啟動並執行中間代碼,就稱做作業碼,opcode
2.解譯器與編譯器的區別
解譯器是產生了中間代碼後直接運行中間代碼,運行時的控制權還是在解譯器手裡。
編譯器則是產生了中間代碼之後還進一步最佳化代碼,產生可以直接啟動並執行目標程式 ,但不執行,等待使用者觸發執行,他的控制權在目標程式,和編譯器無關。
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有產生
首先要經過詞法分析,指令碼代碼可以看做是一系列單片語合,解譯器要對這些單詞進行分類,並打上記號
比如print,我們查看php源碼包中的zend/zend_language_scanner.l在這個檔案中我們就可以尋找到pirnt對應的標記。T_PRINT
找到標記之後接下來就是文法分析,在zend/zend_language_parser.y中,我們可以找到T_PRINT對應的函數
接著在zend/zend_compile.c中找到這個函數實現代碼,這個函數就是實現 了opcode的轉換。所有的opcode都是使用者整數來表示 的。
6、 開啟opcode緩衝
產生opcode是需要系統開銷的,每一次執行都要產生一次opcode,這樣的開銷還是可觀的,所以php的最佳化必須開啟opcode的緩衝,來避免重複的編譯。
php的opcode緩衝有APC,eAccelerator,XCache,這些都是把opcode放在共用記憶體中。
以APC為例:在php.ini中設定
apc.cache_by_default = on
通過
<?php print_r(apc_cache_info());?>
可以查看緩衝的情況,
7.opcode緩衝到期
opcode緩衝是會到期的,如果到期就要得新產生一次,當然也可以跳過到期檢查的機制,在php.ini中設定
apc.stat=off
這樣程式碼的修改得通過重啟伺服器來生效。
8.指令碼的跟蹤與分析,可以使用xdebug來跟蹤,用xdebug可以實現效能跟蹤器,找到程式的執行瓶頸,從而最佳化程式。
xdebug.profiler_output_dir = /tmp/xdebug
xdebug.profiler_output_name = cachegrind.out.%p
xdebug的函數跟蹤:
xdebug.trace_output_dir = /tmp/xdebug
xdebug.trace_output_name = trace.%c
window下可以用wincachegrind查看xdebug的報告檔案。