电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

PHP內核探索 —— 如何執行PHP腳本:Zend引擎是如何解釋PHP腳本的

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

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

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

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

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

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

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

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

$ php ./hello.php

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

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

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

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

運行上面的腳本你將會看到一如下的輸出:

array ( 0 => array ( 0 => 368, // 腳本開始標記 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引擎詞法分析做的事情,將代碼切分為一個個的標記,然后使用語法分析器(PHP使用bison生成語法分析器, 規則見$PHP_SRC/Zend/zend_language_parser。y), bison根據規則進行相應的處理, 如果代碼找不到匹配的規則,也就是語法錯誤時Zend引擎會停止,并輸出錯誤信息。 比如缺少括號,或者不符合語法規則的情況都會在這個環節檢查。 在匹配到相應的語法規則后,Zend引擎還會進行編譯, 將代碼編譯為opcode, 完成后,Zend引擎會執行這些opcode, 在執行opcode的過程中還有可能會繼續重復進行編譯-執行, 例如執行eval,include/require等語句, 因為這些語句還會包含或者執行其他文件或者字符串中的腳本。

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

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

有關PHP腳本編譯執行的細節,請閱讀后面有關詞法分析,語法分析及opcode編譯相關內容。

標簽: PHP
相關文章:
主站蜘蛛池模板: 太阳能发电系统-太阳能逆变器,控制器-河北沐天太阳能科技首页 | 广州展台特装搭建商|特装展位设计搭建|展会特装搭建|特装展台制作设计|展览特装公司 | 电缆接头_防水接头_电缆防水接头 - 乐清市新豪电气有限公司 | 中医中药治疗血小板减少-石家庄血液病肿瘤门诊部 | 盛源真空泵|空压机-浙江盛源空压机制造有限公司-【盛源官网】 | 湿地保护| 激光内雕_led玻璃_发光玻璃_内雕玻璃_导光玻璃-石家庄明晨三维科技有限公司 激光内雕-内雕玻璃-发光玻璃 | 小程序开发公司_APP开发多少钱_软件开发定制_微信小程序制作_客户销售管理软件-济南小溪畅流网络科技有限公司 | 石英粉,滑石粉厂家,山东滑石粉-莱州市向阳滑石粉有限公司 | 818手游网_提供当下热门APP手游_最新手机游戏下载 | 便携式谷丙转氨酶检测仪|华图生物科技百科| BOE画框屏-触摸一体机-触控查询一体机-触摸屏一体机价格-厂家直销-触发电子 | 企业微信营销_企业微信服务商_私域流量运营_艾客SCRM官网 | 不锈钢复合板厂家_钛钢复合板批发_铜铝复合板供应-威海泓方金属复合材料股份有限公司 | 百度爱采购运营研究社社群-店铺托管-爱采购代运营-良言多米网络公司 | 真空干燥烘箱_鼓风干燥箱 _高低温恒温恒湿试验箱_光照二氧化碳恒温培养箱-上海航佩仪器 | 涂层测厚仪_光泽度仪_uv能量计_紫外辐照计_太阳膜测试仪_透光率仪-林上科技 | 井式炉-台车式回火炉-丹阳市电炉厂有限公司 | 餐饮小吃技术培训-火锅串串香培训「何小胖培训」_成都点石成金[官网] | 北京银联移动POS机办理_收银POS机_智能pos机_刷卡机_收银系统_个人POS机-谷骐科技【官网】 | 球形钽粉_球形钨粉_纳米粉末_难熔金属粉末-广东银纳官网 | 扬尘监测_扬尘监测系统_带证扬尘监测设备 - 郑州港迪科技有限公司 | 雄松华章(广州华章MBA)官网-专注MBA/MPA/MPAcc/MEM辅导培训 | 合同书格式和范文_合同书样本模板_电子版合同,找范文吧 | 葡萄酒灌装机-食用油灌装机-液体肥灌装设备厂家_青州惠联灌装机械 | 没斑啦-专业的祛斑美白嫩肤知识网站-去斑经验分享 | 国产离子色谱仪,红外分光测油仪,自动烟尘烟气测试仪-青岛埃仑通用科技有限公司 | 成都办公室装修-办公室设计-写字楼装修设计-厂房装修-四川和信建筑装饰工程有限公司 | PCB厂|线路板厂|深圳线路板厂|软硬结合板厂|电路板生产厂家|线路板|深圳电路板厂家|铝基板厂家|深联电路-专业生产PCB研发制造 | 防水套管-柔性防水套管-刚性防水套管-上海执品管件有限公司 | 阻燃剂-氢氧化镁-氢氧化铝-沥青阻燃剂-合肥皖燃新材料 | 上海租奔驰_上海租商务车_上海租车网-矢昂汽车服务公司 | 底部填充胶_电子封装胶_芯片封装胶_芯片底部填充胶厂家-东莞汉思新材料 | 成都顶呱呱信息技术有限公司-贷款_个人贷款_银行贷款在线申请 - 成都贷款公司 | 全自动五线打端沾锡机,全自动裁线剥皮双头沾锡机,全自动尼龙扎带机-东莞市海文能机械设备有限公司 | ★济南领跃标识制作公司★济南标识制作,标牌制作,山东标识制作,济南标牌厂 | 超声骨密度仪,双能X射线骨密度仪【起草单位】,骨密度检测仪厂家 - 品源医疗(江苏)有限公司 | CCC验厂-家用电器|服务器CCC认证咨询-奥测世纪 | 工业设计,人工智能,体验式3D展示的智能技术交流服务平台-纳金网 J.S.Bach 圣巴赫_高端背景音乐系统_官网 | SOUNDWELL 编码器|电位器|旋转编码器|可调电位器|编码开关厂家-广东升威电子制品有限公司 | 重庆轻质隔墙板-重庆安吉升科技有限公司 |