当前位置:首页全部内容PHP机制与原理

PHP机制与原理

php总共有三个模块,内核,zend引擎,以及扩展层。

PHP内核用来处理请求,文件流,错误处理等相关操作。

zend引擎用以将源文件转换为机器语言,然后在虚拟机上运行它。

扩展层是一组函数,类库和流。

PHP使用它们来执行一些特性的操作。

比如,我们需要使用mysql扩展来链接数据库,当zend执行程序时可能会需要链接若干扩展,这是zend将控制器交给扩展,等处理特定任务后在返还。

最后,zend将程序运行结果返回给PHP内核,它在将结果传送给SAP层,最终输出到浏览器上。

1:php的设计理念及特点

多进程模型,PHP是多进程模型,不同请求之间互不干扰,这样保证了一个请求挂掉不会对全盘服务造成影响。

php同时也支持多线程模型。

php是弱类型语言,一个变量的类型不是一开始就确定不变,而是在运行中会确定并可能发生隐式或者显式的类型转换。这种机制的灵活性在web开发中非常方便高效。

2:PHP的四层体系。

zend 引擎:zend引擎使用纯C实现,是PHP的内核部分,他将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,就是直接返回了这个长度。

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。
0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