PHP中opcode緩衝簡單用法

來源:互聯網
上載者:User
本文給大家介紹了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的報告檔案。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.