日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

PHP內(nèi)核探索 —— 如何執(zhí)行PHP腳本:Zend引擎是如何解釋PHP腳本的

瀏覽:32日期:2022-09-16 13:06:00

前面介紹了PHP的生命周期,PHP的SAPI,SAPI處于PHP整個架構(gòu)較上層,而真正腳本的執(zhí)行主要由Zend引擎來完成, 這一小節(jié)我們介紹PHP腳本的執(zhí)行。

目前編程語言可以分為兩大類:

第一類是像C/C++, .NET, Java之類的編譯型語言, 它們的共性是:運(yùn)行之前必須對源代碼進(jìn)行編譯,然后運(yùn)行編譯后的目標(biāo)文件。第二類比如PHP, Javascript, Ruby, Python這些解釋型語言, 他們都無需經(jīng)過編譯即可“運(yùn)行”。

雖然可以理解為直接運(yùn)行,但它們并不是真的直接就被能被機(jī)器理解, 機(jī)器只能理解機(jī)器語言,那這些語言是怎么被執(zhí)行的呢, 一般這些語言都需要一個解釋器, 由解釋器來執(zhí)行這些源碼, 實際上這些語言還是會經(jīng)過編譯環(huán)節(jié),只不過它們一般會在運(yùn)行的時候?qū)崟r進(jìn)行編譯。為了效率,并不是所有語言在每次執(zhí)行的時候都會重新編譯一遍, 比如PHP的各種opcode緩存擴(kuò)展(如APC, xcache, eAccelerator等),比如Python會將編譯的中間文件保存成pyc/pyo文件, 避免每次運(yùn)行重新進(jìn)行編譯所帶來的性能損失。

PHP的腳本的執(zhí)行也需要一個解釋器, 比如命令行下的php程序,或者apache的mod_php模塊等等。 前面提到了PHP的SAPI接口, 下面就以PHP命令行程序為例解釋PHP腳本是怎么被執(zhí)行的。 例如如下的這段PHP腳本:

<?php$str = 'Hello, world!n';echo $str;?>

假設(shè)上面的代碼保存在名為hello.php的文件中, 用PHP命令行程序執(zhí)行這個腳本:

$ php ./hello.php

這段代碼的輸出顯然是Hello, world!, 那么在執(zhí)行腳本的時候PHP/Zend都做了些什么呢? 這些語句是怎么樣讓php輸出這段話的呢? 下面將一步一步的進(jìn)行介紹。

程序的執(zhí)行如上例中, 傳遞給php程序需要執(zhí)行的文件, php程序完成基本的準(zhǔn)備工作后啟動PHP及Zend引擎, 加載注冊的擴(kuò)展模塊。初始化完成后讀取腳本文件,Zend引擎對腳本文件進(jìn)行詞法分析,語法分析。然后編譯成opcode執(zhí)行。 如果安裝了apc之類的opcode緩存, 編譯環(huán)節(jié)可能會被跳過而直接從緩存中讀取opcode執(zhí)行。

PHP在讀取到腳本文件后首先對代碼進(jìn)行詞法分析,PHP的詞法分析器是通過lex生成的, 詞法規(guī)則文件在$PHP_SRC/Zend/zend_language_scanner.l, 這一階段lex會會將源代碼按照詞法規(guī)則切分一個一個的標(biāo)記(token)。PHP中提供了一個函數(shù)token_get_all(), 該函數(shù)接收一個字符串參數(shù), 返回一個按照詞法規(guī)則切分好的數(shù)組。 例如將上面的php代碼作為參數(shù)傳遞給這個函數(shù):

<?php$code =<<<PHP_CODE<?php$str = 'Hello, worldn';echo $str;PHP_CODE;var_dump(token_get_all($code));?>

運(yùn)行上面的腳本你將會看到一如下的輸出:

