最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

理解php原理的opcodes(操作碼)

 更新時間:2010年10月26日 23:00:40   作者:  
現(xiàn)自己對php的原理基本上都不了解,特別是深層的~呵呵,繼續(xù)努力,特轉(zhuǎn)載喜歡的朋友可以研究下。
Opcondes是一種php腳本編譯后的中間語言,就像Java的Byte Code,或者.NET 的MSL 。(都沒了解過~)

  舉個文中的例子
復制代碼 代碼如下:

<?php
  echo "Hello World";
  $a = 1 + 1;
   echo $a;
  ?>

PHP執(zhí)行這段代碼會經(jīng)過如下4個步驟(確切的來說,應該是PHP的語言引擎Zend)
復制代碼 代碼如下:

  1.Scanning(Lexing) (掃描),將PHP代碼轉(zhuǎn)換為語言片段(Tokens)
  2.Parsing(語法分析), 將Tokens轉(zhuǎn)換成簡單而有意義的表達式
  3.Compilation(編譯), 將表達式編譯成Opocdes
  4.Execution(執(zhí)行編譯后的結(jié)果), 順次執(zhí)行Opcodes,每次一條,從而實現(xiàn)PHP腳本的功能。

  其中他還提到一句:“現(xiàn)在有的Cache比如APC,可以使得PHP緩存住Opcodes,這樣,每次有請求來臨的時候,就不需要重復執(zhí)行前面3步,從而能大幅的提高PHP的執(zhí)行速度。 ” 這可能是php執(zhí)行速度比較快的原因之一吧~

那什么是Lexing? 學過編譯原理的同學都應該對編譯原理中的詞法分析步驟有所了解,Lex就是一個詞法分析的依據(jù)表。 Zend/zend_language_scanner.c會根據(jù)Zend/zend_language_scanner.l(Lex文件),來輸入的 PHP代碼進行詞法分析,從而得到一個一個的“詞”,PHP4.2開始提供了一個函數(shù)叫token_get_all,這個函數(shù)就可以講一段PHP代碼 Scanning成Tokens;
如果用這個函數(shù)處理我們開頭提到的PHP代碼,將會得到如下結(jié)果:
復制代碼 代碼如下:

Array
(
[0] => Array
(
[0] => 367
[1] => Array
(
[0] => 316
[1] => echo
)
[2] => Array
(
[0] => 370
[1] =>
)
[3] => Array
(
[0] => 315
[1] => "Hello World"
)
[4] => ;
[5] => Array
(
[0] => 370
[1] =>
)
[6] => =
[7] => Array
(
[0] => 370
[1] =>
)
[8] => Array
(
[0] => 305
[1] => 1
)
[9] => Array
(
[0] => 370
[1] =>
)
[10] => +
[11] => Array
(
[0] => 370
[1] =>
)
[12] => Array
(
[0] => 305
[1] => 1
)
[13] => ;
[14] => Array
(
[0] => 370
[1] =>
)
[15] => Array
(
[0] => 316
[1] => echo
)
[16] => Array
(
[0] => 370
[1] =>
)
[17] => ;
)

分析這個返回結(jié)果我們可以發(fā)現(xiàn),源碼中的字符串,字符,空格,都會原樣返回。每個源代碼中的字符,都會出現(xiàn)在相應的順序處。而,其他的比如標簽,操作符, 語句,都會被轉(zhuǎn)換成一個包含倆部分的Array: Token ID (也就是在Zend內(nèi)部的改Token的對應碼,比如,T_ECHO,T_STRING),和源碼中的原來的內(nèi)容。
接下來,就是Parsing階段了,Parsing首先會丟棄Tokens Array中的多于的空格,然后將剩余的Tokens轉(zhuǎn)換成一個一個的簡單的表達式
復制代碼 代碼如下:

1.echo a constant string
2.add two numbers together
3.store the result of the prior expression to a variable
4.echo a variable

然后就改Compilation階段了,它會把Tokens編譯成一個個op_array, 每個op_arrayd包含如下5個部分:
復制代碼 代碼如下:

1.Opcode數(shù)字的標識,指明了每個op_array的操作類型,比如add , echo
2.結(jié)果 存放Opcode結(jié)果
3.操作數(shù)1 給Opcode的操作數(shù)
4.操作數(shù)2
5.擴展值 1個整形用來區(qū)別被重載的操作符

比如,我們的PHP代碼會被Parsing成:
復制代碼 代碼如下:

* ZEND_ECHO 'Hello World'
* ZEND_ADD ~0 1 1
* ZEND_ASSIGN !0 ~0
* ZEND_ECHO !0

呵呵,你可能會問了,我們的$a去那里了?

恩,這個要介紹操作數(shù)了,每個操作數(shù)都是由以下倆個部分組成:

a)op_type : 為IS_CONST, IS_TMP_VAR, IS_VAR, IS_UNUSED, or IS_CVb)u,一個聯(lián)合體,根據(jù)op_type的不同,分別用不同的類型保存了這個操作數(shù)的值(const)或者左值(var)而對于var來說,每個var也不一樣

IS_TMP_VAR, 顧名思義,這個是一個臨時變量,保存一些op_array的結(jié)果,以便接下來的op_array使用,這種的操作數(shù)的u保存著一個指向變量表的一個句柄(整數(shù)),這種操作數(shù)一般用~開頭,比如~0,表示變量表的0號未知的臨時變量

IS_VAR 這種就是我們一般意義上的變量了,他們以$開頭表示

IS_CV 表示ZE2.1/PHP5.1以后的編譯器使用的一種cache機制,這種變量保存著被它引用的變量的地址,當一個變量第一次被引用的時候,就會被CV起來,以后對這個變量的引用就不需要再次去查找active符號表了,CV變量以!開頭表示。

