PHP机制与原理

2023-08-23 0 270

php一共有三个组件,Mach,zend发动机,以及扩充层。

PHPMach用以处置允诺,文档流,错误处置等相关操作方式。

zend发动机借以将示例切换为脚本词汇,然后在软件包上运转它。

扩充层是几组表达式,C#和流。

PHP采用它们来继续执行一些优点的操作方式。

比如说,他们须要采用mysql扩充来镜像资料库,当zend继续处理程序时可能会须要镜像若干个扩充,这是zend将驱动器交予扩充,等处置某一各项任务后在退还。

最后,zend将程序运转结论回到给PHPMach,它在将结论传输给SAP层,最终输入到应用程序上。

1:php的结构设计经营理念及特点

多民主化数学模型,PHP是多民主化数学模型,不同允诺之间彼此之间阻碍,这样确保了两个允诺读出来不会对Maubourguet服务项目造成影响。

php同时也支持多处理器数学模型。

php是弱类别词汇,两个表达式的类别不是一开始就确认维持不变,而是在运转中会确认并可能发生隐式或者隐式的隐式。这种监督机制的稳定性在web合作开发中非常方便快捷高效率。

2:PHP的三层管理体系。

PHP机制与原理

zend 发动机:zend发动机采用纯C同时实现,是PHP的Mach部分,他将PHP标识符译者(句法结构,句法导出等一连串过程)为可继续执行opcode的处置并同时实现适当的处置方式,同时实现了基本的计算机程序(如hashtabel oo)缓存重新分配及管理,提供更多了积极响应的api方式供内部初始化。是一切的核心理念,所有的西向机能均紧紧围绕zend发动机进行。

Extension:紧紧围绕zend发动机,extension透过组件方式提供更多各式各样基础服务项目,我们常用的各式各样内建表达式如array,标准库等都是透过extension来同时实现,使用者也可以根据须要同时实现自己的extendsion以达到机能扩充,操控性强化等目地。

Sapi sapi全称是Server Application programming Interface,也就是服务项目端应用编程接口,sapi透过一连串钩子表达式,使得PHP可以和西向交互数据。这是php非常优雅和成功的两个结构设计。

上层应用:这就是我们平时编程php程序,透过不同的sapi方式得到各式各样各样的应用模式透过web服务项目器同时实现web应用。在命令行下以脚本方式运转等等。

底层动态类别同时实现:

php是透过两个结构体来存储所有的表达式的。结构体如下:

typedef struct _zval_struct zval

typedef struct _zval_struct {

/* Variable information */

zvalue_value value;

zend_uint refcount_gc;

zend_uchar type;

zend_uint is_ref_gc;

}

解释一下几个表达式的意义:

zend_value value 储存的值,此处是两个指针,指到两个union的指针。php本身的值就是存储在这个联合体中。

zend_uint is_refcount 存储的是引用计数

zend_uchar type 存储表达式的类别。

zend_uint is_ref_gc 是否是引用传值。

php中所有的结构都是从用这个结构同时实现的。其中最关键的字段就是里面的type字段了。

type字段一共有7个值,分别是:

IS_NULL,IS_BOOL,IS_LONG,IS_DOUBLE,IS_STRING,IS_ARRAY,IS_OBJECT,IS_RESOURCE。

这个里面包含了所有的php基本类别:

标量类别:

复合类别:

特殊类别:

IS_BOOL,IS_lONG,IS_DOUBLE,IS_STRINGIS_ARRAY,IS_OBJECTIS_RESOURCE,IS_NULL

zval结构根据不同的类别,其zval结构中的zval字段指向的联合体中存储不同的值.这个联合体就是php中同两个表达式可以存储不同的值的关键.结构如下:

typedef union _zval_value{

long *lval;

double *dval;

struct {

char *val;

int len;

}str;

HashTable *ht;

zend_object_value obj;

}

从这个结构里可以看出php中所有表达式的痕迹:

IS_BOOL(boolen),是存储在lval里面,和整数存储师一样的。这里大家应该想到==和===对于false和0处置的不同之处了。

IS_LONG(整型),存储在lval

IS_DOUBLE(浮点型),存储在dval

IS_STRING(字符串),存储在str

IS_ARRAY(数组),存储在*ht哈希table中

IS_OBJECT(对象),存储在zend_object_value

IS_NULL,NULL值在这个结构中不用存储,直接在zval结构中的type字段进行判断。

简单的介绍一下字符串的存储:

字符串的在联合体中采用结构体的形式出现,标识符如下:

struct {

char *val;

int len;

}str;

可以看到,php在存储字符串时,将字符串的内容和长度都存了起来,这是为了避免重复计算字符串的长度。php中的表达式strlen,就是直接回到了这个长度。

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务