成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

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

深入解析PHP底層機制及相關原理

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

1、PHP是什么?

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

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

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

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

深入解析PHP底層機制及相關原理

(PHP 內部結構圖)

從內容模塊上來分:我們可以分為四層體系結構:

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

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

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

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

深入解析PHP底層機制及相關原理

(php結構 )

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

中間層(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通過通過一系列的接口,使得外部應用可以和php交換數(shù)據(jù)并可以根據(jù)不同應用特點實現(xiàn)特定的處理方法,我們常見的一些sapi有:

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

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

3)、cli :命令行調用的應用模式

如圖:Sapi的簡單示意圖

深入解析PHP底層機制及相關原理

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); // 關閉方法 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被調用時初始化操作,比如cgi模式,在startup的時候會加載所有的extension并執(zhí)行模塊初始化工作。

· shutdown:php關閉時收尾工作

· activate:請求初始化

· dectivate:請求結束時收尾工作

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

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

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

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

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

深入解析PHP底層機制及相關原理

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

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

目前語言分為兩類:

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

第二類語言:解釋型語言:如PHP,Ruby,Python。他們需要解釋器來執(zhí)行這些源代碼。實際上這些語言還是要經過編譯環(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

輸出結果顯然是: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底層機制及相關原理

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

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

4.2、詞法分析和語法分析

解釋器一般包括兩部分:

1)、 讀取源程序,并處理語言結構

2)、處于語言結構并生成目標程序

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

Lex生成詞法分析器。

Yacc語法分析生成器

