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

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

深入解析PHP底層機制及相關(guān)原理

瀏覽:129日期:2022-09-08 14:26:26

1、PHP是什么?

PHP 指的是我們從外面看到的一套完整的系統(tǒng)。這聽起來有點糊涂,但其實并不復(fù)雜(PHP4 內(nèi)部結(jié)構(gòu)圖)。從功能上來分:我們可以分為三部分:

1、 解釋器部分(Zend 以引擎),負責(zé)對輸入代碼的分析、翻譯和執(zhí)行;

2、 功能性部分(PHP功能函數(shù)以及擴展),負責(zé)具體實現(xiàn)語言的各種功能(比如它的函數(shù)等等);

3、 接口部分(SAPI),負責(zé)同 WEB 服務(wù)器的會話等功能。 Zend包括了第一部分的全部和第二部分的局部,PHP內(nèi)核 包括了第二部分的局部和第三部分的全部。他們合起來稱之為 PHP 包。Zend 構(gòu)成了語言的核心,同時也包含了一些最基本的 PHP 預(yù)定義函數(shù)的實現(xiàn)。PHP 包(內(nèi)核)則包含了所有創(chuàng)造出語言本身各種顯著特性的模塊。

深入解析PHP底層機制及相關(guān)原理

(PHP 內(nèi)部結(jié)構(gòu)圖)

從內(nèi)容模塊上來分:我們可以分為四層體系結(jié)構(gòu):

1)Zend引擎:Zend整體用純c實現(xiàn),是php的內(nèi)核部分,它將php代碼翻譯(詞法、語法解析等一系列編譯過程)為可執(zhí)行opcode的處理并實現(xiàn)相應(yīng)的處理方法、實現(xiàn)了基本的數(shù)據(jù)結(jié)構(gòu)(如hashtable、oo)、內(nèi)存分配及管理、提供了相應(yīng)的api方法供外部調(diào)用,是一切的核心,所有的外圍功能均圍繞zend實現(xiàn)。

2)Extensions擴展:圍繞著zend引擎,extensions通過組件式的方式提供各種基礎(chǔ)服務(wù),我們常見的各種內(nèi)置函數(shù)(如array系列)、標準庫等都是通過extension來實現(xiàn),用戶也可以根據(jù)需要實現(xiàn)自己的extension以達到功能擴展、性能優(yōu)化等目的(如貼吧正在使用的php中間層、富文本解析就是extension的典型應(yīng)用)。

3)Sapi :Sapi全稱是Server Application Programming Interface,也就是服務(wù)端應(yīng)用編程接口,sapi通過一系列鉤子函數(shù),使得php可以和外圍交互數(shù)據(jù),這是php非常優(yōu)雅和成功的一個設(shè)計,通過sapi成功的將php本身和上層應(yīng)用解耦隔離,php可以不再考慮如何針對不同應(yīng)用進行兼容,而應(yīng)用本身也可以針對自己的特點實現(xiàn)不同的處理方式。

4)上層應(yīng)用: 這就是我們平時編寫的php程序,通過不同的sapi方式得到各種各樣的應(yīng)用模式,如通過webserver實現(xiàn)web應(yīng)用、在命令行下以腳本方式運行等等。

深入解析PHP底層機制及相關(guān)原理

(php結(jié)構(gòu) )

其架構(gòu)思想:引擎(Zend)+擴展(ext)的模式:降低內(nèi)部耦合

中間層(sapi):web server和php的通信接口, 隔絕web server和php。

如果php是一輛車,那么

車的框架就是php本身,即是我們外面看到一套完整系統(tǒng)。

Zend是車的引擎(發(fā)動機)

Ext下面的各種組件就是車的輪子

Sapi可以看做是公路,車可以跑在不同類型的公路上

而一次php程序的執(zhí)行就是汽車跑在公路上。

因此,我們需要:性能優(yōu)異的引擎+合適的車輪+正確的跑道

2、php生命周期