array ( 0 => array ( 0 => 368, // 腳本開始標(biāo)記 1 => ’<?php // 匹配到的字符串’, 2 => 1, ), 1 => array ( 0 => 371, 1 => ’ ’, 2 => 2, ), 2 => ’=’, 3 => array ( 0 => 371, 1 => ’ ’, 2 => 2, ), 4 => array ( 0 => 315, 1 => ’'Hello, world'’, 2 => 2, ), 5 => ’;’, 6 => array ( 0 => 371, 1 => ’’, 2 => 3, ), 7 => array ( 0 => 316, 1 => ’echo’, 2 => 4, ), 8 => array ( 0 => 371, 1 => ’ ’, 2 => 4, ), 9 => ’;’,

這也是Zend引擎詞法分析做的事情,將代碼切分為一個個的標(biāo)記,然后使用語法分析器(PHP使用bison生成語法分析器, 規(guī)則見$PHP_SRC/Zend/zend_language_parser。y), bison根據(jù)規(guī)則進(jìn)行相應(yīng)的處理, 如果代碼找不到匹配的規(guī)則,也就是語法錯誤時Zend引擎會停止,并輸出錯誤信息。 比如缺少括號,或者不符合語法規(guī)則的情況都會在這個環(huán)節(jié)檢查。 在匹配到相應(yīng)的語法規(guī)則后,Zend引擎還會進(jìn)行編譯, 將代碼編譯為opcode, 完成后,Zend引擎會執(zhí)行這些opcode, 在執(zhí)行opcode的過程中還有可能會繼續(xù)重復(fù)進(jìn)行編譯-執(zhí)行, 例如執(zhí)行eval,include/require等語句, 因為這些語句還會包含或者執(zhí)行其他文件或者字符串中的腳本。

例如上例中的echo語句會編譯為一條ZEND_ECHO指令, 執(zhí)行過程中,該指令由C函數(shù)zend_print_variable(zval* z)執(zhí)行,將傳遞進(jìn)來的字符串打印出來。 為了方便理解, 本例中省去了一些細(xì)節(jié),例如opcode指令和處理函數(shù)之間的映射關(guān)系等。 后面的章節(jié)將會詳細(xì)介紹。

如果想直接查看生成的Opcode,可以使用php的vld擴(kuò)展查看。擴(kuò)展下載地址:?http://pecl.php.net/package/vld。Win下需要自己編譯生成dll文件。

有關(guān)PHP腳本編譯執(zhí)行的細(xì)節(jié),請閱讀后面有關(guān)詞法分析,語法分析及opcode編譯相關(guān)內(nèi)容。

標(biāo)簽: PHP
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产精品亚洲欧美一级在线 | 欧美激情久久久久久久久久久| 国产亚洲在线| 青青久久av| 99精品一区| 欧美特黄视频| 亚洲在线久久| 日本视频一区二区| 欧美综合精品| 麻豆精品av| 日韩精品1区| 精品成人免费一区二区在线播放| 成人片免费看| 国产专区一区| 日本欧美不卡| 先锋影音国产一区| 91伊人久久| 激情综合五月| 日韩欧美少妇| 在线亚洲自拍| 日本免费在线视频不卡一不卡二| 国产日产精品_国产精品毛片| 亚洲精品字幕| 99日韩精品| 日韩精品诱惑一区?区三区| 日韩免费在线| 黑丝一区二区| 日韩一二三区在线观看| 欧美一区=区三区| 国产亚洲一区二区三区啪| 麻豆中文一区二区| 免费高潮视频95在线观看网站| 99国产一区| 午夜国产一区二区| 福利视频一区| 欧美日韩精品一区二区三区视频 | 国产极品一区| caoporn视频在线| 精品久久97| 欧美日韩a区| 欧美精品导航| 国产精品nxnn| 中文无码日韩欧| 国产精品一二| 国产精品密蕾丝视频下载| 国产日韩一区二区三区在线播放| 亚洲午夜天堂| 午夜亚洲精品| 日韩精品欧美激情一区二区| 婷婷亚洲综合| 久久久久91| 香蕉人人精品| 亚洲精品福利| 国产亚洲欧美日韩在线观看一区二区 | 亚洲欧洲高清| 欧美亚洲国产激情| 国产高清视频一区二区| 久久久久久色| 亚洲深爱激情| 蜜桃视频欧美| 亚洲免费精品| 欧美日韩99| 日韩国产激情| 日本不卡在线视频| 久久天堂精品| 国产精品亚洲人成在99www| 精品网站aaa| 在线午夜精品| 狠狠久久伊人中文字幕| 中文字幕日韩亚洲| 亚洲精品一级二级| 欧美另类中文字幕| 狠狠色综合网| 粉嫩av一区二区三区四区五区| 麻豆9191精品国产| 国产一区二区三区不卡视频网站 | 精品国产91| 蜜桃传媒麻豆第一区在线观看 | 日韩高清不卡在线| 五月婷婷六月综合| 国产高潮在线| 国产精品亚洲二区| 亚洲欧美日韩国产| 高清在线一区| 欧美一区久久| 亚洲综合色婷婷在线观看| 欧美日中文字幕| caoporn视频在线| 国产精品亚洲人成在99www| 蜜桃av一区二区在线观看| 欧美亚洲国产激情| www.51av欧美视频 | 91亚洲精品视频在线观看| 精品1区2区3区4区| 日韩三区免费| 亚洲最新无码中文字幕久久| 国产精品国码视频| 亚洲免费专区| 蜜臀国产一区二区三区在线播放| 国产主播一区| 亚洲www啪成人一区二区| 国内揄拍国内精品久久| 国产精品探花在线观看| 日韩国产在线观看| 亚洲在线久久| 一区二区精品| 蜜臀久久久久久久| 视频一区视频二区中文| 国产精品7m凸凹视频分类| 成人片免费看| 在线精品亚洲欧美日韩国产| 久久精品毛片| 国产精品亚洲片在线播放| 婷婷综合一区| 亚洲伊人精品酒店| 麻豆亚洲精品| 亚洲综合专区| 亚洲理论在线| 亚洲精品亚洲人成在线观看| 久色成人在线| 蜜桃久久久久久| 一区二区日韩免费看| 免费观看久久久4p| 亚洲精品福利| 日本欧美在线| 国产精品15p| 久久精品天堂| 麻豆国产欧美一区二区三区| 久久男人av| 国产精品久久观看| 欧美一级鲁丝片| 91精品一区国产高清在线gif| 国产中文一区| 国产毛片久久| 亚洲影视一区二区三区| 五月亚洲婷婷 | 国产欧美一区二区三区国产幕精品 | 欧美日一区二区在线观看| 久久精品xxxxx| 欧美日本三区| 免费亚洲一区| 久久久一二三| 噜噜噜躁狠狠躁狠狠精品视频 | 国产精品观看| 国产不卡精品| 91精品啪在线观看国产18 | 欧美aa国产视频| 免播放器亚洲| 日韩高清国产一区在线| 久久99蜜桃| 欧洲亚洲一区二区三区| 99精品在线免费在线观看| 欧美不卡在线| 日韩精品欧美成人高清一区二区| 国产精品调教视频| 91看片一区| 日韩中文字幕av电影| 欧美日韩夜夜| 中文在线а√天堂| 亚洲欧美日本日韩| 国产九九精品| 日韩欧美一区二区三区免费观看| 最新亚洲激情| 国产精品啊v在线| 香蕉人人精品| 欧美日韩网址| 美女av在线免费看| 婷婷亚洲综合| 国产毛片一区二区三区| 人人精品亚洲| 日韩激情一二三区| 欧产日产国产精品视频| 中文字幕日韩亚洲| 四虎成人av| 蜜臀a∨国产成人精品| 精品久久一区| 麻豆精品网站| 麻豆视频在线观看免费网站黄| 欧美中文字幕| 国产美女视频一区二区| 欧美综合另类| 日韩激情视频网站| 亚洲www免费| 日韩高清电影免费| 一区二区小说| 欧美一区网站| 激情婷婷亚洲| 欧美黄色一区二区| 99热精品在线观看| 国内揄拍国内精品久久| 日韩专区欧美专区| 国产精品成人一区二区不卡| 中文字幕一区二区三区四区久久 | 精品一区在线| 久久99蜜桃| 999在线观看精品免费不卡网站| 国产精成人品2018| 日韩专区欧美专区| 在线天堂资源www在线污| 日韩精品a在线观看91|