4. 3、opcode

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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: PHP
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
成人福利电影精品一区二区在线观看| 蜜桃精品视频在线| 一区二区三区中文在线观看| 99热国产精品| 777久久久精品| 另类中文字幕网| 久久综合中文| 亚洲18色成人| 国产欧美在线| 亚洲男人的天堂网| 欧美视频福利| 久久九九影视网| 成人国产一区二区三区精品| 7777精品伊人久久久大香线蕉的| 一区二区三区自拍| 亚洲区一区二区三区| 中文字幕成人网| 欧美凹凸一区二区三区视频| 久久蜜桃一区二区| 99国产精品久| 国产亚洲午夜高清国产拍精品| 成人av在线网| 久久免费精品国产久精品久久久久| 色综合网色综合| 亚洲国产成人自拍| 欧美日韩三级电影在线| 中文字幕精品一区二区精品绿巨人| 91丝袜高跟美女视频| 久久先锋影音av| 99久久精品国产导航| 日韩美女主播在线视频一区二区三区| 精品一区二区三区不卡 | 国产精品视频免费一区| 一区二区三区加勒比av| 欧美亚洲三区| 秋霞av亚洲一区二区三| 91久久线看在观草草青青| 蜜臀久久久久久久| 欧美伊人精品成人久久综合97| 免费成人在线网站| 欧美日本在线一区| 羞羞视频在线观看欧美| 日韩高清一区在线| av成人免费观看| 亚洲自拍与偷拍| 国产精品免费区二区三区观看| 亚洲综合一区在线| 新狼窝色av性久久久久久| 亚洲国产成人av| 久久久夜夜夜| 成人免费av资源| 一区二区三区免费看视频| 一区二区在线不卡| 亚洲已满18点击进入久久| 六月天综合网| 免费视频一区二区| 欧美一区二区二区| 色综合中文字幕| 国产精品美女www爽爽爽| 99精品欧美一区二区三区| 香蕉成人伊视频在线观看| 欧美三级韩国三级日本一级| 高清成人免费视频| 久久九九影视网| 亚洲激情不卡| 日本系列欧美系列| 欧美一区二区三区免费观看视频| 欧美在线高清| 一区二区久久久久久| 91久久人澡人人添人人爽欧美| 国产91在线观看| 国产精品美女www爽爽爽| 久久精品二区| 久久99最新地址| 精品免费国产二区三区| 激情久久综合| 婷婷丁香激情综合| 日韩欧美一区二区久久婷婷| 欧美日韩91| 日韩电影在线免费| 精品福利av导航| 中文亚洲字幕| 九色porny丨国产精品| 久久综合九色综合欧美亚洲| 日韩视频二区| 欧美bbbbb| 精品国产99国产精品| 亚洲福利一区| 免费成人美女在线观看.| xnxx国产精品| 亚洲在线黄色| 国产精品 日产精品 欧美精品| 中文字幕不卡在线播放| 噜噜噜躁狠狠躁狠狠精品视频| 国产精品系列在线播放| 亚洲色图欧洲色图婷婷| 欧美日韩一区成人| 欧美日韩一区二区三区免费| 欧美a级一区二区| 久久久久久久久久久久电影 | 久久综合狠狠综合久久激情| 日韩亚洲欧美一区二区三区| 亚洲精品免费观看| 国产毛片精品视频| 亚洲精品菠萝久久久久久久| 91精品国产欧美一区二区成人 | 日韩欧美国产精品一区| av不卡免费看| 国产盗摄视频一区二区三区| 亚洲日本一区二区| 日韩午夜精品视频| 亚洲欧美久久| 在线成人av网站| 国产日韩一区二区三区在线| k8久久久一区二区三区| 午夜精品福利一区二区三区蜜桃| 精品国产电影一区二区| 性一交一乱一区二区洋洋av| 色综合天天性综合| 久久草av在线| 一卡二卡三卡日韩欧美| 久久网这里都是精品| 欧美性受xxxx| 亚洲作爱视频| av一区二区三区在线| 欧美a级理论片| 亚洲激情综合网| 久久久久久久av麻豆果冻| 久久综合九九| 亚洲午夜视频| 99精品欧美一区二区三区小说 | 一区二区国产视频| 久久色成人在线| 欧美日韩免费一区二区三区视频| 国内一区二区三区在线视频| 国产成人精品一区二| 琪琪一区二区三区| 亚洲综合一区二区| 中文字幕免费在线观看视频一区| 欧美乱熟臀69xxxxxx| 久久婷婷人人澡人人喊人人爽| 欧美日韩一区二区三区在线观看免| 国产一区二区三区最好精华液| 亚洲一区二区视频| 中文字幕av资源一区| 欧美zozo另类异族| 欧美日韩亚州综合| 久久综合图片| 国产一区二区三区奇米久涩| 色综合久久综合网| 国产成人午夜精品影院观看视频 | 欧美专区亚洲专区| 国产伦精品一区二区三区四区免费| 午夜国产精品视频免费体验区| 国产精品1区2区3区在线观看| 天天综合天天综合色| 亚洲老妇xxxxxx| 国产精品久久久久久久久晋中 | 久久嫩草精品久久久精品一| 欧美日韩黄色一区二区| 狼狼综合久久久久综合网| 国产日韩欧美在线播放不卡| 在线成人h网| 国产一区日韩欧美| 欧美黄污视频| 91网站最新网址| 99精品视频中文字幕| 成人av电影在线观看| 懂色中文一区二区在线播放| 精品在线你懂的| 蜜臀av一级做a爰片久久| 婷婷丁香激情综合| 婷婷久久综合九色综合绿巨人| 亚洲自拍偷拍欧美| 亚洲欧美另类图片小说| 自拍偷拍亚洲综合| 国产精品三级在线观看| 久久久不卡影院| 2021久久国产精品不只是精品| 7777精品伊人久久久大香线蕉完整版 | 亚洲精品国产一区二区精华液 | 91麻豆精品国产| 欧美乱熟臀69xxxxxx| 欧美日韩综合在线免费观看| 欧美亚洲国产一区二区三区va| 日本韩国欧美三级| 欧美在线视频日韩| 欧美色综合天天久久综合精品| 在线视频你懂得一区二区三区| 一本大道久久a久久综合婷婷| 久久精品午夜| 色婷婷一区二区三区四区| 91成人在线观看喷潮| 欧美综合在线视频| 欧美精品在线观看播放| 777奇米成人网| 精品久久久久一区| 国产清纯在线一区二区www| 国产精品久久久一区麻豆最新章节| 中文字幕精品一区|