這么看來,我們的$a被優(yōu)化成!0了。
總結(jié):


1.php的執(zhí)行順序是: -> php程序
          -> 被Scanning(掃描轉(zhuǎn)換為Tokens(語言片段))
          -> 被Parsing(語法分析,將Tokens轉(zhuǎn)換成簡單而有意義的表達式)
          -> Compilation(編譯,將表達式編譯成Opocdes(操作碼))
-> Execution(順序執(zhí)行編譯后的結(jié)果)
2. APC(Alternative PHP Cache)的緩存機制可以緩存住Opcodes,這樣,下次有請求來臨的時候,就不需要重復執(zhí)行前面3步,從而能大幅的提高PHP的執(zhí)行速度。 這可能是php執(zhí)行速度比較快的原因之一

補充:
apc,zend optimize是之所以能夠加速php
就是因為他可以緩存opcode
并不是zend引擎本身自帶的功能
zend引擎默認是一個輪回中任何一項都要走的

相關(guān)文章

  • PHP如何實現(xiàn)HTTP驗證

    PHP如何實現(xiàn)HTTP驗證

    這篇文章主要介紹了PHP如何實現(xiàn)HTTP驗證,幫助大家更好的理解和學習使用PHP,感興趣的朋友可以了解下
    2021-04-04
  • php簡單創(chuàng)建zip壓縮文件的方法

    php簡單創(chuàng)建zip壓縮文件的方法

    這篇文章主要介紹了php簡單創(chuàng)建zip壓縮文件的方法,實例分析了php基于ZipArchive實現(xiàn)文件壓縮的相關(guān)技巧,需要的朋友可以參考下
    2016-04-04
  • PHP直接修改表內(nèi)容DataGrid功能實現(xiàn)代碼

    PHP直接修改表內(nèi)容DataGrid功能實現(xiàn)代碼

    最近想做一個通過PHP實現(xiàn)DataGrid功能的東西,這樣可以直接修改數(shù)據(jù)庫中表的內(nèi)容,而不用開發(fā)【新增數(shù)據(jù)頁面】和【編輯頁面】,本篇首先介紹基于MySQL的使用方法,再簡單介紹對于Oracle連接(基于sqlrelay)的二次開發(fā)。
    2015-09-09
  • 淺析ThinkPHP中的pathinfo模式和URL重寫

    淺析ThinkPHP中的pathinfo模式和URL重寫

    語文一直不太好,要我怎么解釋這個pathinfo模式還真不知道怎么說,那就先來一段代碼說下pathinfo模式吧
    2014-01-01
  • php下嘗試使用GraphicsMagick的縮略圖功能

    php下嘗試使用GraphicsMagick的縮略圖功能

    現(xiàn)在,對一個Web程序員來說,圖像處理已經(jīng)屬于必會知識之一了。且不說Flickr,Yupoo等專業(yè)圖片分享網(wǎng)站,就算是一個和圖片分享不沾邊的網(wǎng)站,也會用到很多圖片處理的功能,比如說:用戶上傳頭像,然后自動生成縮略圖。
    2011-01-01
  • php 應用程序安全防范技術(shù)研究

    php 應用程序安全防范技術(shù)研究

    比特網(wǎng)專家特稿:關(guān)于PHP應用程序的安全,我們往往容易疏忽,或者采取的措施并不得當。這里給大家提供個通用防注射防跨站的小程序,僅供大家參考。
    2009-09-09
  • php中轉(zhuǎn)義mysql語句的實現(xiàn)代碼

    php中轉(zhuǎn)義mysql語句的實現(xiàn)代碼

    如果你需要向數(shù)據(jù)庫,插入形如’你好’,這樣包含有單引號或者雙引號的字符串怎么辦,當然可以使用反斜杠進行轉(zhuǎn)義,但是如果內(nèi)容太多呢?
    2011-06-06
  • 使ecshop模板中可引用常量的實現(xiàn)方法

    使ecshop模板中可引用常量的實現(xiàn)方法

    據(jù)說ecshop的模板類是修改的smarty,不過個人感覺不是修改是完全重寫了。它和smarty上只是模板標簽上有相同的地方,同時閹割了很多功能
    2011-06-06
  • PHP 5.0對象模型深度探索之類的靜態(tài)成員

    PHP 5.0對象模型深度探索之類的靜態(tài)成員

    類的靜態(tài)成員與一般的類成員不同: 靜態(tài)成員與對象的實例無關(guān),只與類本身有關(guān)。他們用來實現(xiàn)類要封裝的功能和數(shù)據(jù),但不包括特定對象的功能和數(shù)據(jù),靜態(tài)成員包括靜態(tài)方法和靜態(tài)屬性。
    2008-03-03
  • php面向?qū)ο笾攸c知識分享

    php面向?qū)ο笾攸c知識分享

    在本篇文章里小編給大家整理的是關(guān)于php面向?qū)ο竽男┲攸c的內(nèi)容,有需要的朋友們學習參考下。
    2019-09-09

最新評論

揭东县| 鹤岗市| 明溪县| 临朐县| 贞丰县| 甘谷县| 陆良县| 崇州市| 澄江县| 达孜县| 科技| 图木舒克市| 新余市| 灌云县| 迁安市| 尼木县| 巴东县| 许昌市| 神池县| 民丰县| 获嘉县| 霍林郭勒市| 西吉县| 西畴县| 桑植县| 房产| 昭觉县| 阜宁县| 五指山市| 遂昌县| 凤翔县| 兰溪市| 荃湾区| 新化县| 买车| 武平县| 曲靖市| 遵化市| 华安县| 马关县| 甘泉县|