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

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

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

  舉個(gè)文中的例子
復(fù)制代碼 代碼如下:

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

PHP執(zhí)行這段代碼會(huì)經(jīng)過(guò)如下4個(gè)步驟(確切的來(lái)說(shuō),應(yīng)該是PHP的語(yǔ)言引擎Zend)
復(fù)制代碼 代碼如下:

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

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

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

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] => ;
)

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

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階段了,它會(huì)把Tokens編譯成一個(gè)個(gè)op_array, 每個(gè)op_arrayd包含如下5個(gè)部分:
復(fù)制代碼 代碼如下:

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

比如,我們的PHP代碼會(huì)被Parsing成:
復(fù)制代碼 代碼如下:

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

呵呵,你可能會(huì)問(wèn)了,我們的$a去那里了?

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

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

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

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

IS_CV 表示ZE2.1/PHP5.1以后的編譯器使用的一種cache機(jī)制,這種變量保存著被它引用的變量的地址,當(dāng)一個(gè)變量第一次被引用的時(shí)候,就會(huì)被CV起來(lái),以后對(duì)這個(gè)變量的引用就不需要再次去查找active符號(hào)表了,CV變量以!開(kāi)頭表示。

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


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

補(bǔ)充:
apc,zend optimize是之所以能夠加速php
就是因?yàn)樗梢跃彺鎜pcode
并不是zend引擎本身自帶的功能
zend引擎默認(rèn)是一個(gè)輪回中任何一項(xiàng)都要走的

相關(guān)文章

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

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

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

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

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

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

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

    淺析ThinkPHP中的pathinfo模式和URL重寫(xiě)

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

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

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

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

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

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

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

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

    據(jù)說(shuō)ecshop的模板類(lèi)是修改的smarty,不過(guò)個(gè)人感覺(jué)不是修改是完全重寫(xiě)了。它和smarty上只是模板標(biāo)簽上有相同的地方,同時(shí)閹割了很多功能
    2011-06-06
  • PHP 5.0對(duì)象模型深度探索之類(lèi)的靜態(tài)成員

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

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

    php面向?qū)ο笾攸c(diǎn)知識(shí)分享

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

最新評(píng)論

凤庆县| 宜宾县| 威海市| 龙川县| 阿尔山市| 清流县| 嘉义市| 洪泽县| 且末县| 洛扎县| 梨树县| 修文县| 大安市| 揭东县| 金平| 应用必备| 江山市| 桃源县| 宣恩县| 启东市| 凤翔县| 且末县| 洪江市| 株洲市| 莲花县| 庄河市| 保定市| 潞城市| 谢通门县| 西乌珠穆沁旗| 永川市| 龙岩市| 泰来县| 彰化县| 吉隆县| 武安市| 东阳市| 博湖县| 铜鼓县| 新平| 郑州市|