查看:深入理解php底層:php生命周期 :http://blog.csdn.net/hguisu/article/details/7377520

3 、sapi

如前所述,sapi通過通過一系列的接口,使得外部應(yīng)用可以和php交換數(shù)據(jù)并可以根據(jù)不同應(yīng)用特點實現(xiàn)特定的處理方法,我們常見的一些sapi有:

1) 、apache2handler :這是以apache作為webserver,采用mod_php模式運行時候的處理方式,也是現(xiàn)在應(yīng)用最廣泛的一種。

2)、cgi :這是webserver和php直接的另一種交互方式,也就是大名鼎鼎的fastcgi協(xié)議,在最近今年fastcgi+php得到越來越多的應(yīng)用,也是異步webserver所唯一支持的方式。

3)、cli :命令行調(diào)用的應(yīng)用模式

如圖:Sapi的簡單示意圖

深入解析PHP底層機制及相關(guān)原理

Sapi的定義及主要接口函數(shù):

struct _sapi_module_struct { char *name; // 名字標識 char *pretty_name; // 更好理解的名字 int (*startup)(struct _sapi_module_struct *sapi_module); // 啟動函數(shù) int (*shutdown)(struct _sapi_module_struct *sapi_module); // 關(guān)閉方法 int (*activate)(TSRMLS_D); //激活 int (*deactivate)(TSRMLS_D); // 停用 int (*ub_write)(const char *str, unsigned int str_length TSRMLS_DC); // 沒有緩存的寫操作(unbuffered write) void (*flush)(void *server_context); // flush struct stat *(*get_stat)(TSRMLS_D); // get uid char *(*getenv)(char *name, size_t name_len TSRMLS_DC); // getenv void (*sapi_error)(int type, const char *error_msg, ...); /* error handler */ int (*header_handler)(sapi_header_struct *sapi_header, sapi_header_op_enum op, sapi_headers_struct *sapi_headers TSRMLS_DC); /* header handler */ /* send headers handler */ int (*send_headers)(sapi_headers_struct *sapi_headers TSRMLS_DC); void (*send_header)(sapi_header_struct *sapi_header, void *server_context TSRMLS_DC); /* send header handler */ int (*read_post)(char *buffer, uint count_bytes TSRMLS_DC); /* read POST data */ char *(*read_cookies)(TSRMLS_D); /* read Cookies */ /* register server variables */ void (*register_server_variables)(zval *track_vars_array TSRMLS_DC); void (*log_message)(char *message); /* Log message */ time_t (*get_request_time)(TSRMLS_D); /* Request Time */ void (*terminate_process)(TSRMLS_D); /* Child Terminate */ char *php_ini_path_override; //覆蓋ini路徑 ... ...};

這里介紹一下其中一些主要函數(shù)

· startup:php被調(diào)用時初始化操作,比如cgi模式,在startup的時候會加載所有的extension并執(zhí)行模塊初始化工作。

· shutdown:php關(guān)閉時收尾工作

· activate:請求初始化

· dectivate:請求結(jié)束時收尾工作

· ub_write:指定數(shù)據(jù)輸出方式,比如apache2handler方式,由于php作為apache的一個so存在,因此其輸出也就是調(diào) 用apache的ap_write函數(shù),而在cgi模式下,會系統(tǒng)調(diào)用write。

· sapi_error:錯誤處理函數(shù)

· read_post:讀取post數(shù)據(jù)

· register_server_variables:往$_SERVER中注冊環(huán)境變量這個一般根據(jù)不同協(xié)議標準注冊注冊的變量。

在php源碼中,sapi實現(xiàn)了很多接口:如下圖:

深入解析PHP底層機制及相關(guān)原理

4、php腳本的執(zhí)行

SAPI處于PHP架構(gòu)的上層,而真正的腳本執(zhí)行是有Zend引擎來完成。

目前語言分為兩類:

第一類:編譯型語言.如c/c++ java之類,他們的共性是運行之前必須對源代碼進行編譯,然后運行編譯后的目標文件。

第二類語言:解釋型語言:如PHP,Ruby,Python。他們需要解釋器來執(zhí)行這些源代碼。實際上這些語言還是要經(jīng)過編譯環(huán)節(jié)的。只不過他們在運行的時候進行編譯,為了效率,并不是每次執(zhí)行的時候都會重新編譯,比如PHP的各種opcode緩存擴展(如APC Xcache等)。

說明:PHP從2000年發(fā)布的PHP4開始就不是解釋性語言。當一個PHP腳本被執(zhí)行的時候,首先PHP源代碼由Zend引擎編譯成名為Zend opcodes的機器代碼。這些代碼保存在RAM中。然后執(zhí)行opcodes運行真正的腳本。因此,PHP實際上和Java,C#等語言一樣是編譯語言。否則,它的執(zhí)行會很慢。

我們來看PHP腳本是怎么被執(zhí)行的。如hello.php:

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

命令行執(zhí)行:php hello.php

輸出結(jié)果顯然是:Hello world!

但是執(zhí)行腳本的時候,PHP/Zend做了什么呢?

4.1、程序的執(zhí)行:

1)傳遞給php程序需要的執(zhí)行文件hello.php,php程序完成基本的準備工作后啟動PHP及Zend引擎,加載注冊的擴展模塊。

