服务器之家

服务器之家 > 正文

深入解析PHP底层机制及相关原理

时间:2021-11-01 15:58     来源/作者:我为AI领域做了奉献

1、php是什么? 

php 指的是我们从外面看到的一套完整的系统。这听起来有点糊涂,但其实并不复杂(php4 内部结构图)。从功能上来分:我们可以分为三部分:

1、 解释器部分(zend 以引擎),负责对输入代码的分析、翻译和执行;

2、 功能性部分(php功能函数以及扩展),负责具体实现语言的各种功能(比如它的函数等等);

3、 接口部分(sapi),负责同 web 服务器的会话等功能。 zend包括了第一部分的全部和第二部分的局部,php内核 包括了第二部分的局部和第三部分的全部。他们合起来称之为 php 包。zend 构成了语言的核心,同时也包含了一些最基本的 php 预定义函数的实现。php 包(内核)则包含了所有创造出语言本身各种显著特性的模块。 

               深入解析PHP底层机制及相关原理

                                                                                                    (php 内部结构图)

 从内容模块上来分:我们可以分为四层体系结构:

1)zend引擎:zend整体用纯c实现,是php的内核部分,它将php代码翻译(词法、语法解析等一系列编译过程)为可执行opcode的处理并实现相应的处理方法、实现了基本的数据结构(如hashtable、oo)、内存分配及管理、提供了相应的api方法供外部调用,是一切的核心,所有的外围功能均围绕zend实现。

2)extensions扩展:围绕着zend引擎,extensions通过组件式的方式提供各种基础服务,我们常见的各种内置函数(如array系列)、标准库等都是通过extension来实现,用户也可以根据需要实现自己的extension以达到功能扩展、性能优化等目的(如贴吧正在使用的php中间层、富文本解析就是extension的典型应用)。

3)sapi :sapi全称是server application programming interface,也就是服务端应用编程接口,sapi通过一系列钩子函数,使得php可以和外围交互数据,这是php非常优雅和成功的一个设计,通过sapi成功的将php本身和上层应用解耦隔离,php可以不再考虑如何针对不同应用进行兼容,而应用本身也可以针对自己的特点实现不同的处理方式。

4)上层应用: 这就是我们平时编写的php程序,通过不同的sapi方式得到各种各样的应用模式,如通过webserver实现web应用、在命令行下以脚本方式运行等等。

          深入解析PHP底层机制及相关原理

                                                                              (php结构 )

其架构思想:引擎(zend)+扩展(ext)的模式:降低内部耦合

中间层(sapi):web server和php的通信接口, 隔绝web server和php。

如果php是一辆车,那么

车的框架就是php本身,即是我们外面看到一套完整系统。

zend是车的引擎(发动机)

ext下面的各种组件就是车的轮子

sapi可以看做是公路,车可以跑在不同类型的公路上

而一次php程序的执行就是汽车跑在公路上。

因此,我们需要:性能优异的引擎+合适的车轮+正确的跑道

2、php生命周期

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

3 、sapi

如前所述,sapi通过通过一系列的接口,使得外部应用可以和php交换数据并可以根据不同应用特点实现特定的处理方法,我们常见的一些sapi有:

1) 、apache2handler :这是以apache作为webserver,采用mod_php模式运行时候的处理方式,也是现在应用最广泛的一种。

2)、cgi :这是webserver和php直接的另一种交互方式,也就是大名鼎鼎的fastcgi协议,在最近今年fastcgi+php得到越来越多的应用,也是异步webserver所唯一支持的方式。

3)、cli :命令行调用的应用模式

如图:sapi的简单示意图

深入解析PHP底层机制及相关原理

 sapi的定义及主要接口函数:

struct _sapi_module_struct { char *name; // 名字标识 char *pretty_name; // 更好理解的名字 int (*startup)(struct _sapi_module_struct *sapi_module); // 启动函数 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路径 ... ...};

这里介绍一下其中一些主要函数

· startup:php被调用时初始化操作,比如cgi模式,在startup的时候会加载所有的extension并执行模块初始化工作。

· shutdown:php关闭时收尾工作

· activate:请求初始化

· dectivate:请求结束时收尾工作

· ub_write:指定数据输出方式,比如apache2handler方式,由于php作为apache的一个so存在,因此其输出也就是调 用apache的ap_write函数,而在cgi模式下,会系统调用write。

·  sapi_error:错误处理函数

·  read_post:读取post数据

·  register_server_variables:往$_server中注册环境变量这个一般根据不同协议标准注册注册的变量。

在php源码中,sapi实现了很多接口:如下图:

深入解析PHP底层机制及相关原理

4、php脚本的执行

sapi处于php架构的上层,而真正的脚本执行是有zend引擎来完成。

目前语言分为两类:

第一类:编译型语言.如c/c++ java之类,他们的共性是运行之前必须对源代码进行编译,然后运行编译后的目标文件。

第二类语言:解释型语言:如php,ruby,python。他们需要解释器来执行这些源代码。实际上这些语言还是要经过编译环节的。只不过他们在运行的时候进行编译,为了效率,并不是每次执行的时候都会重新编译,比如php的各种opcode缓存扩展(如apc xcache等)。

说明:php从2000年发布的php4开始就不是解释性语言。当一个php脚本被执行的时候,首先php源代码由zend引擎编译成名为zend opcodes的机器代码。这些代码保存在ram中。然后执行opcodes运行真正的脚本。因此,php实际上和java,c#等语言一样是编译语言。否则,它的执行会很慢。

我们来看php脚本是怎么被执行的。如hello.php:

<?php$str = "hello world!\n";echo $str;

命令行执行:php hello.php

输出结果显然是:hello world!

但是执行脚本的时候,php/zend做了什么呢?

4.1、程序的执行:

1)传递给php程序需要的执行文件hello.php,php程序完成基本的准备工作后启动php及zend引擎,加载注册的扩展模块。

2) 初始化完后读取脚本文件,zend引擎对脚本进行此词法分析,语法分析,然后有zend引擎编译成opcode码,最后执行 opcode码。

php代码的执行过程如下图:

                           深入解析PHP底层机制及相关原理

php实现了一个典型的动态语言执行过程:拿到一段代码后,经过词法解析、语法解析等阶段后,源程序会被翻译成一个个指令(opcodes),然后zend虚拟机顺次执行这些指令完成操作。php本身是用c实现的,因此最终调用的也都是c的函数,实际上,我们可以把php看做是一个c开发的软件。

通过上面描述不难看出,php的执行的核心是翻译出来的一条一条指令,也即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程序执行的最基本单位。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:https://blog.csdn.net/skiwnc/article/details/87632417

标签:

相关文章

热门资讯

yue是什么意思 网络流行语yue了是什么梗
yue是什么意思 网络流行语yue了是什么梗 2020-10-11
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全 2019-12-26
背刺什么意思 网络词语背刺是什么梗
背刺什么意思 网络词语背刺是什么梗 2020-05-22
2021年耽改剧名单 2021要播出的59部耽改剧列表
2021年耽改剧名单 2021要播出的59部耽改剧列表 2021-03-05
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总 2020-11-13
返回顶部