2) 初始化完后讀取腳本文件,Zend引擎對腳本進行此詞法分析,語法分析,然后有Zend引擎編譯成opcode碼,最后執(zhí)行 opcode碼。

php代碼的執(zhí)行過程如下圖:

深入解析PHP底層機制及相關(guān)原理

php實現(xiàn)了一個典型的動態(tài)語言執(zhí)行過程:拿到一段代碼后,經(jīng)過詞法解析、語法解析等階段后,源程序會被翻譯成一個個指令(opcodes),然后ZEND虛擬機順次執(zhí)行這些指令完成操作。PHP本身是用c實現(xiàn)的,因此最終調(diào)用的也都是c的函數(shù),實際上,我們可以把php看做是一個c開發(fā)的軟件。

通過上面描述不難看出,php的執(zhí)行的核心是翻譯出來的一條一條指令,也即opcode.

4.2、詞法分析和語法分析

解釋器一般包括兩部分:

1)、 讀取源程序,并處理語言結(jié)構(gòu)

2)、處于語言結(jié)構(gòu)并生成目標程序

而Lex和Yacc可以解決第一個問題。很多編程都有Lex/Yacc作為語言的詞法語法分析生成器,比如PHP,Python、Ruby已經(jīng)MySql的sql語言。

Lex生成詞法分析器。

Yacc語法分析生成器

4. 3、opcode

PHP 構(gòu)建在Zend虛擬機(Zend VM)之上的,PHP的opcode就是ZEND 虛擬機中的指令,即Opcode是php程序執(zhí)行的最基本單位。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標簽: PHP
相關(guān)文章:
主站蜘蛛池模板: 丙烷/液氧/液氮气化器,丙烷/液氧/液氮汽化器-无锡舍勒能源科技有限公司 | 苏州注册公司_苏州代理记账_苏州工商注册_苏州代办公司-恒佳财税 | LZ-373测厚仪-华瑞VOC气体检测仪-个人有毒气体检测仪-厂家-深圳市深博瑞仪器仪表有限公司 | 工装定制/做厂家/公司_工装订做/制价格/费用-北京圣达信工装 | 广东西屋电气有限公司-广东西屋电气有限公司 | 江西自考网-江西自学考试网 | 成都租车_成都租车公司_成都租车网_众行宝 | 烟气在线监测系统_烟气在线监测仪_扬尘检测仪_空气质量监测站「山东风途物联网」 | 仓储笼_仓储货架_南京货架_仓储货架厂家_南京货架价格低-南京一品仓储设备制造公司 | 辐射色度计-字符亮度测试-反射式膜厚仪-苏州瑞格谱光电科技有限公司 | 行吊_电动单梁起重机_双梁起重机_合肥起重机_厂家_合肥市神雕起重机械有限公司 | 坏男孩影院-提供最新电影_动漫_综艺_电视剧_迅雷免费电影最新观看 | 板式换网器_柱式换网器_自动换网器-郑州海科熔体泵有限公司 | 青州开防盗门锁-配汽车芯片钥匙-保险箱钥匙-吉祥修锁店 | 蓝鹏测控平台 - 智慧车间系统 - 车间生产数据采集与分析系统 | 反渗透水处理设备|工业零排放|水厂设备|软化水设备|海南净水设备--海南水处理设备厂家 | 哈希PC1R1A,哈希CA9300,哈希SC4500-上海鑫嵩实业有限公司 | 山东活动策划|济南活动公司|济南公关活动策划-济南锐嘉广告有限公司 | 卓能JOINTLEAN端子连接器厂家-专业提供PCB接线端子|轨道式端子|重载连接器|欧式连接器等电气连接产品和服务 | 深圳公司注册-工商注册代理-注册公司流程和费用_护航财税 | 蓄电池回收,ups电池后备电源回收,铅酸蓄电池回收,机房电源回收-广州益夫铅酸电池回收公司 | 桐城新闻网—桐城市融媒体中心主办 | 烟气在线监测系统_烟气在线监测仪_扬尘检测仪_空气质量监测站「山东风途物联网」 | 太平洋亲子网_健康育儿 品质生活 | 贴板式电磁阀-不锈钢-气动上展式放料阀-上海弗雷西阀门有限公司 工业机械三维动画制作 环保设备原理三维演示动画 自动化装配产线三维动画制作公司-南京燃动数字 | 精密交叉滚子轴承厂家,转盘轴承,YRT转台轴承-洛阳千协轴承 | 软文发布-新闻发布推广平台-代写文章-网络广告营销-自助发稿公司媒介星 | 压力控制器,差压控制器,温度控制器,防爆压力控制器,防爆温度控制器,防爆差压控制器-常州天利智能控制股份有限公司 | 手持式线材张力计-套帽式风量罩-深圳市欧亚精密仪器有限公司 | 导电银胶_LED封装导电银胶_半导体封装导电胶厂家-上海腾烁 | 成都装修公司-成都装修设计公司推荐-成都朗煜装饰公司 | jrs高清nba(无插件)直播-jrs直播低调看直播-jrs直播nba-jrs直播 上海地磅秤|电子地上衡|防爆地磅_上海地磅秤厂家–越衡称重 | 镀锌角钢_槽钢_扁钢_圆钢_方矩管厂家_镀锌花纹板-海邦钢铁(天津)有限公司 | 体检车_移动CT车_CT检查车_CT车_深圳市艾克瑞电气有限公司移动CT体检车厂家-深圳市艾克瑞电气有限公司 | 北京自然绿环境科技发展有限公司专业生产【洗车机_加油站洗车机-全自动洗车机】 | 济南ISO9000认证咨询代理公司,ISO9001认证,CMA实验室认证,ISO/TS16949认证,服务体系认证,资产管理体系认证,SC食品生产许可证- 济南创远企业管理咨询有限公司 郑州电线电缆厂家-防火|低压|低烟无卤电缆-河南明星电缆 | 活性氧化铝|无烟煤滤料|活性氧化铝厂家|锰砂滤料厂家-河南新泰净水材料有限公司 | 锂离子电池厂家-山东中信迪生电源| RV减速机-蜗轮蜗杆减速机-洗车机减速机-减速机厂家-艾思捷 | 合肥展厅设计-安徽展台设计-合肥展览公司-安徽奥美展览工程有限公司 | 东莞市海宝机械有限公司-不锈钢分选机-硅胶橡胶-生活垃圾-涡电流-静电-金属-矿石分选机 |