From 560c547d6defc922b31b820ef181bb84997631e3 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Sat, 4 Mar 2017 22:18:21 +0800 Subject: [PATCH 001/379] finish class --- README.md | 7 +++---- zend_class.md | 2 +- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 597d997..0e96168 100644 --- a/README.md +++ b/README.md @@ -16,11 +16,10 @@ * [3.2.2 用户函数的实现](function_implement.md#用户自定义函数的实现) * [3.3 Zend引擎执行流程](zend_executor.md) * 3.4 面向对象实现 - * 3.4.1 类(zend_class.md) + * [3.4.1 类](zend_class.md) * 3.4.2 对象(zend_object.md) - * 3.4.3 成员属性和方法 - * 3.4.4 魔术方法 - * 3.4.5 抽象类和接口 + * 3.4.3 魔术方法 + * 3.4.4 抽象类和接口 * [第4章 PHP语法实现](php_language.md) * 4.1 变量 * 4.2 运算符 diff --git a/zend_class.md b/zend_class.md index a14a6bc..0195265 100644 --- a/zend_class.md +++ b/zend_class.md @@ -200,4 +200,4 @@ __静态成员变量保存在类中,各对象共享同一份数据,而普通 ![zend_class_function](img/zend_class_function.png) - +成员方法的调用与普通function过程相同,根据对象所属class取到method编译的op_array,然后执行,具体的过程上一节已经介绍过[《3.3 Zend引擎执行过程》](zend_executor.md),下一节介绍对象的时候我们再从一个示例具体追踪下详细的调用过程。 From 912720a41f530c68b3fb9d186c9a6c8de30992a2 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Tue, 7 Mar 2017 20:09:36 +0800 Subject: [PATCH 002/379] update class contant --- zend_class.md | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/zend_class.md b/zend_class.md index 0195265..421e864 100644 --- a/zend_class.md +++ b/zend_class.md @@ -122,7 +122,7 @@ class User extends Human 在接下来的小节中我们将对类的常量、成员属性、成员方法的实现具体分析。 #### 3.4.1.2 类常量 -PHP中可以把在类中始终保持不变的值定义为常量,在定义和使用常量的时候不需要使用 $ 符号,常量的值必须是一个定值,不能是变量、数学运算的结果或函数调用,也就是说它是只读的,无法进行赋值。 +PHP中可以把在类中始终保持不变的值定义为常量,在定义和使用常量的时候不需要使用 $ 符号,常量的值必须是一个定值(如布尔型、整形、字符串、数组,php5.*不支持数组),不能是变量、数学运算的结果或函数调用,也就是说它是只读的,无法进行赋值。 常量通过__const__定义: ```php @@ -134,6 +134,30 @@ class my_class { 常量是类维度的数据(而不是对象的),它们通过`zend_class_entry.constants_table`进行存储,这是一个哈希结构,通过__常量名__索引,value就是具体定义的常量值。 +__常量的读取:__ + +根据前面我们对PHP opcode已有的了解,我们可以猜测常量访问的opcode的组成:常量名保存在literals中(其op_type = IS_CONST),执行时先取出常量名,然后去zend_class_entry.constants_table哈希表中索引到具体的常量值即可。 + +事实上我们的这个猜测并不是完全正确的,因为有的情况确实是我们猜想的那样,但是还有另外一种情况,下面具体举两个例子: + +```php +//示例1 +echo my_class::A1; + +class my_class { + const A1 = "hi"; +} +``` +```php +//示例2 + +class my_class { + const A1 = "hi"; +} + +echo my_class::A1; +``` + #### 3.4.1.3 成员属性 类的变量成员叫做“属性”。属性声明是由关键字 __public__,__protected__ 或者 __private__ 开头,然后跟一个普通的变量声明来组成,关于这三个关键字这里不作讨论,后面分析可见性的章节再作说明。 From 0d8da4e27c7933c8b37302ed16b0ef1edad025cf Mon Sep 17 00:00:00 2001 From: qinpeng Date: Wed, 8 Mar 2017 11:26:50 +0800 Subject: [PATCH 003/379] update compile --- README.md | 2 ++ img/zend_compile2.png | Bin 0 -> 2991 bytes img/zend_compile_process.png | Bin 0 -> 20012 bytes zend_compile.md | 28 ++++++++++++++++++++-------- 4 files changed, 22 insertions(+), 8 deletions(-) create mode 100644 img/zend_compile2.png create mode 100644 img/zend_compile_process.png diff --git a/README.md b/README.md index 0e96168..18f5561 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,8 @@ (更新中...) +文中涉及代码版本:php-7.0.12 + * 第1章 PHP基本架构 * 1.1 基本概念(base_introduction.md) * [1.2 PHP框架执行流程](base_process.md) diff --git a/img/zend_compile2.png b/img/zend_compile2.png new file mode 100644 index 0000000000000000000000000000000000000000..5fa0a57c89a54b80c85d914ceaf96b677ecc866a GIT binary patch literal 2991 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 J#9hB1{U3D2zFGhP literal 0 HcmV?d00001 diff --git a/img/zend_compile_process.png b/img/zend_compile_process.png new file mode 100644 index 0000000000000000000000000000000000000000..0f5f8d8b9d999f98be242851f4c348ea5ab558b0 GIT binary patch literal 20012 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 @@ -64,12 +66,15 @@ err: ? err: ``` -![zend_compile](img/zend_compile.png) +### 3.1.2 编译过程 +PHP编译阶段的基本过程如下图: -### 3.1.2 编译输出 +![zend_compile_process](img/zend_compile_process.png) PHP编译最终生成的opcode数组结构为: +![zend_compile](img/zend_compile.png) + ```c struct _zend_op_array { //common是普通函数或类成员方法对应的opcodes快速访问时使用的字段,后面分析PHP函数实现的时候会详细讲 @@ -92,17 +97,20 @@ struct _zend_op_array { uint32_t last; zend_op *opcodes; //opcode指令 - int last_var;//PHP代码里定义的变量数:op_type为IS_CV的变量 - uint32_t T; //临时变量数:op_type为IS_TMP_VAR、IS_VAR的变量 - zend_string **vars; //PHP变量名列表 + //PHP代码里定义的变量数:op_type为IS_CV的变量,不含IS_TMP_VAR、IS_VAR的 + int last_var; + //临时变量数:op_type为IS_TMP_VAR、IS_VAR的变量 + uint32_t T; + //PHP变量名列表 + zend_string **vars; int last_brk_cont; int last_try_catch; zend_brk_cont_element *brk_cont_array; zend_try_catch_element *try_catch_array; - /* static variables support */ - HashTable *static_variables; //静态变量符号表 + //静态变量符号表:通过static声明的 + HashTable *static_variables; zend_string *filename; //PHP文件路径 uint32_t line_start; @@ -110,10 +118,14 @@ struct _zend_op_array { zend_string *doc_comment; uint32_t early_binding; /* the linked list of delayed declarations */ + //字面量数量 int last_literal; - zval *literals; //字面量(常量)数组 + //字面量(常量)数组,这些都是在PHP代码定义的一些值 + zval *literals; + //运行时缓存数组大小 int cache_size; + //运行时缓存,主要用于缓存一些znode_op以便于快速获取数据,后面单独介绍这个机制 void **run_time_cache; void *reserved[ZEND_MAX_RESERVED_RESOURCES]; From 8a1325f88c1caa0db44eed6268ba984d27ae27c8 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Wed, 8 Mar 2017 13:30:13 +0800 Subject: [PATCH 004/379] update --- zend_compile.md | 41 +++++++++++++++++++++++++---------------- 1 file changed, 25 insertions(+), 16 deletions(-) diff --git a/zend_compile.md b/zend_compile.md index d9d3f49..17c145d 100644 --- a/zend_compile.md +++ b/zend_compile.md @@ -10,7 +10,7 @@ C程序在编译时将一行行代码编译为机器码,每一个操作都认 同样,PHP的编译与普通的C程序类似,只是PHP代码没有编译成机器码,而是解析成了若干条opcode数组,每条opcode就是C里面普通的struct,含义对应C程序的机器指令,执行的过程就是引擎依次执行opcode,比如我们在PHP里定义一个变量:`$a = 123;`,最终到内核里执行就是malloc一块内存,然后把值写进去。 -所以PHP的解析过程任务就是将PHP代码转化为opcode数组,代码里的所有信息都保存在opcode中,然后将opcode数组交给zend引擎执行,opcode就是内核具体执行的命令,比如赋值、加减操作、函数调用等,每一条opcode都对应一个处理handle,这些handler全部是提前定义好的C函数。 +所以PHP的解析过程任务就是将PHP代码转化为opcode数组,代码里的所有信息都保存在opcode中,然后将opcode数组交给zend引擎执行,opcode就是内核具体执行的命令,比如赋值、加减操作、函数调用等,每一条opcode都对应一个处理handle,这些handler是提前定义好的C函数。 从PHP代码到opcode是怎么实现的?最容易想到的方式就是正则匹配,当然过程没有这么简单。PHP编译过程包括词法分析、语法分析,使用re2c、bison完成,旧的PHP版本直接生成了opcode,PHP7新增了抽象语法树(AST),在语法分析阶段生成AST,然后再生成opcode数组。 @@ -71,7 +71,9 @@ PHP编译阶段的基本过程如下图: ![zend_compile_process](img/zend_compile_process.png) -PHP编译最终生成的opcode数组结构为: +zendparse、zend_compile_top_stmt的过程没作深入研究,这里只大致说下这两个过程:zendparse是词法、语法分析过程,即前面提到的re2c、bison,这个过程将PHP代码解析为AST,解析过程确定了当前脚本定义了哪些变量,为这些变量按照顺序编号,这些值在使用时都是按照这个编号获取的,另外也将变量的初始化值、调用的函数/类/常量名称等值(称之为字面量)保存到zend_op_array.literals中,这些字面量也有一个唯一的编号,所以执行的过程实际就是根据各指令调用不同的C函数,然后根据变量、字面量、临时变量的编号对这些值进行处理加工。 + +PHP编译阶段最终的产物—opcode数组结构为: ![zend_compile](img/zend_compile.png) @@ -95,7 +97,8 @@ struct _zend_op_array { uint32_t this_var; uint32_t last; - zend_op *opcodes; //opcode指令 + //opcode指令数组 + zend_op *opcodes; //PHP代码里定义的变量数:op_type为IS_CV的变量,不含IS_TMP_VAR、IS_VAR的 int last_var; @@ -270,13 +273,21 @@ ZEND_API void zend_vm_set_opcode_handler(zend_op* op) #define _CV_CODE 4 ``` -#### 3.1.2.2 操作数 - -每条opcode都有两个操作数(不一定都有用)、一个返回值,其中handler是具体执行的方法,handler通过opcode、op1_type、op2_type三个值索引到,每条opcode都最多有(5*5)个不同的处理handler,后面分析zend执行的时候再具体讲这块。 +#### 3.1.2.2 操作数(znode_op) +操作数类型实际就是个32位整形,它主要用于存储一些变量的索引位置、数值记录等等。 -操作数记录着当前指令的关键信息,可以用于变量的存储、访问,比如赋值语句:"$a = 45;",两个操作数分别记录"$a"、"45"的存储位置,执行时根据op2取到值"45",然后赋值给"$a",而"$a"的位置通过op1获取到。当然操作数并不是全部这么用的,上面只是赋值时候的情况,其它操作会有不同的用法,如函数调用时的传参,op1记录的就是传递的参数是第几个,op2记录的是参数的存储位置,result记录的是函数接收参数的存储位置。 +```c +typedef union _znode_op { + uint32_t constant; + uint32_t var; + uint32_t num; + uint32_t opline_num; /* Needs to be signed */ + uint32_t jmp_offset; +} znode_op; +``` +每条opcode都有两个操作数(不一定都用到),操作数记录着当前指令的关键信息,可以用于变量的存储、访问,比如赋值语句:"$a = 45;",两个操作数分别记录"$a"、"45"的存储位置,执行时根据op2取到值"45",然后赋值给"$a",而"$a"的位置通过op1获取到。当然操作数并不是全部这么用的,上面只是赋值时候的情况,其它操作会有不同的用法,如函数调用时的传参,op1记录的就是传递的参数是第几个,op2记录的是参数的存储位置,result记录的是函数接收参数的存储位置。 -#### 3.1.2.3 操作数类型 +#### 3.1.2.3 操作数类型(op_type) 每个操作都有5种不同的类型: @@ -287,15 +298,15 @@ ZEND_API void zend_vm_set_opcode_handler(zend_op* op) #define IS_UNUSED (1<<3) //8 #define IS_CV (1<<4) //16 ``` -* IS_CONST 常量(字面量),编译时就可确定且不会改变的值,比如:$a = "hello~",其中字符串"hello~"就是常量 -* IS_TMP_VAR 临时变量,比如:$a = "hello~" . time(),其中`"hello~" . time()`的值类型就是IS_TMP_VAR,再比如:$a = "123" + $b,`"123" + $b`的结果类型也是IS_TMP_VAR,从这两个例子可以猜测,临时变量多是执行期间其它类型组合现生成的一个中间值,由于它是现生成的,所以把IS_TMP_VAR赋值给IS_CV变量时不会增加其引用计数 -* IS_VAR PHP变量,这个很容易认为是PHP脚本里的变量,其实不是,这里PHP变量的含义可以这样理解:PHP变量是没有显式的在PHP脚本中定义的,不是直接在代码通过`$var_name`定义的。这个类型最常见的例子是PHP函数的返回值,再如`$a[0]`数组这种,它取出的值也是`IS_VAR`,再比如`$$a`这种 -* IS_UNUSED 表示操作数没有用 -* IS_CV PHP脚本变量,即脚本里通过`$var_name`定义的变量,这些变量是编译阶段确定的,所以是compile variable, +* IS_CONST:字面量,编译时就可确定且不会改变的值,比如:$a = "hello~",其中字符串"hello~"就是常量 +* IS_TMP_VAR:临时变量,比如:$a = "hello~" . time(),其中`"hello~" . time()`的值类型就是IS_TMP_VAR,再比如:$a = "123" + $b,`"123" + $b`的结果类型也是IS_TMP_VAR,从这两个例子可以猜测,临时变量多是执行期间其它类型组合现生成的一个中间值,由于它是现生成的,所以把IS_TMP_VAR赋值给IS_CV变量时不会增加其引用计数 +* IS_VAR:PHP变量,这个很容易认为是PHP脚本里的变量,其实不是,这里PHP变量的含义可以这样理解:PHP变量是没有显式的在PHP脚本中定义的,不是直接在代码通过`$var_name`定义的。这个类型最常见的例子是PHP函数的返回值,再如`$a[0]`数组这种,它取出的值也是`IS_VAR`,再比如`$$a`这种 +* IS_UNUSED:表示操作数没有用 +* IS_CV:PHP脚本变量,即脚本里通过`$var_name`定义的变量,这些变量是编译阶段确定的,所以是compile variable, `result_type`除了上面几种类型外还有一种类型`EXT_TYPE_UNUSED (1<<5)`,返回值没有使用时会用到,这个跟`IS_UNUSED`的区别是:`IS_UNUSED`表示本操作返回值没有意义(也可简单的认为没有返回值),而`EXT_TYPE_UNUSED`的含义是有返回值,但是没有用到,比如函数返回值没有接收。 -#### 3.1.2.4 常量(字面量)、变量的读写 +#### 3.1.2.4 字面量、变量的读写 我们先想一下C程序是如何读写字面量、变量的。 @@ -345,5 +356,3 @@ $a = 56; $b = "hello"; ``` `56`通过`(zval*)(_zend_op_array->literals + 0)`取到,`hello`通过`(zval*)(_zend_op_array->literals + 16)`取到,具体变量的读写操作将在执行阶段详细分析,这里只分析编译阶段的操作。 - - From bf2290640a7aefce965c3c057f5836267c1b116f Mon Sep 17 00:00:00 2001 From: qinpeng Date: Wed, 8 Mar 2017 14:25:24 +0800 Subject: [PATCH 005/379] update --- zend_executor.md | 55 +++++------------------------------------------- 1 file changed, 5 insertions(+), 50 deletions(-) diff --git a/zend_executor.md b/zend_executor.md index 72873e2..b880724 100644 --- a/zend_executor.md +++ b/zend_executor.md @@ -27,59 +27,14 @@ struct _zend_op { ``` #### 3.3.1.2 zend_op_array -`zend_op_array`是Zend引擎执行阶段的输入,是opcode的集合(当然并不仅仅如此)。 +`zend_op_array`是Zend引擎执行阶段的输入,整个执行阶段的操作都是围绕着这个结构,关于其具体结构前面我们已经讲过了。 ![zend_op_array](img/zend_op_array.png) -```c -truct _zend_op_array { - /* Common elements */ - zend_uchar type; //标识函数类型:1为PHP内部函数(扩展或内核提供的函数)、2为用户自定义函数(即PHP代码中写的function) - zend_uchar arg_flags[3]; /* bitset of arg_info.pass_by_reference */ - uint32_t fn_flags; - zend_string *function_name; //函数名 - zend_class_entry *scope; //所属class - zend_function *prototype; - uint32_t num_args; //参数数量 - uint32_t required_num_args; //必传参数数量 - zend_arg_info *arg_info; //参数信息 - /* END of common elements */ - - uint32_t *refcount; - - uint32_t this_var; - - uint32_t last; - zend_op *opcodes; //opcode指令数组 - - int last_var; - uint32_t T; //临时变量数 - zend_string **vars; //PHP变量名列表 - - int last_brk_cont; - int last_try_catch; - zend_brk_cont_element *brk_cont_array; - zend_try_catch_element *try_catch_array; - - /* static variables support */ - HashTable *static_variables; //静态变量符号表 - - zend_string *filename; //PHP文件路径 - uint32_t line_start; - uint32_t line_end; - zend_string *doc_comment; - uint32_t early_binding; /* the linked list of delayed declarations */ - - int last_literal; - zval *literals; //字面量(常量)数组 - - int cache_size; - void **run_time_cache; - - void *reserved[ZEND_MAX_RESERVED_RESOURCES]; -}; - -``` +这里再重复说下zend_op_array几个核心组成部分: +* __opcode指令__:即PHP代码具体对应的处理动作,与二进制程序中的代码段对应 +* __字面量存储__:PHP代码中定义的一些变量初始值、调用的函数名称、类名称、常量名称等等称之为字面量,这些值用于执行时初始化变量、函数调用等等 +* __变量分配情况__:与字面量类似,这里指的是当前opcodes定义了多少变量、临时变量,每个变量都有一个对应的编号,执行初始化按照总的数目一次性分配zval,使用时也完全按照编号索引,而不是根据变量名索引 #### 3.3.1.3 zend_executor_globals `zend_executor_globals executor_globals`是PHP整个生命周期中最主要的一个结构,是一个全局变量,在main执行前分配(非ZTS下),直到PHP退出,它记录着当前请求全部的信息,经常见到的一个宏`EG`操作的就是这个结构。 From 7b26c6c019b3660e513899ca22b0ff8de436e97c Mon Sep 17 00:00:00 2001 From: qinpeng Date: Wed, 8 Mar 2017 15:01:36 +0800 Subject: [PATCH 006/379] update --- img/zend_ex_op.png | Bin 0 -> 37096 bytes zend_compile.md | 6 ++---- zend_executor.md | 3 +++ 3 files changed, 5 insertions(+), 4 deletions(-) create mode 100644 img/zend_ex_op.png diff --git a/img/zend_ex_op.png b/img/zend_ex_op.png new file mode 100644 index 0000000000000000000000000000000000000000..46dc61d61a9abab89a9413e256d008303edb9ab3 GIT binary patch literal 37096 zcmcG$bx<5p_boa=2m}(GK+xb8+}$lea7b|1;O-EkUIBs#GTC*oB@S6&-q-&R+moyw$>HH)NlD3SbVRa=eoITs3?7HCFj`7#>d4o) zxcPZ`eL^^aN;KwXWVC#wSDI;_8~oY5f|i{5Ft};@BzIaqD*gQetAF zy!020oo{?HcHp9t|9es6Q2{q6CnsAYSx~vNv$Jh}1dy`w^2y0b$ysz%RIiiuu%ADVua4KW@fOc_r?Lb*#w+!OrKP1~e{I7} z{QEaMJv~bCIc$D@elUp{!N0Hl{QMl9L|_yOWng9&cGlm^=q@+;fJ6J zwRAO~*Z?jj3FJCvLyEQDXuqk~X2a=pj%CFBu1X`R$;l8%*2vcBHKfY@*yu);nwq*$ zF{>bR8yj0FYw2WKKv3|Sl*3k^5~9)zh1LW`_V)CgSjq%W z)bP9REuUV`%*;$=FSU6kWn{d9^!N9#+ratn?R`EW3GYrxPnVx8?65psY~y#{#<0xW zI7ARDWAnYc0%IlY_t5H~XH?@VpKEGrIzt+hprxcFl1V=E%h}t0Kl+uXGo2H;I`_n%IG6RZU7r9Ho(=sq%7mv1zhoFJIxn*VF1aw;6 zS$*^!orSVG+>clH_V%Wyr`<@$$+JedSy}sshYRRO(s|=&sSg9f!d`gLo@6Q+HXJF4 zga)xha?$bfrYxp0(9&YSQrf*PqcYzTY`s%dR4fUQa>av%at_lC{UD7XA)BOr;ZMo) zlUbCUQc|TdDNot+@r;-;^55hnClp6eIqovhGpTQGycrqO=moDrZuQ5bT8~pRZ0vXt z6>%Z4v9XZRO8t)cd7Top=-%AQkE^HGXKzMG1U;4JOx%!=kZ#B%TjQ3Nl3_`aYCWF=45%^pk z8CqCuul|XE3G$N*2&CI=B~T5l4JC70Yskz0%@z;ogAV}L>f>{-Q5&C{Y6WK8$VjYB z)3`S(f6EgO508eXu&Rm$0U@BXQ;eItfh&xZj578@m-~HBG8`P-S*P#)4V-@-f=T$# zpRACWI*EkuZj>E&Cvrkr%xqFj%*;p-V&aURAPFlgD?`KV>}*3hG>5}QK@h~6no~Uy zwUlwOv2YM@D24kr2WRK?(`!~%*5AK>dkZbi&T6H0kp*fM5<_X<410NbMf|;t^}GA> z<;$6Xx}Kh%zW!32SwDxVg$1qp(#%ZLhH`OfDLOG92e^0Mz5A9hF*P+eGlTp3_4t-H zDk|#!-kwY#xJ}cz?VdwWQ6pZH1ZDnj{&~S2cB7CgF2loyLgw@s6U^HTS z(|=OPbszW(#`5wgAxFo@W7q!8o}mp5+>mdi!oGV*VCvCdzWi)BxVX3&6cps?=?TVd za%{}wX!-ZIH|$y@(-pccSKjUM@z}hznVEW~rW-J5A&jQ(%3CODkP34L23u%!Fg{-W z!>F?*Y~1q=4DvY7i|EwRguc!o)NAkd=xB6HtAqKb$UX3^H&7x2M6tz(1O?P zMKVx@D=WwP$||w%i|6h> zuWj)6_wVfN1oPE@@&lQyIm(r}K)1z}ll^A%^m=_xh>`3

Jr2lZC~?tg@`^-6ym0 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 S;+HN0A9)!S=@QAOul_F&x(6Tt literal 0 HcmV?d00001 diff --git a/zend_compile.md b/zend_compile.md index 17c145d..61b761d 100644 --- a/zend_compile.md +++ b/zend_compile.md @@ -306,7 +306,7 @@ typedef union _znode_op { `result_type`除了上面几种类型外还有一种类型`EXT_TYPE_UNUSED (1<<5)`,返回值没有使用时会用到,这个跟`IS_UNUSED`的区别是:`IS_UNUSED`表示本操作返回值没有意义(也可简单的认为没有返回值),而`EXT_TYPE_UNUSED`的含义是有返回值,但是没有用到,比如函数返回值没有接收。 -#### 3.1.2.4 字面量、变量的读写 +#### 3.1.2.4 字面量、变量的存储 我们先想一下C程序是如何读写字面量、变量的。 @@ -343,13 +343,11 @@ main: ``` 可以看到`movq $.LC0, -8(%rbp)`,而`-8(%rbp)`就是name变量。 -关于C程序的执行过程、内存分配可以看:[https://github.com/pangudashu/anywork/tree/master/func_execute](https://github.com/pangudashu/anywork/tree/master/func_execute) - 虽然PHP代码不会直接编译为机器码,但编译、执行的设计跟C程序是一致的,也有常量区、变量也通过偏移量访问、也有虚拟的执行栈。 ![php vs c](img/php_vs_c.png) -在编译时就可确定且不会改变的量称为字面量,也称作常量(IS_CONST),这些值在编译阶段就已经分配zval,保存在`_zend_op_array->literals`数组中(对应c程序的常量内存区),访问时通过`_zend_op_array->literals + 偏移量`读取,举个例子: +在编译时就可确定且不会改变的量称为字面量,也称作常量(IS_CONST),这些值在编译阶段就已经分配zval,保存在`zend_op_array->literals`数组中(对应c程序的常量内存区),访问时通过`_zend_op_array->literals + 偏移量`读取,举个例子: ```c Date: Wed, 8 Mar 2017 15:33:11 +0800 Subject: [PATCH 007/379] update --- zend_class.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/zend_class.md b/zend_class.md index 421e864..5b5eda7 100644 --- a/zend_class.md +++ b/zend_class.md @@ -138,8 +138,7 @@ __常量的读取:__ 根据前面我们对PHP opcode已有的了解,我们可以猜测常量访问的opcode的组成:常量名保存在literals中(其op_type = IS_CONST),执行时先取出常量名,然后去zend_class_entry.constants_table哈希表中索引到具体的常量值即可。 -事实上我们的这个猜测并不是完全正确的,因为有的情况确实是我们猜想的那样,但是还有另外一种情况,下面具体举两个例子: - +事实上我们的这个猜测并不是完全正确的,因为有的情况确实是我们猜想的那样,但是还有另外一种情况,比较下两个例子的不同: ```php //示例1 echo my_class::A1; @@ -157,6 +156,11 @@ class my_class { echo my_class::A1; ``` +唯一的不同就是常量的使用时机:示例1是在定义前使用的,示例2是在定义后使用的。我们都知道PHP变量无需提前声明,这俩会有什么不同呢? + +事实上这两种情况内核会有两种不同的处理方式,示例2这种情况的处理与我们上面的猜测相同,而示例1则有另外一种处理方式:PHP代码的编译是顺序的,示例1的情况编译到`echo my_class::A1`这行时首先会尝试检索下是否已经编译了my_class,如果能在CG(class_table)中找到,则进一步从类的contants_table查找对应的常量,找到的话则会复制其value替换常量,简单的讲就是类似C语言中的宏,编译的时候替换为实际的值了,而不是在运行时再去检索。 + +具体debug下上面两个例子会发现示例2的主要的opcode只有一个ZEND_ECHO,也就是直接输出值了,并没有设计类常量的查找,这就是因为编译的时候已经将__my_class::A1__替换为__hi__了,`echo my_class::A1;`等同于:`echo "hi";`;而示例1首先的操作则是ZEND_FETCH_CONSTANT,查找常量,接着才是ZEND_ECHO。 #### 3.4.1.3 成员属性 类的变量成员叫做“属性”。属性声明是由关键字 __public__,__protected__ 或者 __private__ 开头,然后跟一个普通的变量声明来组成,关于这三个关键字这里不作讨论,后面分析可见性的章节再作说明。 From 603c6733fade5785f0bbd2d0e65fe4dd1f2b08a4 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Wed, 8 Mar 2017 18:10:01 +0800 Subject: [PATCH 008/379] add function --- zend_class.md | 41 +++++++++++++++++++++++++++++++++++++---- 1 file changed, 37 insertions(+), 4 deletions(-) diff --git a/zend_class.md b/zend_class.md index 5b5eda7..6c3acbf 100644 --- a/zend_class.md +++ b/zend_class.md @@ -158,7 +158,7 @@ echo my_class::A1; ``` 唯一的不同就是常量的使用时机:示例1是在定义前使用的,示例2是在定义后使用的。我们都知道PHP变量无需提前声明,这俩会有什么不同呢? -事实上这两种情况内核会有两种不同的处理方式,示例2这种情况的处理与我们上面的猜测相同,而示例1则有另外一种处理方式:PHP代码的编译是顺序的,示例1的情况编译到`echo my_class::A1`这行时首先会尝试检索下是否已经编译了my_class,如果能在CG(class_table)中找到,则进一步从类的contants_table查找对应的常量,找到的话则会复制其value替换常量,简单的讲就是类似C语言中的宏,编译的时候替换为实际的值了,而不是在运行时再去检索。 +事实上这两种情况内核会有两种不同的处理方式,示例2这种情况的处理与我们上面的猜测相同,而示例1则有另外一种处理方式:PHP代码的编译是顺序的,示例1的情况编译到`echo my_class::A1`这行时首先会尝试检索下是否已经编译了my_class,如果能在CG(class_table)中找到,则进一步从类的`contants_table`查找对应的常量,找到的话则会复制其value替换常量,简单的讲就是类似C语言中的宏,__编译时替换为实际的值了__,而不是在运行时再去检索。 具体debug下上面两个例子会发现示例2的主要的opcode只有一个ZEND_ECHO,也就是直接输出值了,并没有设计类常量的查找,这就是因为编译的时候已经将__my_class::A1__替换为__hi__了,`echo my_class::A1;`等同于:`echo "hi";`;而示例1首先的操作则是ZEND_FETCH_CONSTANT,查找常量,接着才是ZEND_ECHO。 @@ -206,7 +206,7 @@ typedef struct _zend_property_info { * __offset__:这个值记录的就是上面说的通过数组保存的属性值的索引,也就是说属性值保存在一个数组中,然后将其在数组中的位置保存在offset中,另外需要说明的一点的是普通属性、静态属性这个值用法是不一样的,静态属性是类的范畴,与对象无关,所以其offset为default_static_members_table数组的下标:0,、1、2......,而普通属性归属于对象,每个对象有其各自的属性,所以这个offset记录的实际是各属性在object中偏移值(在后面《3.4.2 对象》一节我们再具体说明普通属性的存储方式),其值是:40、56、72......是按照zval的内存大小偏移的 * __flags__:bit位,标识的是属性的信息,如public、private、protected及是否为静态属性 -剩下几个值含义比较明了不再多说。 +所以访问成员属性时首先是根据属性名查找到此属性的存储位置,然后再进一步获取属性值。 举个例子: ```php @@ -221,11 +221,44 @@ class my_class { ![zend_property_info](img/zend_property_info.png) -__静态成员变量保存在类中,各对象共享同一份数据,而普通属性属于对象,各对象独享。__ +下面我们再看下普通成员属性与静态成员属性的不同:__静态成员变量保存在类中,各对象共享同一份数据,而普通属性属于对象,各对象独享。__ + +成员属性在类编译阶段就已经分配了zval,静态与普通的区别在于普通属性在创建一个对象时还会重新分配zval(这个过程类似zend引擎执行前分配在zend_execute_data后面的动态变量空间),对象对普通属性的操作都是在其自己的空间进行的,各对象隔离,而静态属性的操作始终是在类的空间内,各对象共享。 #### 3.4.1.4 成员方法 每个类可以定义若干属于本类的函数(称之为成员方法),这种函数与普通的function相同,只是以类的维度进行管理,不是全局性的,所以成员方法保存在类中而不是EG(function_table)。 ![zend_class_function](img/zend_class_function.png) -成员方法的调用与普通function过程相同,根据对象所属class取到method编译的op_array,然后执行,具体的过程上一节已经介绍过[《3.3 Zend引擎执行过程》](zend_executor.md),下一节介绍对象的时候我们再从一个示例具体追踪下详细的调用过程。 +成员方法的调用与普通function过程相同,根据对象所属class取到method编译的op_array,然后执行,具体的过程上一节已经介绍过[《3.3 Zend引擎执行过程》](zend_executor.md)。 + +成员方法也有静态、非静态之分,静态方法中不能使用$this,因为其操作的作用域全部都是类的而不是对象的,而非静态方法中可以通过$this访问属于本对象的成员属性。 + +静态方法也是通过static关键词定义: +```php +class my_class { + static public function test() { + $a = "hi~"; + echo $a; + } +} +//静态方法可以这么调用: +my_class::test(); + +//也可以这样: +$method = 'test'; +my_class::$method(); +``` +静态方法中调用其它静态方法或静态变量可以通过__self__访问。 + +接下来我们以`my_class::test()`这种调用为例简单看下静态方法的调用过程,本节只介绍静态方法,关于非静态方法在对象一节再作讨论。 + +函数的调用过程大致可分为以下几个步骤: + +* __初始化阶段:__这个阶段首先查找到函数的zend_function,普通function就是到EG(function_table)中查找,成员方法则先从EG(class_table)中找到zend_class_entry,然后再进一步在其function_table找到zend_function,接着就是根据zend_op_array新分配__zend_execute_data__结构并设置上下文切换的指针 +* __参数传递阶段:__如果函数没有参数则跳过此步骤,有的话则会将函数所需参数传递到__初始化阶段__新分配的__zend_execute_data动态变量区__ +* __函数调用阶段:__这个步骤主要是做上下文切换,将执行器切换到调用的函数上 +* __函数执行阶段:__被调用函数内部的执行过程 +* __函数返回阶段:__被调用函数执行完毕返回过程,将上下文切换到调用前 + + From 60f4a9191969ba38ff9ddb4455e13493eb280f68 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Wed, 8 Mar 2017 20:51:30 +0800 Subject: [PATCH 009/379] update executor --- zend_executor.md | 57 +++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 56 insertions(+), 1 deletion(-) diff --git a/zend_executor.md b/zend_executor.md index 5fe45c6..de1027d 100644 --- a/zend_executor.md +++ b/zend_executor.md @@ -191,7 +191,7 @@ static zend_always_inline zend_execute_data *zend_vm_stack_push_call_frame_ex(ui } ``` -#### (2)初始化execute_data +#### (2)初始化zend_execute_data 注意,这里的初始化是整个php脚本最初的那个,并不是指函数调用时的,这一步的操作主要是设置几个指针:`opline`、`call`、`return_value`,同时将PHP的全局变量添加到`EG(symbol_table)`中去: ```c //zend_execute.c @@ -264,4 +264,59 @@ static zend_always_inline void zend_vm_stack_free_call_frame(zend_execute_data * } ``` +### 3.3.3 函数的执行流程 + +上一节我们介绍了zend执行引擎的几个关键步骤,函数的调用过程其实与上面一致,这里再具体总结下: + +* __初始化阶段:__这个阶段首先查找到函数的zend_function,普通function就是到EG(function_table)中查找,成员方法则先从EG(class_table)中找到zend_class_entry,然后再进一步在其function_table找到zend_function,接着就是根据zend_op_array新分配__zend_execute_data__结构并设置上下文切换的指针 +* __参数传递阶段:__如果函数没有参数则跳过此步骤,有的话则会将函数所需参数传递到__初始化阶段__新分配的__zend_execute_data动态变量区__ +* __函数调用阶段:__这个步骤主要是做上下文切换,将执行器切换到调用的函数上,可以理解会在这个阶段__递归调用zend_execute_ex__函数实现call的过程(实际并一定是递归,默认是在while(1){...}中切换执行空间的,但如果我们在扩展中重定义了zend_execute_ex用来介入执行流程则就是递归调用) +* __函数执行阶段:__被调用函数内部的执行过程,首先是接收参数,然后开始执行opcode +* __函数返回阶段:__被调用函数执行完毕返回过程,将返回值传递给调用方的zend_execute_data变量区,然后释放zend_execute_data以及分配的局部变量,将上下文切换到调用前,回到调用的位置继续执行 + +函数的调用过程还是比较容易理解的,不再举例具体分析其各个过程,这里额外说下return过程,这个过程有一个重要操作就是__销毁局部变量(仅函数调用这一种情况)__,这一步操作在`zend_leave_helper_SPEC`中完成: + +```c +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS) +{ + zend_execute_data *old_execute_data; + uint32_t call_info = EX_CALL_INFO(); + + if (EXPECTED(ZEND_CALL_KIND_EX(call_info) == ZEND_CALL_NESTED_FUNCTION)) { + //普通的函数调用将走到这个分支 + + i_free_compiled_variables(execute_data); + ... + } + //include、eval及整个脚本的结束(main函数)走到下面 + //... +} + +//zend_execute.c +static zend_always_inline void i_free_compiled_variables(zend_execute_data *execute_data) +{ + zval *cv = EX_VAR_NUM(0); + zval *end = cv + EX(func)->op_array.last_var; + while (EXPECTED(cv != end)) { + if (Z_REFCOUNTED_P(cv)) { + if (!Z_DELREF_P(cv)) { //引用计数减一后为0 + zend_refcounted *r = Z_COUNTED_P(cv); + ZVAL_NULL(cv); + zval_dtor_func_for_ptr(r); //释放变量值 + } else { + GC_ZVAL_CHECK_POSSIBLE_ROOT(cv); //引用计数减一后>0,启动垃圾检查机制,清理循环引用导致无法回收的垃圾 + } + } + cv++; + } +} +``` +这就是函数返回前清理局部变量的操作,除了函数这种情况外还有两种情况也有return操作: + +* __1.PHP主脚本执行结束时:__也就是PHP脚本开始执行的入口脚本(PHP没有显式的main函数,这种就可以认为是main函数),但是这种情况并不会在return时清理,因为在main函数中定义的变量并非纯碎的局面变量,它们都是全局变量,与$__GET、$__POST是一类,这些全局变量的清理是在request_shutdown阶段处理 +* __2.include、eval:__以include为例,如果include的文件中定义了全局变量,那么这些变量实际与上面1的情况一样,它们的存储位置是在一起的 + +所以实际上面说的这两种情况属于一类,它们并不是局部变量的清理,而是__全局变量的清理__。 + + From 006c516b4bcfe54e93ca677802463a3b79c0f617 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Wed, 8 Mar 2017 21:05:55 +0800 Subject: [PATCH 010/379] update --- README.md | 4 ++++ zend_executor.md | 16 +++++++++------- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 18f5561..1894985 100644 --- a/README.md +++ b/README.md @@ -17,11 +17,15 @@ * [3.2.1 内部函数](function_implement.md) * [3.2.2 用户函数的实现](function_implement.md#用户自定义函数的实现) * [3.3 Zend引擎执行流程](zend_executor.md) + * [3.3.1 基本结构](zend_executor.md#331-数据结构) + * [3.3.2 执行流程](zend_executor.md#332-执行流程) + * [3.3.3 函数的执行流程](zend_executor.md#333-函数的执行流程) * 3.4 面向对象实现 * [3.4.1 类](zend_class.md) * 3.4.2 对象(zend_object.md) * 3.4.3 魔术方法 * 3.4.4 抽象类和接口 + * 3.5 运行时缓存(zend_runtime_cache.md) * [第4章 PHP语法实现](php_language.md) * 4.1 变量 * 4.2 运算符 diff --git a/zend_executor.md b/zend_executor.md index de1027d..7033ae7 100644 --- a/zend_executor.md +++ b/zend_executor.md @@ -64,7 +64,7 @@ struct _zend_execute_data { zend_execute_data *call; /* current call */ zval *return_value; //返回值指针 */ zend_function *func; //当前执行的函数(非函数调用时为空) - zval This; //这个值并仅仅是面向对象的this,还有另外两个值也通过这个记录:call_info + num_args,分别存在zval.u1.reserved、zval.u2.num_args + zval This; //这个值并不仅仅是面向对象的this,还有另外两个值也通过这个记录:call_info + num_args,分别存在zval.u1.reserved、zval.u2.num_args zend_class_entry *called_scope; //当前call的类 zend_execute_data *prev_execute_data; //函数调用时指向调用位置作用空间 zend_array *symbol_table; //全局变量符号表 @@ -268,11 +268,11 @@ static zend_always_inline void zend_vm_stack_free_call_frame(zend_execute_data * 上一节我们介绍了zend执行引擎的几个关键步骤,函数的调用过程其实与上面一致,这里再具体总结下: -* __初始化阶段:__这个阶段首先查找到函数的zend_function,普通function就是到EG(function_table)中查找,成员方法则先从EG(class_table)中找到zend_class_entry,然后再进一步在其function_table找到zend_function,接着就是根据zend_op_array新分配__zend_execute_data__结构并设置上下文切换的指针 -* __参数传递阶段:__如果函数没有参数则跳过此步骤,有的话则会将函数所需参数传递到__初始化阶段__新分配的__zend_execute_data动态变量区__ -* __函数调用阶段:__这个步骤主要是做上下文切换,将执行器切换到调用的函数上,可以理解会在这个阶段__递归调用zend_execute_ex__函数实现call的过程(实际并一定是递归,默认是在while(1){...}中切换执行空间的,但如果我们在扩展中重定义了zend_execute_ex用来介入执行流程则就是递归调用) -* __函数执行阶段:__被调用函数内部的执行过程,首先是接收参数,然后开始执行opcode -* __函数返回阶段:__被调用函数执行完毕返回过程,将返回值传递给调用方的zend_execute_data变量区,然后释放zend_execute_data以及分配的局部变量,将上下文切换到调用前,回到调用的位置继续执行 +* __【初始化阶段】:__这个阶段首先查找到函数的zend_function,普通function就是到EG(function_table)中查找,成员方法则先从EG(class_table)中找到zend_class_entry,然后再进一步在其function_table找到zend_function,接着就是根据zend_op_array新分配__zend_execute_data__结构并设置上下文切换的指针 +* __【参数传递阶段】:__如果函数没有参数则跳过此步骤,有的话则会将函数所需参数传递到__初始化阶段__新分配的__zend_execute_data动态变量区__ +* __【函数调用阶段】:__这个步骤主要是做上下文切换,将执行器切换到调用的函数上,可以理解会在这个阶段__递归调用zend_execute_ex__函数实现call的过程(实际并一定是递归,默认是在while(1){...}中切换执行空间的,但如果我们在扩展中重定义了zend_execute_ex用来介入执行流程则就是递归调用) +* __【函数执行阶段】:__被调用函数内部的执行过程,首先是接收参数,然后开始执行opcode +* __【函数返回阶段】:__被调用函数执行完毕返回过程,将返回值传递给调用方的zend_execute_data变量区,然后释放zend_execute_data以及分配的局部变量,将上下文切换到调用前,回到调用的位置继续执行 函数的调用过程还是比较容易理解的,不再举例具体分析其各个过程,这里额外说下return过程,这个过程有一个重要操作就是__销毁局部变量(仅函数调用这一种情况)__,这一步操作在`zend_leave_helper_SPEC`中完成: @@ -316,7 +316,9 @@ static zend_always_inline void i_free_compiled_variables(zend_execute_data *exec * __1.PHP主脚本执行结束时:__也就是PHP脚本开始执行的入口脚本(PHP没有显式的main函数,这种就可以认为是main函数),但是这种情况并不会在return时清理,因为在main函数中定义的变量并非纯碎的局面变量,它们都是全局变量,与$__GET、$__POST是一类,这些全局变量的清理是在request_shutdown阶段处理 * __2.include、eval:__以include为例,如果include的文件中定义了全局变量,那么这些变量实际与上面1的情况一样,它们的存储位置是在一起的 -所以实际上面说的这两种情况属于一类,它们并不是局部变量的清理,而是__全局变量的清理__。 +所以实际上面说的这两种情况属于一类,它们并不是局部变量的清理,而是__全局变量的清理__,另外局部变量的清理也并非只有return一个时机,另外还有一个更重要的时机就是变量分离时,这种情况我们在《PHP语法实现》一节再具体说明。 + + From 86056fa84e76326685dae600063018d8470ec72d Mon Sep 17 00:00:00 2001 From: qinpeng Date: Thu, 9 Mar 2017 10:25:32 +0800 Subject: [PATCH 011/379] update --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 1894985..8aaa7a5 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ * [3.2.1 内部函数](function_implement.md) * [3.2.2 用户函数的实现](function_implement.md#用户自定义函数的实现) * [3.3 Zend引擎执行流程](zend_executor.md) - * [3.3.1 基本结构](zend_executor.md#331-数据结构) + * 3.3.1 基本结构] * [3.3.2 执行流程](zend_executor.md#332-执行流程) * [3.3.3 函数的执行流程](zend_executor.md#333-函数的执行流程) * 3.4 面向对象实现 From 9489731f0a936209d0e8ce9985bdba1cea7943d3 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Thu, 9 Mar 2017 10:28:15 +0800 Subject: [PATCH 012/379] update --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 8aaa7a5..8b655b6 100644 --- a/README.md +++ b/README.md @@ -15,11 +15,11 @@ * [3.1 PHP代码的编译](zend_compile.md) * [3.2 函数实现](function_implement.md) * [3.2.1 内部函数](function_implement.md) - * [3.2.2 用户函数的实现](function_implement.md#用户自定义函数的实现) + * 3.2.2 用户函数的实现 * [3.3 Zend引擎执行流程](zend_executor.md) - * 3.3.1 基本结构] - * [3.3.2 执行流程](zend_executor.md#332-执行流程) - * [3.3.3 函数的执行流程](zend_executor.md#333-函数的执行流程) + * 3.3.1 基本结构 + * 3.3.2 执行流程 + * 3.3.3 函数的执行流程 * 3.4 面向对象实现 * [3.4.1 类](zend_class.md) * 3.4.2 对象(zend_object.md) From e6a377c3c70078398081583f87496f51043347b9 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Thu, 9 Mar 2017 12:07:11 +0800 Subject: [PATCH 013/379] update --- zend_executor.md | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/zend_executor.md b/zend_executor.md index 7033ae7..166af84 100644 --- a/zend_executor.md +++ b/zend_executor.md @@ -265,7 +265,7 @@ static zend_always_inline void zend_vm_stack_free_call_frame(zend_execute_data * ``` ### 3.3.3 函数的执行流程 - +(这里的函数指用户自定义的PHP函数,不含内部函数) 上一节我们介绍了zend执行引擎的几个关键步骤,函数的调用过程其实与上面一致,这里再具体总结下: * __【初始化阶段】:__这个阶段首先查找到函数的zend_function,普通function就是到EG(function_table)中查找,成员方法则先从EG(class_table)中找到zend_class_entry,然后再进一步在其function_table找到zend_function,接着就是根据zend_op_array新分配__zend_execute_data__结构并设置上下文切换的指针 @@ -274,7 +274,18 @@ static zend_always_inline void zend_vm_stack_free_call_frame(zend_execute_data * * __【函数执行阶段】:__被调用函数内部的执行过程,首先是接收参数,然后开始执行opcode * __【函数返回阶段】:__被调用函数执行完毕返回过程,将返回值传递给调用方的zend_execute_data变量区,然后释放zend_execute_data以及分配的局部变量,将上下文切换到调用前,回到调用的位置继续执行 -函数的调用过程还是比较容易理解的,不再举例具体分析其各个过程,这里额外说下return过程,这个过程有一个重要操作就是__销毁局部变量(仅函数调用这一种情况)__,这一步操作在`zend_leave_helper_SPEC`中完成: +接下来我们详细分析下各个阶段的处理过程。 + +#### 3.3.3.1 初始化阶段 + +#### 3.3.3.2 参数传递阶段 + +#### 3.3.3.3 函数调用阶段 + +#### 3.3.3.4 函数执行阶段 + +#### 3.3.3.5 函数返回阶段 +这个过程有一个重要操作就是__销毁局部变量(仅函数调用这一种情况)__,这一步操作在`zend_leave_helper_SPEC`中完成: ```c static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS) From de4d14d7b2d92150df0a223e27e43eb6f2b49151 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Thu, 9 Mar 2017 12:08:11 +0800 Subject: [PATCH 014/379] update --- zend_executor.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zend_executor.md b/zend_executor.md index 166af84..0fe9e87 100644 --- a/zend_executor.md +++ b/zend_executor.md @@ -266,7 +266,7 @@ static zend_always_inline void zend_vm_stack_free_call_frame(zend_execute_data * ### 3.3.3 函数的执行流程 (这里的函数指用户自定义的PHP函数,不含内部函数) -上一节我们介绍了zend执行引擎的几个关键步骤,函数的调用过程其实与上面一致,这里再具体总结下: +上一节我们介绍了zend执行引擎的几个关键步骤,也简单的介绍了函数的调用过程,这里再单独总结下: * __【初始化阶段】:__这个阶段首先查找到函数的zend_function,普通function就是到EG(function_table)中查找,成员方法则先从EG(class_table)中找到zend_class_entry,然后再进一步在其function_table找到zend_function,接着就是根据zend_op_array新分配__zend_execute_data__结构并设置上下文切换的指针 * __【参数传递阶段】:__如果函数没有参数则跳过此步骤,有的话则会将函数所需参数传递到__初始化阶段__新分配的__zend_execute_data动态变量区__ From 948817b0f0a625432247b6c285a64404512b8806 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Thu, 9 Mar 2017 15:16:25 +0800 Subject: [PATCH 015/379] update --- img/func_exe_eg1.png | Bin 0 -> 24581 bytes img/func_exe_init.png | Bin 0 -> 28761 bytes zend_executor.md | 53 ++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 51 insertions(+), 2 deletions(-) create mode 100644 img/func_exe_eg1.png create mode 100644 img/func_exe_init.png diff --git a/img/func_exe_eg1.png b/img/func_exe_eg1.png new file mode 100644 index 0000000000000000000000000000000000000000..a6b22c95305cbceb1918fb6c3f9816526000cf3b GIT binary patch literal 24581 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 literal 0 HcmV?d00001 diff --git a/img/func_exe_init.png b/img/func_exe_init.png new file mode 100644 index 0000000000000000000000000000000000000000..dbf9ea719a031345a65e2045b47c27a900797e4d GIT binary patch literal 28761 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 //调用的函数名称通过操作数2记录 + zval *func; + zend_function *fbc; + zend_execute_data *call; + + //这里牵扯到zend的一种缓存机制:运行时缓存,后面我们会单独分析,这里忽略即可 + ... + //首先根据函数名去EG(function_table)索引zend_function + func = zend_hash_find(EG(function_table), Z_STR_P(fname)); + if (UNEXPECTED(func == NULL)) { + SAVE_OPLINE(); + zend_throw_error(NULL, "Call to undefined function %s()", Z_STRVAL_P(fname)); + HANDLE_EXCEPTION(); + } + fbc = Z_FUNC_P(func); //(*func).value.func + ... + + //分配zend_execute_data + call = zend_vm_stack_push_call_frame_ex( + opline->op1.num, ZEND_CALL_NESTED_FUNCTION, + fbc, opline->extended_value, NULL, NULL); + call->prev_execute_data = EX(call); + EX(call) = call; //将当前正在运行的zend_execute_data.call指向新分配的zend_execute_data + + ZEND_VM_NEXT_OPCODE(); +} +``` +![zend_exe_init](img/zend_exe_init.png) #### 3.3.3.2 参数传递阶段 From e14e27483e70d902abeb0f925927587014558fb0 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Thu, 9 Mar 2017 15:34:41 +0800 Subject: [PATCH 016/379] add call_info --- zend_executor.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/zend_executor.md b/zend_executor.md index d8ee997..950aea1 100644 --- a/zend_executor.md +++ b/zend_executor.md @@ -325,7 +325,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_FCALL_SPEC_CONST_HANDLER( ZEND_VM_NEXT_OPCODE(); } ``` -![zend_exe_init](img/zend_exe_init.png) +当前zend_execute_data及新生成的zend_execute_data关系: + +![zend_exe_init](img/func_exe_init.png) + +注意__This__这个值,它并不仅仅指的是面向对象中那个this,此外它还记录着其它两个值: +* __call_info:__调用信息,通过__This.u1.reserved__记录,因为我们的主脚本、用户自定义函数调用、内核函数调用、include/require/eval等都会生成一个zend_execute_data,这个值就是用来区分这些不同类型的,对应的具体值为:ZEND_CALL_TOP_CODE、ZEND_CALL_NESTED_FUNCTION、ZEND_CALL_TOP_FUNCTION、ZEND_CALL_NESTED_CODE,这个信息是在分配zend_execute_data时显式声明的 +* __num_args:__函数调用实际传入的参数数量,通过__This.u2.num_args__记录,比如示例中我们定义的函数有3个参数,其中1个是必传的,而我们调用时传入了2个,所以这个例子中的num_args就是2,这个值在编译时知道的,保存在__zend_op->extended_value__中 #### 3.3.3.2 参数传递阶段 From d408a8def3886227686fd6fe694bf3cd824f25bb Mon Sep 17 00:00:00 2001 From: qinpeng Date: Thu, 9 Mar 2017 17:38:51 +0800 Subject: [PATCH 017/379] update --- img/func_exe_init.png | Bin 28761 -> 32120 bytes zend_executor.md | 9 ++++++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/img/func_exe_init.png b/img/func_exe_init.png index dbf9ea719a031345a65e2045b47c27a900797e4d..67206e4eadfa68911420d47e6e332b2686a27b0d 100644 GIT binary patch literal 32120 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 literal 28761 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中 #### 3.3.3.2 参数传递阶段 +这个过程就是将当前作用空间下的变量值"复制"到新的zend_execute_data动态变量区中,那么调用方怎么知道要把值传递到新zend_execute_data哪个位置呢?实际这个地方是有固定规则的,zend_execute_data的动态变量区最前面是参数变量,按照参数的顺序依次分配,接着才是普通的局部变量、临时变量等,所以调用方就可以根据传的是第几个参数来确定其具体的存储位置。 + +另外这里的"复制"并不是硬拷贝,而是传递的value指针(当然bool/int/double类型不需要),通过引用计数管理,当在被调函数内部改写参数的值时将重新拷贝一份,与普通的变量用法相同。 + +![func_exe_send_var](img/func_exe_send_var.png) + +图中画的只是上面示例那种情况,比如`my_function(array());`直接传值则会是__literals区->新zend_execute_data动态变量区__的传递。 #### 3.3.3.3 函数调用阶段 From a9526a0773f02460d195774109c920a85c6efa72 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Thu, 9 Mar 2017 19:53:04 +0800 Subject: [PATCH 018/379] update --- img/func_exe_init.png | Bin 32120 -> 37323 bytes img/func_exe_send_var.png | Bin 0 -> 27482 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 img/func_exe_send_var.png diff --git a/img/func_exe_init.png b/img/func_exe_init.png index 67206e4eadfa68911420d47e6e332b2686a27b0d..061312a764654cff6148539cb404f95445e36b74 100644 GIT binary patch literal 37323 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 K=Mk^m`hNh^NtJ*A literal 32120 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 diff --git a/img/func_exe_send_var.png b/img/func_exe_send_var.png new file mode 100644 index 0000000000000000000000000000000000000000..4778bac4af6923dbb6527cc8cc01f06ccfcf2238 GIT binary patch literal 27482 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� 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 i|LAb!KVOuwx_0FLUU8;&>a60wuU;hD-kt3=A literal 0 HcmV?d00001 From 0ad76e8a93b36b2ebfd95065f501e89fd06419f8 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Thu, 9 Mar 2017 19:53:59 +0800 Subject: [PATCH 019/379] udpate --- zend_executor.md | 74 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) diff --git a/zend_executor.md b/zend_executor.md index 9675168..135bac7 100644 --- a/zend_executor.md +++ b/zend_executor.md @@ -343,6 +343,80 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_FCALL_SPEC_CONST_HANDLER( 图中画的只是上面示例那种情况,比如`my_function(array());`直接传值则会是__literals区->新zend_execute_data动态变量区__的传递。 #### 3.3.3.3 函数调用阶段 +这个过程主要是进行一些上下文切换,将执行器切换到调用的函数上。 + +上面例子对应的opcode为`ZEND_DO_UCALL`,handler为`ZEND_DO_UCALL_SPEC_HANDLER`: +```c +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_DO_UCALL_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_execute_data *call = EX(call); + zend_function *fbc = call->func; + zval *ret; + + SAVE_OPLINE(); + EX(call) = call->prev_execute_data; + + EG(scope) = NULL; + ret = NULL; + call->symbol_table = NULL; + if (RETURN_VALUE_USED(opline)) { + ret = EX_VAR(opline->result.var); //函数返回值的存储位置 + ZVAL_NULL(ret); + Z_VAR_FLAGS_P(ret) = 0; + } + + call->prev_execute_data = execute_data; //将新zend_execute_data->prev_execute_data指向当前data + i_init_func_execute_data(call, &fbc->op_array, ret, 0); + + ZEND_VM_ENTER(); +} + +//zend_execute.c +static zend_always_inline void i_init_func_execute_data(zend_execute_data *execute_data, zend_op_array *op_array, zval *return_value, int check_this) +{ + uint32_t first_extra_arg, num_args; + ZEND_ASSERT(EX(func) == (zend_function*)op_array); + + EX(opline) = op_array->opcodes; + EX(call) = NULL; + EX(return_value) = return_value; + + first_extra_arg = op_array->num_args; //函数的总参数数量,示例中为3 + num_args = EX_NUM_ARGS(); //实际传入参数数量,示例中为2 + if (UNEXPECTED(num_args > first_extra_arg)) { + ... + } else if (EXPECTED((op_array->fn_flags & ZEND_ACC_HAS_TYPE_HINTS) == 0)) { + //跳过前面几个已经传参的参数接收的指令,因为已经显式的传递参数了,无需再接收默认值 + EX(opline) += num_args; + } + + //初始化动态变量区,将所有变量(除已经传入的外)设置为IS_UNDEF + if (EXPECTED((int)num_args < op_array->last_var)) { + zval *var = EX_VAR_NUM(num_args); + zval *end = EX_VAR_NUM(op_array->last_var); + + do { + ZVAL_UNDEF(var); + var++; + } while (var != end); + } + ... + + //分配运行时缓存,此机制后面再单独说明 + if (UNEXPECTED(!op_array->run_time_cache)) { + op_array->run_time_cache = zend_arena_alloc(&CG(arena), op_array->cache_size); + memset(op_array->run_time_cache, 0, op_array->cache_size); + } + EX_LOAD_RUN_TIME_CACHE(op_array); //execute_data.run_time_cache = op_array.run_time_cache + EX_LOAD_LITERALS(op_array); //execute_data.literals = op_array.literals + + //EG(current_execute_data)为执行器当前执行空间,将执行器切到函数内 + EG(current_execute_data) = execute_data; +} +``` + +![func_call](img/func_exe_call.png) #### 3.3.3.4 函数执行阶段 From 858eb19e66f84898e417b8b2a5388a9d38742af5 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Thu, 9 Mar 2017 20:09:51 +0800 Subject: [PATCH 020/379] update --- img/func_exe_call.png | Bin 0 -> 27899 bytes img/func_exe_start.png | Bin 0 -> 9599 bytes zend_executor.md | 3 +++ 3 files changed, 3 insertions(+) create mode 100644 img/func_exe_call.png create mode 100644 img/func_exe_start.png diff --git a/img/func_exe_call.png b/img/func_exe_call.png new file mode 100644 index 0000000000000000000000000000000000000000..9980c3aea696ae3757063f504a8d6bd8215d0a17 GIT binary patch literal 27899 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

+HN!_`T=1CZS%w!WEoZ^dTt{ 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 KS1R+|@4o<_lHmgY literal 0 HcmV?d00001 diff --git a/zend_executor.md b/zend_executor.md index 135bac7..516be80 100644 --- a/zend_executor.md +++ b/zend_executor.md @@ -419,6 +419,9 @@ static zend_always_inline void i_init_func_execute_data(zend_execute_data *execu ![func_call](img/func_exe_call.png) #### 3.3.3.4 函数执行阶段 +这个过程就是函数内部opcode的执行流程,没什么特别的,唯一的不同就是前面会接收未传的参数,如下图所示。 + +![](img/func_exe_start.png) #### 3.3.3.5 函数返回阶段 这个过程有一个重要操作就是__销毁局部变量(仅函数调用这一种情况)__,这一步操作在`zend_leave_helper_SPEC`中完成: From f3a218cc64f7ed551086844ee7950f3145305476 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Thu, 9 Mar 2017 20:28:46 +0800 Subject: [PATCH 021/379] update --- zend_executor.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zend_executor.md b/zend_executor.md index 516be80..165726e 100644 --- a/zend_executor.md +++ b/zend_executor.md @@ -424,7 +424,7 @@ static zend_always_inline void i_init_func_execute_data(zend_execute_data *execu ![](img/func_exe_start.png) #### 3.3.3.5 函数返回阶段 -这个过程有一个重要操作就是__销毁局部变量(仅函数调用这一种情况)__,这一步操作在`zend_leave_helper_SPEC`中完成: +实际此过程可以认为是3.3.3.4的一部分,这个阶段就是函数调用结束,返回调用处的过程,这个过程中有三个关键工作:拷贝返回值、执行器切回调用位置、释放清理局部变量。 ```c static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS) From 46e6d0052b50915e9a19df8f6489cd340bbe759d Mon Sep 17 00:00:00 2001 From: qinpeng Date: Thu, 9 Mar 2017 20:34:18 +0800 Subject: [PATCH 022/379] update --- zend_class.md | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/zend_class.md b/zend_class.md index 6c3acbf..f38c224 100644 --- a/zend_class.md +++ b/zend_class.md @@ -230,8 +230,6 @@ class my_class { ![zend_class_function](img/zend_class_function.png) -成员方法的调用与普通function过程相同,根据对象所属class取到method编译的op_array,然后执行,具体的过程上一节已经介绍过[《3.3 Zend引擎执行过程》](zend_executor.md)。 - 成员方法也有静态、非静态之分,静态方法中不能使用$this,因为其操作的作用域全部都是类的而不是对象的,而非静态方法中可以通过$this访问属于本对象的成员属性。 静态方法也是通过static关键词定义: @@ -251,14 +249,5 @@ my_class::$method(); ``` 静态方法中调用其它静态方法或静态变量可以通过__self__访问。 -接下来我们以`my_class::test()`这种调用为例简单看下静态方法的调用过程,本节只介绍静态方法,关于非静态方法在对象一节再作讨论。 - -函数的调用过程大致可分为以下几个步骤: - -* __初始化阶段:__这个阶段首先查找到函数的zend_function,普通function就是到EG(function_table)中查找,成员方法则先从EG(class_table)中找到zend_class_entry,然后再进一步在其function_table找到zend_function,接着就是根据zend_op_array新分配__zend_execute_data__结构并设置上下文切换的指针 -* __参数传递阶段:__如果函数没有参数则跳过此步骤,有的话则会将函数所需参数传递到__初始化阶段__新分配的__zend_execute_data动态变量区__ -* __函数调用阶段:__这个步骤主要是做上下文切换,将执行器切换到调用的函数上 -* __函数执行阶段:__被调用函数内部的执行过程 -* __函数返回阶段:__被调用函数执行完毕返回过程,将上下文切换到调用前 - +成员方法的调用与普通function过程基本相同,根据对象所属类或直接根据类取到method的zend_function,然后执行,具体的过程[《3.3 Zend引擎执行过程》](zend_executor.md)已经详细说过,这里不再重复。 From 4ffdd1a4424c9c43576476adb708799578adddd0 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Fri, 10 Mar 2017 16:36:13 +0800 Subject: [PATCH 023/379] update --- zend_executor.md | 35 +++++++++++++++++++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/zend_executor.md b/zend_executor.md index 165726e..f376853 100644 --- a/zend_executor.md +++ b/zend_executor.md @@ -426,7 +426,35 @@ static zend_always_inline void i_init_func_execute_data(zend_execute_data *execu #### 3.3.3.5 函数返回阶段 实际此过程可以认为是3.3.3.4的一部分,这个阶段就是函数调用结束,返回调用处的过程,这个过程中有三个关键工作:拷贝返回值、执行器切回调用位置、释放清理局部变量。 +上面例子此过程opcode为`ZEND_RETURN`,对应的handler为`ZEND_RETURN_SPEC_CV_HANDLER`: ```c +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zval *retval_ptr; + zend_free_op free_op1; + + //获取返回值 + retval_ptr = _get_zval_ptr_cv_undef(execute_data, opline->op1.var); + if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_INFO_P(retval_ptr) == IS_UNDEF)) { + //返回值未定义,返回NULL + retval_ptr = GET_OP1_UNDEF_CV(retval_ptr, BP_VAR_R); + if (EX(return_value)) { + ZVAL_NULL(EX(return_value)); + } + } else if(!EX(return_value)){ + ... + }else{ //返回值正常 + ... + + ZVAL_DEREF(retval_ptr); //如果retval_ptr是引用则将找到其具体引用的zval + ZVAL_COPY(EX(return_value), retval_ptr); //将返回值复制给调用方接收值:EX(return_value) + ... + } + + ZEND_VM_TAIL_CALL(zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS) { zend_execute_data *old_execute_data; @@ -440,9 +468,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_leave_helper_SPEC(ZEND_OPCODE_ } //include、eval及整个脚本的结束(main函数)走到下面 //... + + //将执行器切回调用的位置 + EG(current_execute_data) = EX(prev_execute_data); } //zend_execute.c +//清理局部变量的过程 static zend_always_inline void i_free_compiled_variables(zend_execute_data *execute_data) { zval *cv = EX_VAR_NUM(0); @@ -461,8 +493,7 @@ static zend_always_inline void i_free_compiled_variables(zend_execute_data *exec } } ``` -这就是函数返回前清理局部变量的操作,除了函数这种情况外还有两种情况也有return操作: - +除了函数调用完成时有return操作,其它还有两种情况也会有此过程: * __1.PHP主脚本执行结束时:__也就是PHP脚本开始执行的入口脚本(PHP没有显式的main函数,这种就可以认为是main函数),但是这种情况并不会在return时清理,因为在main函数中定义的变量并非纯碎的局面变量,它们都是全局变量,与$__GET、$__POST是一类,这些全局变量的清理是在request_shutdown阶段处理 * __2.include、eval:__以include为例,如果include的文件中定义了全局变量,那么这些变量实际与上面1的情况一样,它们的存储位置是在一起的 From 1b3b55acb080d06e4b44378a25724652158d757f Mon Sep 17 00:00:00 2001 From: qinpeng Date: Fri, 10 Mar 2017 16:39:01 +0800 Subject: [PATCH 024/379] update --- zend_executor.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/zend_executor.md b/zend_executor.md index f376853..62d6436 100644 --- a/zend_executor.md +++ b/zend_executor.md @@ -454,7 +454,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_SPEC_CV_HANDLER(ZEND_OP ZEND_VM_TAIL_CALL(zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } - +``` +继续看下`zend_leave_helper_SPEC`,执行器切换、局部变量清理就是在这个函数中完成的。 +```c static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS) { zend_execute_data *old_execute_data; From ce60204fb13ca8b9cd4d3e506b1b34535f420a72 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Fri, 10 Mar 2017 17:12:41 +0800 Subject: [PATCH 025/379] =?UTF-8?q?=E6=95=B4=E7=90=86=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../base_introduction.md | 0 base_process.md => 1/base_process.md | 0 zend_ht.md => 2/zend_ht.md | 0 zval.md => 2/zval.md | 0 .../function_implement.md | 0 zend_class.md => 3/zend_class.md | 0 zend_compile.md => 3/zend_compile.md | 0 zend_executor.md => 3/zend_executor.md | 5 +-- php_language.md => 4/php_language.md | 0 {php_impl => 4}/variable.php | 1 - gc.md => 5/gc.md | 0 zend_alloc.md => 5/zend_alloc.md | 0 execute_timeout.md => 6/execute_timeout.md | 0 README.md | 36 +++++++++---------- SUMMARY.md | 14 -------- 15 files changed, 19 insertions(+), 37 deletions(-) rename base_introduction.md => 1/base_introduction.md (100%) rename base_process.md => 1/base_process.md (100%) rename zend_ht.md => 2/zend_ht.md (100%) rename zval.md => 2/zval.md (100%) rename function_implement.md => 3/function_implement.md (100%) rename zend_class.md => 3/zend_class.md (100%) rename zend_compile.md => 3/zend_compile.md (100%) rename zend_executor.md => 3/zend_executor.md (99%) rename php_language.md => 4/php_language.md (100%) rename {php_impl => 4}/variable.php (84%) rename gc.md => 5/gc.md (100%) rename zend_alloc.md => 5/zend_alloc.md (100%) rename execute_timeout.md => 6/execute_timeout.md (100%) delete mode 100644 SUMMARY.md diff --git a/base_introduction.md b/1/base_introduction.md similarity index 100% rename from base_introduction.md rename to 1/base_introduction.md diff --git a/base_process.md b/1/base_process.md similarity index 100% rename from base_process.md rename to 1/base_process.md diff --git a/zend_ht.md b/2/zend_ht.md similarity index 100% rename from zend_ht.md rename to 2/zend_ht.md diff --git a/zval.md b/2/zval.md similarity index 100% rename from zval.md rename to 2/zval.md diff --git a/function_implement.md b/3/function_implement.md similarity index 100% rename from function_implement.md rename to 3/function_implement.md diff --git a/zend_class.md b/3/zend_class.md similarity index 100% rename from zend_class.md rename to 3/zend_class.md diff --git a/zend_compile.md b/3/zend_compile.md similarity index 100% rename from zend_compile.md rename to 3/zend_compile.md diff --git a/zend_executor.md b/3/zend_executor.md similarity index 99% rename from zend_executor.md rename to 3/zend_executor.md index 62d6436..00f3eff 100644 --- a/zend_executor.md +++ b/3/zend_executor.md @@ -443,6 +443,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_SPEC_CV_HANDLER(ZEND_OP ZVAL_NULL(EX(return_value)); } } else if(!EX(return_value)){ + //无返回值 ... }else{ //返回值正常 ... @@ -501,7 +502,3 @@ static zend_always_inline void i_free_compiled_variables(zend_execute_data *exec 所以实际上面说的这两种情况属于一类,它们并不是局部变量的清理,而是__全局变量的清理__,另外局部变量的清理也并非只有return一个时机,另外还有一个更重要的时机就是变量分离时,这种情况我们在《PHP语法实现》一节再具体说明。 - - - - diff --git a/php_language.md b/4/php_language.md similarity index 100% rename from php_language.md rename to 4/php_language.md diff --git a/php_impl/variable.php b/4/variable.php similarity index 84% rename from php_impl/variable.php rename to 4/variable.php index b0994a2..fc661cb 100644 --- a/php_impl/variable.php +++ b/4/variable.php @@ -3,7 +3,6 @@ ### 4.1.1 变量的赋值、销毁 PHP变量定义:变量名 = 变量值,其中变量名有两种类型:CV($var_name)、VAR($$var_name),这里的CV、VAR等就是对应前面Zend编译过程中提到的那5种[__操作数类型__](../zend_compile.md#操作数类型)。 -普通PHP变量赋值操作对应的opcode是`ZEND_ASSIGN`, ### 4.1.2 变量类型转换 diff --git a/gc.md b/5/gc.md similarity index 100% rename from gc.md rename to 5/gc.md diff --git a/zend_alloc.md b/5/zend_alloc.md similarity index 100% rename from zend_alloc.md rename to 5/zend_alloc.md diff --git a/execute_timeout.md b/6/execute_timeout.md similarity index 100% rename from execute_timeout.md rename to 6/execute_timeout.md diff --git a/README.md b/README.md index 8b655b6..4c8f31f 100644 --- a/README.md +++ b/README.md @@ -5,28 +5,28 @@ 文中涉及代码版本:php-7.0.12 * 第1章 PHP基本架构 - * 1.1 基本概念(base_introduction.md) - * [1.2 PHP框架执行流程](base_process.md) + * 1.1 基本概念(1/base_introduction.md) + * [1.2 PHP框架执行流程](1/base_process.md) * 第2章 变量 - * [2.1 变量的内部实现](zval.md) - * 2.2 数组(zend_ht.md) - * 2.3 常量(var_common.md) + * [2.1 变量的内部实现](2/zval.md) + * 2.2 数组(2/zend_ht.md) + * 2.3 常量(2/var_common.md) * 第3章 Zend虚拟机 - * [3.1 PHP代码的编译](zend_compile.md) - * [3.2 函数实现](function_implement.md) - * [3.2.1 内部函数](function_implement.md) - * 3.2.2 用户函数的实现 - * [3.3 Zend引擎执行流程](zend_executor.md) - * 3.3.1 基本结构 - * 3.3.2 执行流程 - * 3.3.3 函数的执行流程 + * [3.1 PHP代码的编译](3/zend_compile.md) + * [3.2 函数实现](3/function_implement.md) + * [3.2.1 内部函数](3/function_implement.md) + * 3.2.2 用户函数的实现 + * [3.3 Zend引擎执行流程](3/zend_executor.md) + * 3.3.1 基本结构 + * 3.3.2 执行流程 + * 3.3.3 函数的执行流程 * 3.4 面向对象实现 - * [3.4.1 类](zend_class.md) - * 3.4.2 对象(zend_object.md) + * [3.4.1 类](3/zend_class.md) + * 3.4.2 对象(3/zend_object.md) * 3.4.3 魔术方法 * 3.4.4 抽象类和接口 - * 3.5 运行时缓存(zend_runtime_cache.md) -* [第4章 PHP语法实现](php_language.md) + * 3.5 运行时缓存(3/zend_runtime_cache.md) +* [第4章 PHP语法实现](4/php_language.md) * 4.1 变量 * 4.2 运算符 * 4.3 选择结构 @@ -34,6 +34,6 @@ * 4.5 跳转语句 * 4.6 函数 * 第5章 内存管理 - * [5.1 Zend内存池](zend_alloc.md) + * [5.1 Zend内存池](5/zend_alloc.md) * 5.2 垃圾回收(gc.md) * 第6章 扩展开发 diff --git a/SUMMARY.md b/SUMMARY.md deleted file mode 100644 index 5dfb202..0000000 --- a/SUMMARY.md +++ /dev/null @@ -1,14 +0,0 @@ -# Summary - -* TEST -* PHP基本架构 - * [PHP实现概述](base_introduction.md) - * [执行流程](base_process.md) -* 变量 - * 基本类型 - * 数组 - * [常量](var_common.md) -* PHP代码的编译(zend_compile.md) -* 函数 - * [用户函数的实现](yong_hu_han_shu_de_shi_xian.md) -* Zend执行引擎(zend_executor.md) From 3781dc1a7afb81656dca99ba5ae64f0eb462abf3 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Fri, 10 Mar 2017 17:14:20 +0800 Subject: [PATCH 026/379] replace url --- 2/zval.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/2/zval.md b/2/zval.md index db47783..0dc27eb 100644 --- a/2/zval.md +++ b/2/zval.md @@ -168,7 +168,7 @@ $b = &$a; //$a,$b -> zend_reference_1(refcount=2) -> zend_stri ``` 最终的结果如图: -![ref](img/zend_ref.png) +![ref](../img/zend_ref.png) 注意:引用只能通过`&`产生,无法通过赋值传递,比如: ```php @@ -267,7 +267,7 @@ $b[] = 3; ``` 最终的结果: -![zval_sep](img/zval_sep.png) +![zval_sep](../img/zval_sep.png) 不是所有类型都可以copy的,比如对象、资源,实时上只有string、array两种支持,与引用计数相同,也是通过`zval.u1.type_flag`标识value是否可复制的: ```c @@ -305,11 +305,11 @@ unset($a); ``` `unset($a)`之前引用关系: -![gc_1](img/gc_1.png) +![gc_1](../img/gc_1.png) `unset($a)`之后: -![gc_2](img/gc_2.png) +![gc_2](../img/gc_2.png) 可以看到,`unset($a)`之后由于数组中有子元素指向`$a`,所以`refcount > 0`,无法通过简单的gc机制回收,这种变量就是垃圾,垃圾回收器要处理的就是这种情况,目前垃圾只会出现在array、object两种类型中,所以只会针对这两种情况作特殊处理:当销毁一个变量时,如果发现减掉refcount后仍然大于0,且类型是IS_ARRAY、IS_OBJECT则将此value放入gc可能垃圾双向链表中,等这个链表达到一定数量后启动检查程序将所有变量检查一遍,如果确定是垃圾则销毁释放。 From 14375a110b999ef661ec0fea9292785b5d05f570 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Fri, 10 Mar 2017 17:18:13 +0800 Subject: [PATCH 027/379] update --- 3/function_implement.md | 2 +- 3/zend_class.md | 10 +++++----- 3/zend_compile.md | 8 ++++---- 3/zend_executor.md | 22 +++++++++++----------- 5/zend_alloc.md | 12 ++++++------ 5 files changed, 27 insertions(+), 27 deletions(-) diff --git a/3/function_implement.md b/3/function_implement.md index 3889c61..0ba5d3e 100644 --- a/3/function_implement.md +++ b/3/function_implement.md @@ -51,7 +51,7 @@ union _zend_function { 经过比较发现`zend_op_array`与`zend_internal_function`结构的起始位置都有`common`中的几个成员,如果你对C的内存比较了解应该会马上想到它们的用法,实际`common`可以看作是`op_array`、`internal_function`的header,不管是什么哪种函数都可以通过`zend_function.common.xx`快速访问到`zend_function.zend_op_array.xx`及`zend_function.zend_internal_function.xx`,下面几个,`type`同理,可以直接通过`zend_function.type`取到`zend_function.op_array.type`及`zend_function.internal_function.type`。 -![php function](img/php_function.jpg) +![php function](../img/php_function.jpg) 函数是在编译阶段确定的,那么它们存在哪呢? diff --git a/3/zend_class.md b/3/zend_class.md index f38c224..3ee0b9c 100644 --- a/3/zend_class.md +++ b/3/zend_class.md @@ -111,13 +111,13 @@ class User extends Human ``` 其对应的zend_class_entry存储结构如下图。 -![zend_class](img/zend_class.png) +![zend_class](../img/zend_class.png) 开始的时候已经提到,类是编译阶段的产物,编译完成后我们定义的每个类都会生成一个zend_class_entry,它保存着类的全部信息,在执行阶段所有类相关的操作都是用的这个结构。 所有PHP脚本中定义的类以及内核、扩展中定义的内部类通过一个以"类名"作为索引的哈希表存储,这个哈希表保存在Zend引擎global变量中:__zend_executor_globals.class_table__(即:__EG(class_table)__),与function的存储相同,关于这个global变量前面[《3.3.1.3 zend_executor_globals》](zend_executor.md#3313-zend_executor_globals)已经讲过。 -![zend_eg_class](img/zend_eg_class.png) +![zend_eg_class](../img/zend_eg_class.png) 在接下来的小节中我们将对类的常量、成员属性、成员方法的实现具体分析。 @@ -180,7 +180,7 @@ class my_class { ``` 与常量的存储方式不同,成员属性的__初始化值__并不是__直接__用以"属性名"作为索引的哈希表存储的,而是通过数组保存的,普通属性、静态属性各有一个数组分别存储。 -![zend_class_property](img/zend_class_property.png) +![zend_class_property](../img/zend_class_property.png) 看到这里可能有个疑问:使用时成员属性是如果找到的呢? @@ -219,7 +219,7 @@ class my_class { ``` 则__default_properties_table__、__default_static_properties_table__、__properties_info__关系图: -![zend_property_info](img/zend_property_info.png) +![zend_property_info](../img/zend_property_info.png) 下面我们再看下普通成员属性与静态成员属性的不同:__静态成员变量保存在类中,各对象共享同一份数据,而普通属性属于对象,各对象独享。__ @@ -228,7 +228,7 @@ class my_class { #### 3.4.1.4 成员方法 每个类可以定义若干属于本类的函数(称之为成员方法),这种函数与普通的function相同,只是以类的维度进行管理,不是全局性的,所以成员方法保存在类中而不是EG(function_table)。 -![zend_class_function](img/zend_class_function.png) +![zend_class_function](../img/zend_class_function.png) 成员方法也有静态、非静态之分,静态方法中不能使用$this,因为其操作的作用域全部都是类的而不是对象的,而非静态方法中可以通过$this访问属于本对象的成员属性。 diff --git a/3/zend_compile.md b/3/zend_compile.md index 61b761d..7b5cf0f 100644 --- a/3/zend_compile.md +++ b/3/zend_compile.md @@ -14,7 +14,7 @@ C程序在编译时将一行行代码编译为机器码,每一个操作都认 从PHP代码到opcode是怎么实现的?最容易想到的方式就是正则匹配,当然过程没有这么简单。PHP编译过程包括词法分析、语法分析,使用re2c、bison完成,旧的PHP版本直接生成了opcode,PHP7新增了抽象语法树(AST),在语法分析阶段生成AST,然后再生成opcode数组。 -![zend_compile2](img/zend_compile2.png) +![zend_compile2](../img/zend_compile2.png) re2c的示例:(http://re2c.org/examples/examples.html) ```c @@ -69,13 +69,13 @@ err: ### 3.1.2 编译过程 PHP编译阶段的基本过程如下图: -![zend_compile_process](img/zend_compile_process.png) +![zend_compile_process](../img/zend_compile_process.png) zendparse、zend_compile_top_stmt的过程没作深入研究,这里只大致说下这两个过程:zendparse是词法、语法分析过程,即前面提到的re2c、bison,这个过程将PHP代码解析为AST,解析过程确定了当前脚本定义了哪些变量,为这些变量按照顺序编号,这些值在使用时都是按照这个编号获取的,另外也将变量的初始化值、调用的函数/类/常量名称等值(称之为字面量)保存到zend_op_array.literals中,这些字面量也有一个唯一的编号,所以执行的过程实际就是根据各指令调用不同的C函数,然后根据变量、字面量、临时变量的编号对这些值进行处理加工。 PHP编译阶段最终的产物—opcode数组结构为: -![zend_compile](img/zend_compile.png) +![zend_compile](../img/zend_compile.png) ```c struct _zend_op_array { @@ -345,7 +345,7 @@ main: 虽然PHP代码不会直接编译为机器码,但编译、执行的设计跟C程序是一致的,也有常量区、变量也通过偏移量访问、也有虚拟的执行栈。 -![php vs c](img/php_vs_c.png) +![php vs c](../img/php_vs_c.png) 在编译时就可确定且不会改变的量称为字面量,也称作常量(IS_CONST),这些值在编译阶段就已经分配zval,保存在`zend_op_array->literals`数组中(对应c程序的常量内存区),访问时通过`_zend_op_array->literals + 偏移量`读取,举个例子: ```c diff --git a/3/zend_executor.md b/3/zend_executor.md index 00f3eff..1096f3a 100644 --- a/3/zend_executor.md +++ b/3/zend_executor.md @@ -1,7 +1,7 @@ ## 3.3 Zend引擎执行过程 Zend引擎主要包含两个核心部分:编译、执行: -![zend_vm](img/zend_vm.png) +![zend_vm](../img/zend_vm.png) 前面分析了Zend的编译过程以及PHP用户函数的实现,接下来分析下Zend引擎的执行过程。 @@ -29,7 +29,7 @@ struct _zend_op { #### 3.3.1.2 zend_op_array `zend_op_array`是Zend引擎执行阶段的输入,整个执行阶段的操作都是围绕着这个结构,关于其具体结构前面我们已经讲过了。 -![zend_op_array](img/zend_op_array.png) +![zend_op_array](../img/zend_op_array.png) 这里再重复说下zend_op_array几个核心组成部分: * __opcode指令__:即PHP代码具体对应的处理动作,与二进制程序中的代码段对应 @@ -50,7 +50,7 @@ ZEND_API zend_executor_globals executor_globals; ``` `zend_executor_globals`结构非常大,定义在`zend_globals.h`中,比较重要的几个字段含义如下图所示: -![EG](img/EG.png) +![EG](../img/EG.png) #### 3.3.1.4 zend_execute_data `zend_execute_data`是执行过程中最核心的一个结构,每次函数的调用、include/require、eval等都会生成一个新的结构,它表示当前的作用域、代码的执行位置以及局部变量的分配等等,等同于机器码执行过程中stack的角色,后面分析具体执行流程的时候会详细分析其作用。 @@ -78,7 +78,7 @@ struct _zend_execute_data { ``` zend_execute_data与zend_op_array的关联关系: -![zend_ex_op](img/zend_ex_op.png) +![zend_ex_op](../img/zend_ex_op.png) ### 3.3.2 执行流程 Zend的executor与linux二进制程序执行的过程是非常类似的,在C程序执行时有两个寄存器ebp、esp分别指向当前作用栈的栈顶、栈底,局部变量全部分配在当前栈,函数调用、返回通过`call`、`ret`指令完成,调用时`call`将当前执行位置压入栈中,返回时`ret`将之前执行位置出栈,跳回旧的位置继续执行,在Zend VM中`zend_execute_data`就扮演了这两个角色,`zend_execute_data.prev_execute_data`保存的是调用方的信息,实现了`call/ret`,`zend_execute_data`后面会分配额外的内存空间用于局部变量的存储,实现了`ebp/esp`的作用。 @@ -94,7 +94,7 @@ __Zend执行opcode的简略过程:__ * __step3.3:__ 类方法的调用与函数基本相同,后面分析对象实现的时候再详细分析 * __step4:__ 全部opcode执行完成后将step1分配的内存释放,这个过程会将所有的局部变量"销毁",执行阶段结束 -![zend_execute](img/zend_execute_data.png) +![zend_execute](../img/zend_execute_data.png) 接下来详细看下整个流程。 @@ -166,7 +166,7 @@ static zend_always_inline uint32_t zend_vm_calc_used_stack(uint32_t num_args, ze 最终分配的内存空间如下图: -![var_T](img/var_T.png) +![var_T](../img/var_T.png) 这里实际分配内存时并不是直接`malloc`的,还记得上面EG结构中有个`vm_stack`吗?实际内存是从这里获取的,每次从`EG(vm_stack_top)`处开始分配,分配完再将此指针指向`EG(vm_stack_top) + used_stack`,这里不再对vm_stack作更多分析,更下层实际就是Zend的内存池(zend_alloc.c),后面也会单独分析。 @@ -287,7 +287,7 @@ my_function($a, $b); ``` 主脚本、my_function的opcode为: -![](img/func_exe_eg1.png) +![](../img/func_exe_eg1.png) #### 3.3.3.1 初始化阶段 此阶段的主要工作有两个:查找函数zend_function、分配zend_execute_data。 @@ -327,7 +327,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_FCALL_SPEC_CONST_HANDLER( ``` 当前zend_execute_data及新生成的zend_execute_data关系: -![zend_exe_init](img/func_exe_init.png) +![zend_exe_init](../img/func_exe_init.png) 注意__This__这个值,它并不仅仅指的是面向对象中那个this,此外它还记录着其它两个信息: * __call_info:__调用信息,通过__This.u1.reserved__记录,因为我们的主脚本、用户自定义函数调用、内核函数调用、include/require/eval等都会生成一个zend_execute_data,这个值就是用来区分这些不同类型的,对应的具体值为:ZEND_CALL_TOP_CODE、ZEND_CALL_NESTED_FUNCTION、ZEND_CALL_TOP_FUNCTION、ZEND_CALL_NESTED_CODE,这个信息是在分配zend_execute_data时显式声明的 @@ -338,7 +338,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_FCALL_SPEC_CONST_HANDLER( 另外这里的"复制"并不是硬拷贝,而是传递的value指针(当然bool/int/double类型不需要),通过引用计数管理,当在被调函数内部改写参数的值时将重新拷贝一份,与普通的变量用法相同。 -![func_exe_send_var](img/func_exe_send_var.png) +![func_exe_send_var](../img/func_exe_send_var.png) 图中画的只是上面示例那种情况,比如`my_function(array());`直接传值则会是__literals区->新zend_execute_data动态变量区__的传递。 @@ -416,12 +416,12 @@ static zend_always_inline void i_init_func_execute_data(zend_execute_data *execu } ``` -![func_call](img/func_exe_call.png) +![func_call](../img/func_exe_call.png) #### 3.3.3.4 函数执行阶段 这个过程就是函数内部opcode的执行流程,没什么特别的,唯一的不同就是前面会接收未传的参数,如下图所示。 -![](img/func_exe_start.png) +![](../img/func_exe_start.png) #### 3.3.3.5 函数返回阶段 实际此过程可以认为是3.3.3.4的一部分,这个阶段就是函数调用结束,返回调用处的过程,这个过程中有三个关键工作:拷贝返回值、执行器切回调用位置、释放清理局部变量。 diff --git a/5/zend_alloc.md b/5/zend_alloc.md index 1d7be3d..b7d6720 100644 --- a/5/zend_alloc.md +++ b/5/zend_alloc.md @@ -50,7 +50,7 @@ struct _zend_mm_free_slot { ``` chunk、page、slot三者的关系: -![zend_heap](img/zend_heap.png) +![zend_heap](../img/zend_heap.png) 接下来看下内存池的初始化以及三种内存分配的过程。 @@ -108,14 +108,14 @@ static zend_mm_heap *zend_mm_init(void) ``` 这里分配了主chunk,只有第一个chunk的heap会用到,后面分配的chunk不再用到heap,初始化完的结构如下图: -![chunk_init](img/chunk_init.png) +![chunk_init](../img/chunk_init.png) 初始化的过程实际只是分配了一个主chunk,这里并没有看到开始提到的小内存slot切割,下一节我们来详细看下各种内存的分配过程。 ### 5.1.3 内存分配 文章开头已经简单提过Zend内存分配器按照申请内存的大小有三种不同的实现: -![alloc_all](img/alloc_all.png) +![alloc_all](../img/alloc_all.png) #### 5.1.3.1 Huge分配 超过2M内存的申请,与通用的内存申请没有太大差别,只是将申请的内存块通过单链表进行了管理。 @@ -186,7 +186,7 @@ typedef zend_mm_bitset zend_mm_page_map[ZEND_MM_PAGE_MAP_LEN]; /* 64B */ //5: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000101 ``` -![free_map](img/free_map.png) +![free_map](../img/free_map.png) 接下来看下`zend_mm_alloc_pages`的操作: ```c @@ -247,7 +247,7 @@ __最优page的检索过程__: 下面从一个例子具体看下,以64bit整形为例,假如当前page分配情况如下图-(1)(group1全部已分配;group2中page 67-68、71-74未分配,其余都已分配;group3中除page 128-129、133已分配外其余都未分配),现在要申请3个page: -![free_map_1](img/free_map_1.png) +![free_map_1](../img/free_map_1.png) 检索过程: * a.首先会直接跳过group1,直接到group2检索 @@ -302,7 +302,7 @@ small内存的分配过程: * __step2:__如果申请内存大小对应的的slot链表不为空则直接返回free_slot[bin_num],然后将free_slot[bin_num]指向下一个空闲位置free_slot[bin_num]->next_free_slot * __step3:__释放内存时先将此内存的next_free_slot指向free_slot[bin_num],然后将free_slot[bin_num]指向释放的内存,也就是将释放的内存插到链表头部 -![free_slot](img/free_slot.png) +![free_slot](../img/free_slot.png) ### 5.1.4 系统内存分配 上面介绍了三种内存分配的过程,内存池实际只是在系统内存上面做了一些工作,尽可能减少系统内存的分配次数,接下来简单看下系统内存的分配。 From 2cbed40b783e5e162e26cb867e502e0a89f098c2 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Fri, 10 Mar 2017 17:23:54 +0800 Subject: [PATCH 028/379] update --- 3/function_implement.md | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/3/function_implement.md b/3/function_implement.md index 0ba5d3e..a66929c 100644 --- a/3/function_implement.md +++ b/3/function_implement.md @@ -11,14 +11,13 @@ function my_func(){ 汇编中函数对应的是一组独立的汇编指令,然后通过call指令实现函数的调用,前面已经说过PHP编译的结果是opcode数组,与汇编指令对应,PHP用户自定义函数的实现就是将函数编译为独立的opcode数组,调用时分配独立的执行栈依次执行opcode,所以自定义函数对于zend而言并没有什么特别之处,只是将opcode进行了打包封装,实际PHP脚本中函数之外的指令整个可以认为是一个函数(或者理解为main函数更直观)。 ```php - +``` 下面具体看下PHP中函数的结构: @@ -69,7 +68,7 @@ Zend引擎中定义了很多内部函数供用户在PHP中使用,比如:defi #### 3.2.2.1 内部函数结构 上一节介绍`zend_function`为union,其中`internal_function`就是内部函数用到的,具体结构: -``` +```c //zend_complie.h typedef struct _zend_internal_function { /* Common elements */ @@ -127,13 +126,11 @@ PHP_MINIT_FUNCTION(xxxxxx) ``` 接着编译、安装扩展,测试: ```php - - -结果输出: -call internal function 'qp_test' ``` +结果输出: +`call internal function 'qp_test'` + 这样一个内部函数就定义完成了。这里有一个地方需要注意的我们把这个函数注册到__CG(function_table)__中去了,而不是__EG(function_table)__,这是因为在`php_request_startup`阶段会把__CG(function_table)__赋值给__EG(function_table)__。 上面的过程看着比较简单,但是在实际应用中不要这样做,PHP提供给我们一套标准的定义方式,接下来看下如何在扩展中按照官方方式提供一个内部函数。 From 67012ec91ddab1d68a498cc0bfad51b02dce9966 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Sun, 12 Mar 2017 19:53:57 +0800 Subject: [PATCH 029/379] add object --- 3/zend_object.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 3/zend_object.md diff --git a/3/zend_object.md b/3/zend_object.md new file mode 100644 index 0000000..3feb2a3 --- /dev/null +++ b/3/zend_object.md @@ -0,0 +1 @@ +### 3.4.2 对象 From 5cf5827b837ba2dbbb106b9fe3f8b505414ae75f Mon Sep 17 00:00:00 2001 From: qinpeng Date: Sun, 12 Mar 2017 19:55:17 +0800 Subject: [PATCH 030/379] update --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 4c8f31f..ccb32ce 100644 --- a/README.md +++ b/README.md @@ -23,8 +23,9 @@ * 3.4 面向对象实现 * [3.4.1 类](3/zend_class.md) * 3.4.2 对象(3/zend_object.md) - * 3.4.3 魔术方法 - * 3.4.4 抽象类和接口 + * 3.4.3 继承 + * 3.4.4 魔术方法 + * 3.4.5 抽象类和接口 * 3.5 运行时缓存(3/zend_runtime_cache.md) * [第4章 PHP语法实现](4/php_language.md) * 4.1 变量 From 1f6f85685c008a3a70b597a0e2abdcb1359f3d81 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Mon, 13 Mar 2017 13:42:54 +0800 Subject: [PATCH 031/379] add parse --- 3/zend_compile_opcode.md | 4 +++ 3/zend_compile_parse.md | 55 +++++++++++++++++++++++++++++++++++++++ img/zend_parse_1.png | Bin 0 -> 14239 bytes 3 files changed, 59 insertions(+) create mode 100644 3/zend_compile_opcode.md create mode 100644 3/zend_compile_parse.md create mode 100644 img/zend_parse_1.png diff --git a/3/zend_compile_opcode.md b/3/zend_compile_opcode.md new file mode 100644 index 0000000..f75fe5d --- /dev/null +++ b/3/zend_compile_opcode.md @@ -0,0 +1,4 @@ +### 3.1.2 AST编译opcodes + + + diff --git a/3/zend_compile_parse.md b/3/zend_compile_parse.md new file mode 100644 index 0000000..1dbfc3d --- /dev/null +++ b/3/zend_compile_parse.md @@ -0,0 +1,55 @@ +### 3.1.1 词法解析、语法解析 +这一节我们分析下PHP的解析阶段,即__PHP代码->抽象语法树(AST)__的过程。 + +PHP使用re2c、bison完成这个阶段的工作: +* __re2c__:词法分析器,将输入分割为一个个有意义的词块,称为token +* __bison__:语法分析器,确定词法分析器分割出的token是如何彼此关联的 + +例如: +```php +$a = 2 + 3; +``` +词法分析器将上面的语句分解为这些token:$a、=、2、+、3,接着语法分析器确定了`2+3`是一个表达式,而这个表达式被赋值给了`a`,我们可以这样定义词法解析规则: +```c +/*!re2c + LABEL [a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]* + LNUM [0-9]+ + + //规则 + "$"{LABEL} {return T_VAR;} + {LNUM} {return T_NUM;} +*/ +``` +然后定义语法解析规则: +```c +//token定义 +%token T_VAR +%token T_NUM + +//语法规则 +statement: + T_VAR '=' T_NUM '+' T_NUM {ret = str2int($3) + str2int($5);printf("%d",ret);} +; +``` +上面的语法规则只能识别两个数值相加,假如我们希望支持更复杂的运算,比如: +```php +$a = 3 + 4 - 6; +``` +则可以配置递归规则: +```c +//语法规则 +statement: + T_VAR '=' expr {} +; +expr: + T_NUM {...} + |expr '?' T_NUM {} +; +``` +这样将支持若干表达式,用语法分析树表示: + +![](../img/zend_parse_1.png) + +这里不再对re2c、bison作更多解释,想要了解更多的推荐看下《flex与bison》这本书,接下来我们看下PHP具体的解析过程。 + + diff --git a/img/zend_parse_1.png b/img/zend_parse_1.png new file mode 100644 index 0000000000000000000000000000000000000000..7ab2ff8d474cc301c0dbbbe64fba92af0ff2f802 GIT binary patch literal 14239 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 A0RR91 literal 0 HcmV?d00001 From b9cf5885a30a3cc15f1de78087b8ccefa793f517 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Mon, 13 Mar 2017 18:07:57 +0800 Subject: [PATCH 032/379] update --- 3/zend_compile_parse.md | 39 +++++++++++++++++++++++++++++++++++++++ img/zend_parse_2.png | Bin 0 -> 13752 bytes 2 files changed, 39 insertions(+) create mode 100644 img/zend_parse_2.png diff --git a/3/zend_compile_parse.md b/3/zend_compile_parse.md index 1dbfc3d..65029f9 100644 --- a/3/zend_compile_parse.md +++ b/3/zend_compile_parse.md @@ -52,4 +52,43 @@ expr: 这里不再对re2c、bison作更多解释,想要了解更多的推荐看下《flex与bison》这本书,接下来我们看下PHP具体的解析过程。 +PHP编译阶段流程: + +![zend_compile_process](../img/zend_compile_process.png) + +其中__zendparse()__就是词法、语法解析过程,这个函数实际就是bison中提供的语法解析函数__yyparse()__: +```c +#define yyparse zendparse +``` +__yyparse()__不断调用__yylex()__得到token,然后根据token匹配语法规则: + +![](../img/zend_parse_2.png) + +```c +#define yylex zendlex + +//zend_compile.c +int zendlex(zend_parser_stack_elem *elem) +{ + zval zv; + int retval; + ... + +again: + ZVAL_UNDEF(&zv); + retval = lex_scan(&zv); + if (EG(exception)) { + //语法错误 + return T_ERROR; + } + ... + + if (Z_TYPE(zv) != IS_UNDEF) { + //如果在分割token中有zval生成则将其值复制到zend_ast_zval结构中 + elem->ast = zend_ast_create_zval(&zv); + } + + return retval; +} +``` diff --git a/img/zend_parse_2.png b/img/zend_parse_2.png new file mode 100644 index 0000000000000000000000000000000000000000..6e1bd1a88f84a4109f6e8da65d1e3f382cdc5cd2 GIT binary patch literal 13752 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 Date: Mon, 13 Mar 2017 19:17:39 +0800 Subject: [PATCH 033/379] update --- 3/zend_compile_parse.md | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/3/zend_compile_parse.md b/3/zend_compile_parse.md index 65029f9..c73bf72 100644 --- a/3/zend_compile_parse.md +++ b/3/zend_compile_parse.md @@ -91,4 +91,36 @@ again: return retval; } ``` +这里两个关键点需要注意: +__(1) token值__:词法解析器解析到的token值内容就是token值,这些值统一通过__zval__存储,上面的过程中可以看到调用lex_scan参数是是个zval*,在具体的命中规则总会将解析到的token保存到这个值,从而传递给语法解析器使用,比如PHP中的解析变量的规则:`$a;`,其词法解析规则为: +```c +"$"{LABEL} { + //将匹配到的token值保存在zval中 + zend_copy_value(zendlval, (yytext+1), (yyleng-1)); //只保存{LABEL}内容,不包括$,所以是yytext+1 + RETURN_TOKEN(T_VARIABLE); +} +``` +zendlval就是我们传入的zval*,yytext指向命中的token值起始位置,yyleng为token值的长度。 + +__(2) 语义值类型__:bison调用re2c分割token有两个含义,第一个是token类型,另一个是token值,token类型一般以yylex的返回值告诉bison,而token值就是语义值,这个值一般定义为固定的类型,这个类型就是语义值类型,默认为int,可以通过__YYSTYPE__定义,而PHP中这个类型是__zend_parser_stack_elem__,这就是为什么zendlex的参数为zend_parser_stack_elem的原因。 +```c +#define YYSTYPE zend_parser_stack_elem + +typedef union _zend_parser_stack_elem { + zend_ast *ast; + zend_string *str; + zend_ulong num; +} zend_parser_stack_elem; +``` +实际这是个union,ast类型用的比较多(其它两种类型暂时没发现有地方在用),这样可以通过%token、%type将对应的值修改为elem.ast,所以在zend_language_parser.y中使用的$$、$1、$2......多数都是__zend_parser_stack_elem.ast__: +```c +%token T_LNUMBER "integer number (T_LNUMBER)" +%token T_DNUMBER "floating-point number (T_DNUMBER)" +%token T_STRING "identifier (T_STRING)" +%token T_VARIABLE "variable (T_VARIABLE)" + +%type top_statement namespace_name name statement function_declaration_statement +%type class_declaration_statement trait_declaration_statement +%type interface_declaration_statement interface_extends_list +``` From 1832414950d684cbb74a0d045122b4dbd6a2eb28 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Mon, 13 Mar 2017 21:00:33 +0800 Subject: [PATCH 034/379] finish ast --- 3/zend_compile_parse.md | 74 +++++++++++++++++++++++++++++++++++++--- img/zend_ast.png | Bin 0 -> 63210 bytes 2 files changed, 70 insertions(+), 4 deletions(-) create mode 100644 img/zend_ast.png diff --git a/3/zend_compile_parse.md b/3/zend_compile_parse.md index c73bf72..e15de28 100644 --- a/3/zend_compile_parse.md +++ b/3/zend_compile_parse.md @@ -50,9 +50,7 @@ expr: ![](../img/zend_parse_1.png) -这里不再对re2c、bison作更多解释,想要了解更多的推荐看下《flex与bison》这本书,接下来我们看下PHP具体的解析过程。 - -PHP编译阶段流程: +接下来我们看下PHP具体的解析过程,PHP编译阶段流程: ![zend_compile_process](../img/zend_compile_process.png) @@ -92,6 +90,7 @@ again: } ``` 这里两个关键点需要注意: + __(1) token值__:词法解析器解析到的token值内容就是token值,这些值统一通过__zval__存储,上面的过程中可以看到调用lex_scan参数是是个zval*,在具体的命中规则总会将解析到的token保存到这个值,从而传递给语法解析器使用,比如PHP中的解析变量的规则:`$a;`,其词法解析规则为: ```c "$"{LABEL} { @@ -107,7 +106,7 @@ __(2) 语义值类型__:bison调用re2c分割token有两个含义,第一个 #define YYSTYPE zend_parser_stack_elem typedef union _zend_parser_stack_elem { - zend_ast *ast; + zend_ast *ast; //抽象语法树主要结构 zend_string *str; zend_ulong num; } zend_parser_stack_elem; @@ -124,3 +123,70 @@ typedef union _zend_parser_stack_elem { %type interface_declaration_statement interface_extends_list ``` +语法解析器从start开始调用,然后层层匹配各个规则,语法解析器根据命中的语法规则创建AST节点,最后将生成的AST根节点赋到__CG(ast)__: +```c +%% /* Rules */ + +start: + top_statement_list { CG(ast) = $1; } +; + +top_statement_list: + top_statement_list top_statement { $$ = zend_ast_list_add($1, $2); } + | /* empty */ { $$ = zend_ast_create_list(0, ZEND_AST_STMT_LIST); } +; +``` +首先会创建一个根节点list,然后将后面不断命中top_statement生成的ast加到这个list中,zend_ast具体结构: + +```c +enum _zend_ast_kind { + ZEND_AST_ZVAL = 1 << ZEND_AST_SPECIAL_SHIFT, + ZEND_AST_ZNODE, + + /* list nodes */ + ZEND_AST_ARG_LIST = 1 << ZEND_AST_IS_LIST_SHIFT, + ... +}; + +struct _zend_ast { + zend_ast_kind kind; /* Type of the node (ZEND_AST_* enum constant) */ + zend_ast_attr attr; /* Additional attribute, use depending on node type */ + uint32_t lineno; /* Line number */ + zend_ast *child[1]; /* Array of children (using struct hack) */ +}; + +typedef struct _zend_ast_list { + zend_ast_kind kind; + zend_ast_attr attr; + uint32_t lineno; + uint32_t children; + zend_ast *child[1]; +} zend_ast_list; +``` +根节点实际为zend_ast_list,每条语句对应的ast保存在child中,使用中zend_ast_list、zend_ast可以相互转化,kind标识的是ast节点类型,后面会根据这个值生成具体的opcode,另外函数、类还会用到另外一种ast节点结构: +```c +typedef struct _zend_ast_decl { + zend_ast_kind kind; + zend_ast_attr attr; /* Unused - for structure compatibility */ + uint32_t start_lineno; //开始行号 + uint32_t end_lineno; //结束行号 + uint32_t flags; + unsigned char *lex_pos; + zend_string *doc_comment; + zend_string *name; + zend_ast *child[4]; //类中会将继承的父类、实现的接口以及类中的语句解析保存在child中 +} zend_ast_decl; +``` +这么看比较难理解,接下来我们从一个简单的例子看下最终生成的语法树。 + +```php +$a = 123; +$b = "hi~"; + +echo $a,$b; +``` +具体解析过程这里不再解释,有兴趣的可以翻下zend_language_parse.y中,这个过程不太容易理解,需要多领悟几遍,最后生成的ast如下图: + +![zend_ast](../img/zend_ast.png) + +这里不再对re2c、bison作更多解释,想要了解更多的推荐看下《flex与bison》这本书。 diff --git a/img/zend_ast.png b/img/zend_ast.png new file mode 100644 index 0000000000000000000000000000000000000000..4d69523dc9cc98a76ba1bf28db48a08662f5eeef GIT binary patch literal 63210 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 Date: Mon, 13 Mar 2017 21:08:52 +0800 Subject: [PATCH 035/379] add url --- 3/zend_compile.md | 17 ----------------- 3/zend_compile_parse.md | 4 +++- README.md | 1 + 3 files changed, 4 insertions(+), 18 deletions(-) diff --git a/3/zend_compile.md b/3/zend_compile.md index 7b5cf0f..51fc949 100644 --- a/3/zend_compile.md +++ b/3/zend_compile.md @@ -49,23 +49,6 @@ int main(int argc, char **argv) return 0; } ``` -``` -$ re2c -o example.cc 01_recognizing_integers.re -$ g++ -o example example.cc -$ ./example 0 12345678901234567890 0xAbcDEf 0x00 007 0B0 0b110101010 0x 0b ? "" -oct: 0 -dec: 12345678901234567890 -hex: 0xAbcDEf -hex: 0x00 -oct: 007 -bin: 0B0 -bin: 0b110101010 -err: 0x -err: 0b -err: ? -err: -``` - ### 3.1.2 编译过程 PHP编译阶段的基本过程如下图: diff --git a/3/zend_compile_parse.md b/3/zend_compile_parse.md index e15de28..f03b4db 100644 --- a/3/zend_compile_parse.md +++ b/3/zend_compile_parse.md @@ -189,4 +189,6 @@ echo $a,$b; ![zend_ast](../img/zend_ast.png) -这里不再对re2c、bison作更多解释,想要了解更多的推荐看下《flex与bison》这本书。 +总结: + +这一节我们主要介绍了PHP词法、语法解析生成抽象语法树(AST)的过程,此过程是PHP语法实现的基础,也是zend引擎非常关键的一部分,后续介绍的内容都是基于此过程的产出结果展开的。这部分内容关键在于对re2c、bison的应用上,如果是初次接触它们可能不太容易理解,这里不再对re2c、bison作更多解释,想要了解更多的推荐看下《flex与bison》这本书。 diff --git a/README.md b/README.md index ccb32ce..c809d4f 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,7 @@ * 2.3 常量(2/var_common.md) * 第3章 Zend虚拟机 * [3.1 PHP代码的编译](3/zend_compile.md) + * [3.1.1 词法解析、语法解析](3/zend_compile_parse.md) * [3.2 函数实现](3/function_implement.md) * [3.2.1 内部函数](3/function_implement.md) * 3.2.2 用户函数的实现 From 88edcc69bbaf6ab3dc0639f078d9ecf71cca8ace Mon Sep 17 00:00:00 2001 From: qinpeng Date: Mon, 13 Mar 2017 21:10:00 +0800 Subject: [PATCH 036/379] add comment --- 3/zend_compile_parse.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/3/zend_compile_parse.md b/3/zend_compile_parse.md index f03b4db..2ab5165 100644 --- a/3/zend_compile_parse.md +++ b/3/zend_compile_parse.md @@ -189,6 +189,6 @@ echo $a,$b; ![zend_ast](../img/zend_ast.png) -总结: +__总结:__ -这一节我们主要介绍了PHP词法、语法解析生成抽象语法树(AST)的过程,此过程是PHP语法实现的基础,也是zend引擎非常关键的一部分,后续介绍的内容都是基于此过程的产出结果展开的。这部分内容关键在于对re2c、bison的应用上,如果是初次接触它们可能不太容易理解,这里不再对re2c、bison作更多解释,想要了解更多的推荐看下《flex与bison》这本书。 +这一节我们主要介绍了PHP词法、语法解析生成抽象语法树(AST)的过程,此过程是PHP语法实现的基础,也是zend引擎非常关键的一部分,后续介绍的内容都是基于此过程的产出结果展开的。这部分内容关键在于对re2c、bison的应用上,如果是初次接触它们可能不太容易理解,这里不再对re2c、bison作更多解释,想要了解更多的推荐看下__《flex与bison》__这本书。 From 92e6d4485a8b119bb7ea3ec1938d170a89fc599a Mon Sep 17 00:00:00 2001 From: qinpeng Date: Mon, 13 Mar 2017 21:12:41 +0800 Subject: [PATCH 037/379] update img --- img/zend_ast.png | Bin 63210 -> 64987 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/img/zend_ast.png b/img/zend_ast.png index 4d69523dc9cc98a76ba1bf28db48a08662f5eeef..bb4cad3c91508cc99204e4763fca06ea47f3449e 100644 GIT binary patch literal 64987 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 Date: Tue, 14 Mar 2017 11:35:08 +0800 Subject: [PATCH 038/379] add ast parse --- 3/zend_compile_opcode.md | 100 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 99 insertions(+), 1 deletion(-) diff --git a/3/zend_compile_opcode.md b/3/zend_compile_opcode.md index f75fe5d..969a751 100644 --- a/3/zend_compile_opcode.md +++ b/3/zend_compile_opcode.md @@ -1,4 +1,102 @@ -### 3.1.2 AST编译opcodes +### 3.1.2 抽象语法树编译流程 +上一小节我们简单介绍了从PHP代码解析为抽象语法树的过程,这一节我们再介绍下从__抽象语法树->Opcodes__的过程。 + +语法解析过程的产物保存于CG(AST),接着zend引擎会把AST进一步编译为__zend_op_array__,它是编译阶段最终的产物,也是执行阶段的输入,后面我们介绍的东西基本都是围绕zend_op_array展开的,我们接着看下语法解析(zendparse())之后的流程: + +```c +ZEND_API zend_op_array *compile_file(zend_file_handle *file_handle, int type) +{ + zend_op_array *op_array = NULL; //编译出的opcodes + ... + + if (open_file_for_scanning(file_handle)==FAILURE) {//文件打开失败 + ... + } else { + zend_bool original_in_compilation = CG(in_compilation); + CG(in_compilation) = 1; + + CG(ast) = NULL; + CG(ast_arena) = zend_arena_create(1024 * 32); + if (!zendparse()) { //语法解析 + zval retval_zv; + zend_file_context original_file_context; //保存原来的zend_file_context + zend_oparray_context original_oparray_context; //保存原来的zend_oparray_context + zend_op_array *original_active_op_array = CG(active_op_array); + op_array = emalloc(sizeof(zend_op_array)); //分配zend_op_array结构 + init_op_array(op_array, ZEND_USER_FUNCTION, INITIAL_OP_ARRAY_SIZE);//初始化op_array + CG(active_op_array) = op_array; //将当前正在编译op_array指向当前 + ZVAL_LONG(&retval_zv, 1); + + if (zend_ast_process) { + zend_ast_process(CG(ast)); + } + + zend_file_context_begin(&original_file_context); //初始化CG(file_context) + zend_oparray_context_begin(&original_oparray_context); //初始化CG(context) + zend_compile_top_stmt(CG(ast)); //AST->zend_op_array编译流程 + zend_emit_final_return(&retval_zv); //设置最后的返回值 + op_array->line_start = 1; + op_array->line_end = CG(zend_lineno); + pass_two(op_array); + zend_oparray_context_end(&original_oparray_context); + zend_file_context_end(&original_file_context); + + CG(active_op_array) = original_active_op_array; + } + ... + } + ... + + return op_array; +} +``` +compile_file()操作中有几个保存原来值的操作,这是因为这个函数在PHP脚本执行中并不会只执行一次,主脚本执行时会第一次调用,而include、require也会调用,所以需要先保存当前值,然后执行完再还原回去。 + +AST->zend_op_array编译是在__zend_compile_top_stmt()__中完成,这个函数是总入口,会被多次递归调用: +```c +//zend_compile.c +void zend_compile_top_stmt(zend_ast *ast) +{ + if (!ast) { + return; + } + + if (ast->kind == ZEND_AST_STMT_LIST) { //第一次进来一定是这种类型 + zend_ast_list *list = zend_ast_get_list(ast); + uint32_t i; + for (i = 0; i < list->children; ++i) { + zend_compile_top_stmt(list->child[i]);//list各child语句相互独立,递归编译 + } + return; + } + + //各语句编译入口 + zend_compile_stmt(ast); + + if (ast->kind != ZEND_AST_NAMESPACE && ast->kind != ZEND_AST_HALT_COMPILER) { + zend_verify_namespace(); + } + //function、class两种情况的处理,非常关键的一步操作,后面分析函数、类实现的章节再详细分析 + if (ast->kind == ZEND_AST_FUNC_DECL || ast->kind == ZEND_AST_CLASS) { + CG(zend_lineno) = ((zend_ast_decl *) ast)->end_lineno; + zend_do_early_binding(); + } +} +``` +首先从AST的根节点开始编译,根节点类型为ZEND_AST_STMT_LIST,这个类型表示当前节点下有多个独立的节点,各child都是独立的语句生成的节点,所以依次编译即可,直到到达有效节点位置(非ZEND_AST_STMT_LIST节点),然后调用`zend_compile_stmt`编译当前节点: +```c + +``` +主要根据不同的节点类型(kind)作不同的处理,我们不会把每种类型的处理都讲一遍,这里还是根据上一节最后的例子挑几个看下具体的处理过程。 +```php +$a = 123; +$b = "hi~"; + +echo $a,$b; +``` +zendparse()阶段生成的AST: + +![zend_ast](../img/zend_ast.png) From aedde6cf6e5df3b65d567139f362d34192cf765e Mon Sep 17 00:00:00 2001 From: qinpeng Date: Tue, 14 Mar 2017 12:03:18 +0800 Subject: [PATCH 039/379] update --- 3/zend_compile_opcode.md | 77 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 76 insertions(+), 1 deletion(-) diff --git a/3/zend_compile_opcode.md b/3/zend_compile_opcode.md index 969a751..f840e12 100644 --- a/3/zend_compile_opcode.md +++ b/3/zend_compile_opcode.md @@ -86,7 +86,30 @@ void zend_compile_top_stmt(zend_ast *ast) ``` 首先从AST的根节点开始编译,根节点类型为ZEND_AST_STMT_LIST,这个类型表示当前节点下有多个独立的节点,各child都是独立的语句生成的节点,所以依次编译即可,直到到达有效节点位置(非ZEND_AST_STMT_LIST节点),然后调用`zend_compile_stmt`编译当前节点: ```c - +void zend_compile_stmt(zend_ast *ast) +{ + CG(zend_lineno) = ast->lineno; + + switch (ast->kind) { + case xxx: + ... + break; + case ZEND_AST_ECHO: + zend_compile_echo(ast); + break; + ... + default: + { + znode result; + zend_compile_expr(&result, ast); + zend_do_free(&result); + } + } + + if (FC(declarables).ticks && !zend_is_unticked_stmt(ast)) { + zend_emit_tick(); + } +} ``` 主要根据不同的节点类型(kind)作不同的处理,我们不会把每种类型的处理都讲一遍,这里还是根据上一节最后的例子挑几个看下具体的处理过程。 ```php @@ -99,4 +122,56 @@ zendparse()阶段生成的AST: ![zend_ast](../img/zend_ast.png) +(1)首先从根节点开始,有3个child,第一个节点类型为ZEND_AST_ASSIGN,zend_compile_stmt()中走到default分支 +(2)ZEND_AST_ASSIGN类型由zend_compile_expr()处理: +```c +void zend_compile_expr(znode *result, zend_ast *ast) +{ + CG(zend_lineno) = zend_ast_get_lineno(ast); + switch (ast->kind) { + case ZEND_AST_ZVAL: + ZVAL_COPY(&result->u.constant, zend_ast_get_zval(ast)); + result->op_type = IS_CONST; + return; + case ZEND_AST_VAR: + zend_compile_var(result, ast, BP_VAR_R); + return; + case ZEND_AST_ASSIGN: + zend_compile_assign(result, ast); + return; + ... + } +} +``` +继续进入zend_compile_assign(): +```c +void zend_compile_assign(znode *result, zend_ast *ast) +{ + zend_ast *var_ast = ast->child[0]; //变量名 + zend_ast *expr_ast = ast->child[1];//变量值表达式 + + znode var_node, expr_node; + zend_op *opline; + uint32_t offset; + + if (is_this_fetch(var_ast)) { //检查变量名是否为this,变量名不能是this + zend_error_noreturn(E_COMPILE_ERROR, "Cannot re-assign $this"); + } + + //比如这样写:my_function() = 123;即:将函数的返回值作为变量名将报错 + zend_ensure_writable_variable(var_ast); + + switch (var_ast->kind) { + case ZEND_AST_VAR: + case ZEND_AST_STATIC_PROP: + offset = zend_delayed_compile_begin(); + zend_delayed_compile_var(&var_node, var_ast, BP_VAR_W); + zend_compile_expr(&expr_node, expr_ast); + zend_delayed_compile_end(offset); + zend_emit_op(result, ZEND_ASSIGN, &var_node, &expr_node); + return; + ... + } +} +``` From dea119068cf22f8c3218a1bdb0ba477d38511a11 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Tue, 14 Mar 2017 19:15:53 +0800 Subject: [PATCH 040/379] update --- 3/zend_compile_opcode.md | 319 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 315 insertions(+), 4 deletions(-) diff --git a/3/zend_compile_opcode.md b/3/zend_compile_opcode.md index f840e12..214e726 100644 --- a/3/zend_compile_opcode.md +++ b/3/zend_compile_opcode.md @@ -2,7 +2,288 @@ 上一小节我们简单介绍了从PHP代码解析为抽象语法树的过程,这一节我们再介绍下从__抽象语法树->Opcodes__的过程。 -语法解析过程的产物保存于CG(AST),接着zend引擎会把AST进一步编译为__zend_op_array__,它是编译阶段最终的产物,也是执行阶段的输入,后面我们介绍的东西基本都是围绕zend_op_array展开的,我们接着看下语法解析(zendparse())之后的流程: +语法解析过程的产物保存于CG(AST),接着zend引擎会把AST进一步编译为__zend_op_array__,它是编译阶段最终的产物,也是执行阶段的输入,后面我们介绍的东西基本都是围绕zend_op_array展开的,AST解析过程确定了当前脚本定义了哪些变量,并为这些变量__顺序编号__,这些值在使用时都是按照这个编号获取的,另外也将变量的初始化值、调用的函数/类/常量名称等值(称之为字面量)保存到zend_op_array.literals中,这些字面量也有一个唯一的编号,所以执行的过程实际就是根据各指令调用不同的C函数,然后根据变量、字面量、临时变量的编号对这些值进行处理加工。 + + +#### 3.1.2.1 zend_op_array数据结构 +PHP主脚本会生成一个zend_op_array,每个function也会编译为独立的zend_op_array,所以从二进制程序的角度看zend_op_array包含着当前作用域下的所有堆栈信息,函数调用实际就是不同zend_op_array间的切换。 + +我们首先看下zend_op_array的结构,明确几个关键信息,然后再看下ast编译为zend_op_array的过程。 + +![zend_compile](../img/zend_compile.png) + +```c +struct _zend_op_array { + //common是普通函数或类成员方法对应的opcodes快速访问时使用的字段,后面分析PHP函数实现的时候会详细讲 + ... + + uint32_t *refcount; + + uint32_t this_var; + + uint32_t last; + //opcode指令数组 + zend_op *opcodes; + + //PHP代码里定义的变量数:op_type为IS_CV的变量,不含IS_TMP_VAR、IS_VAR的 + //编译前此值为0,然后发现一个新变量这个值就加1 + int last_var; + //临时变量数:op_type为IS_TMP_VAR、IS_VAR的变量 + uint32_t T; + //PHP变量名数组 + zend_string **vars; //这个数组在ast编译期间配合last_var用来确定各个变量的编号,非常重要的一步操作 + ... + + //静态变量符号表:通过static声明的 + HashTable *static_variables; + ... + + //字面量数量 + int last_literal; + //字面量(常量)数组,这些都是在PHP代码定义的一些值 + zval *literals; + + //运行时缓存数组大小 + int cache_size; + //运行时缓存,主要用于缓存一些znode_op以便于快速获取数据,后面单独介绍这个机制 + void **run_time_cache; + + void *reserved[ZEND_MAX_RESERVED_RESOURCES]; +}; +``` +zend_op_array.opcodes指向指令列表,具体每条指令的结构如下: +```c +struct _zend_op { + const void *handler; //指令执行handler + znode_op op1; //操作数1 + znode_op op2; //操作数2 + znode_op result; //返回值 + uint32_t extended_value; + uint32_t lineno; + zend_uchar opcode; //opcode指令 + zend_uchar op1_type; //操作数1类型 + zend_uchar op2_type; //操作数2类型 + zend_uchar result_type; //返回值类型 +}; + +//操作数结构 +typedef union _znode_op { + uint32_t constant; + uint32_t var; + uint32_t num; + uint32_t opline_num; /* Needs to be signed */ + uint32_t jmp_offset; +} znode_op; +``` +opcode各字段含义下面展开说明。 + +##### 3.1.2.1.1 handler +handler为每条opcode对应的C语言编写的__处理过程__,所有opcode对应的处理过程定义在`zend_vm_def.h`中,值得注意的是这个文件并不是编译时用到的,因为opcode的__处理过程__有三种不同的提供形式:CALL、SWITCH、GOTO,默认方式为CALL,这个是什么意思呢? + +每个opcode都代表了一些特定的处理操作,这个东西怎么提供呢?一种是把每种opcode负责的工作封装成一个function,然后执行器循环执行即可,这就是CALL模式的工作方式;另外一种是把所有opcode的处理方式通过C语言里面的label标签区分开,然后执行器执行的时候goto到相应的位置处理,这就是GOTO模式的工作方式;最后还有一种方式是把所有的处理方式写到一个switch下,然后通过case不同的opcode执行具体的操作,这就是SWITCH模式的工作方式。 + +假设opcode数组是这个样子: +```c +int op_array[] = { + opcode_1, + opcode_2, + opcode_3, + ... +}; +``` +各模式下的工作过程类似这样: +```c +//CALL模式 +void opcode_1_handler() {...} + +void opcode_2_handler() {...} +... + +void execute(int []op_array) +{ + void *opcode_handler_list[] = {&opcode_1_handler, &opcode_2_handler, ...}; + + while(1){ + void handler = opcode_handler_list[op_array[i]]; + handler(); //call handler + i++; + } +} + +//GOTO模式 +void execute(int []op_array) +{ + while(1){ + goto opcode_xx_handler_label; + } + +opcode_1_handler_label: + ... + +opcode_2_handler_label: + ... +... +} + +//SWITCH模式 +void execute(int []op_array) +{ + while(1){ + switch(op_array[i]){ + case opcode_1: + ... + case opcode_2: + ... + ... + } + + i++; + } +} +``` +三种模式效率是不同的,GOTO最快,怎么选择其它模式呢?下载PHP源码后不要直接编译,Zend目录下有个文件:`zend_vm_gen.php`,在编译PHP前执行:`php zend_vm_gen.php --with-vm-kind=CALL|SWITCH|GOTO`,这个脚本将重新生成:`zend_vm_opcodes.h`、`zend_vm_opcodes.c`、`zend_vm_execute.h`三个文件覆盖原来的,然后再编译PHP即可。 + +后面分析的过程使用的都是默认模式`CALL`,也就是opcode对应的handler为一个函数指针,编译时opcode对应的handler是如何根据opcode索引到的呢? + +opcode的数值各不相同,同时可以根据两个zend_op的类型设置不同的处理handler,因此每个opcode指令最多有20个(25去掉重复的5个)对应的处理handler,所有的handler按照opcode数值的顺序定义在一个大数组中:`zend_opcode_handlers`,每25个为同一个opcode,如果对应的op_type类型handler则可以设置为空: +```c +//zend_vm_execute.h +void zend_init_opcodes_handlers(void) +{ + static const void *labels[] = { + ZEND_NOP_SPEC_HANDLER, + ZEND_NOP_SPEC_HANDLER, + ... + }; + zend_opcode_handlers = labels; +} +``` +索引的算法: + +```c +//zend_vm_execute.h +static const void *zend_vm_get_opcode_handler(zend_uchar opcode, const zend_op* op) +{ + //因为op_type为2的倍数,所以这里做了下转化,转成了0-4 + static const int zend_vm_decode[] = { + _UNUSED_CODE, /* 0 */ + _CONST_CODE, /* 1 = IS_CONST */ + _TMP_CODE, /* 2 = IS_TMP_VAR */ + _UNUSED_CODE, /* 3 */ + _VAR_CODE, /* 4 = IS_VAR */ + _UNUSED_CODE, /* 5 */ + _UNUSED_CODE, /* 6 */ + _UNUSED_CODE, /* 7 */ + _UNUSED_CODE, /* 8 = IS_UNUSED */ + _UNUSED_CODE, /* 9 */ + _UNUSED_CODE, /* 10 */ + _UNUSED_CODE, /* 11 */ + _UNUSED_CODE, /* 12 */ + _UNUSED_CODE, /* 13 */ + _UNUSED_CODE, /* 14 */ + _UNUSED_CODE, /* 15 */ + _CV_CODE /* 16 = IS_CV */ + }; + //根据op1_type、op2_type、opcode得到对应的handler + return zend_opcode_handlers[opcode * 25 + zend_vm_decode[op->op1_type] * 5 + zend_vm_decode[op->op2_type]]; +} + +ZEND_API void zend_vm_set_opcode_handler(zend_op* op) +{ + //设置zend_op的handler,这个操作是在编译期间完成的 + op->handler = zend_vm_get_opcode_handler(zend_user_opcodes[op->opcode], op); +} + +#define _CONST_CODE 0 +#define _TMP_CODE 1 +#define _VAR_CODE 2 +#define _UNUSED_CODE 3 +#define _CV_CODE 4 +``` +##### 3.1.2.1.2 操作数(znode_op) +操作数类型实际就是个32位整形,它主要用于存储一些变量的索引位置、数值记录等等。 + +```c +typedef union _znode_op { + uint32_t constant; + uint32_t var; + uint32_t num; + uint32_t opline_num; /* Needs to be signed */ + uint32_t jmp_offset; +} znode_op; +``` +每条opcode都有两个操作数(不一定都用到),操作数记录着当前指令的关键信息,可以用于变量的存储、访问,比如赋值语句:"$a = 45;",两个操作数分别记录"$a"、"45"的存储位置,执行时根据op2取到值"45",然后赋值给"$a",而"$a"的位置通过op1获取到。当然操作数并不是全部这么用的,上面只是赋值时候的情况,其它操作会有不同的用法,如函数调用时的传参,op1记录的就是传递的参数是第几个,op2记录的是参数的存储位置,result记录的是函数接收参数的存储位置。 + +##### 3.1.2.1.3 操作数类型(op_type) + +每个操作都有5种不同的类型: + +```c +#define IS_CONST (1<<0) //1 +#define IS_TMP_VAR (1<<1) //2 +#define IS_VAR (1<<2) //4 +#define IS_UNUSED (1<<3) //8 +#define IS_CV (1<<4) //16 +``` +* IS_CONST:字面量,编译时就可确定且不会改变的值,比如:$a = "hello~",其中字符串"hello~"就是常量 +* IS_TMP_VAR:临时变量,比如:$a = "hello~" . time(),其中`"hello~" . time()`的值类型就是IS_TMP_VAR,再比如:$a = "123" + $b,`"123" + $b`的结果类型也是IS_TMP_VAR,从这两个例子可以猜测,临时变量多是执行期间其它类型组合现生成的一个中间值,由于它是现生成的,所以把IS_TMP_VAR赋值给IS_CV变量时不会增加其引用计数 +* IS_VAR:PHP变量,这个很容易认为是PHP脚本里的变量,其实不是,这里PHP变量的含义可以这样理解:PHP变量是没有显式的在PHP脚本中定义的,不是直接在代码通过`$var_name`定义的。这个类型最常见的例子是PHP函数的返回值,再如`$a[0]`数组这种,它取出的值也是`IS_VAR`,再比如`$$a`这种 +* IS_UNUSED:表示操作数没有用 +* IS_CV:PHP脚本变量,即脚本里通过`$var_name`定义的变量,这些变量是编译阶段确定的,所以是compile variable, + +`result_type`除了上面几种类型外还有一种类型`EXT_TYPE_UNUSED (1<<5)`,返回值没有使用时会用到,这个跟`IS_UNUSED`的区别是:`IS_UNUSED`表示本操作返回值没有意义(也可简单的认为没有返回值),而`EXT_TYPE_UNUSED`的含义是有返回值,但是没有用到,比如函数返回值没有接收。 + +##### 3.1.2.1.4 字面量、变量的存储 + +我们先想一下C程序是如何读写字面量、变量的。 + +```c +#include +int main() +{ + char *name = "pangudashu"; + + printf("%s\n", name); + return 0; +} +``` +我们知道name的值分配在栈上,而"pangudashu"分配在常量区,那么"name"变量名分配在哪呢? + +实际上C里面是不会存变量名称的,编译的过程会将变量名替换为偏移量表示:`ebp - 偏移量`或`esp + 偏移量`,将上面的代码转为汇编: +```c +.LC0: + .string "pangudashu" + .text + .globl main + .type main, @function +main: +.LFB0: + pushq %rbp + movq %rsp, %rbp + subq $16, %rsp + movq $.LC0, -8(%rbp) + movq -8(%rbp), %rax + movq %rax, %rdi + call puts + movl $0, %eax + leave +``` +可以看到`movq $.LC0, -8(%rbp)`,而`-8(%rbp)`就是name变量。 + +虽然PHP代码不会直接编译为机器码,但编译、执行的设计跟C程序是一致的,也有常量区、变量也通过偏移量访问、也有虚拟的执行栈。 + +![php vs c](../img/php_vs_c.png) + +在编译时就可确定且不会改变的量称为字面量,也称作常量(IS_CONST),这些值在编译阶段就已经分配zval,保存在`zend_op_array->literals`数组中(对应c程序的常量内存区),访问时通过`_zend_op_array->literals + 偏移量`读取,举个例子: +```c +literals + 0)`取到,`hello`通过`(zval*)(_zend_op_array->literals + 16)`取到,具体变量的读写操作将在执行阶段详细分析,这里只分析编译阶段的操作。 + +#### 3.1.2.2 AST->zend_op_array +上面我们介绍了zend_op_array结构,接下来我们回过头去看下语法解析(zendparse())之后的流程: ```c ZEND_API zend_op_array *compile_file(zend_file_handle *file_handle, int type) @@ -166,12 +447,42 @@ void zend_compile_assign(znode *result, zend_ast *ast) case ZEND_AST_VAR: case ZEND_AST_STATIC_PROP: offset = zend_delayed_compile_begin(); - zend_delayed_compile_var(&var_node, var_ast, BP_VAR_W); - zend_compile_expr(&expr_node, expr_ast); + zend_delayed_compile_var(&var_node, var_ast, BP_VAR_W); //生成变量名的znode + zend_compile_expr(&expr_node, expr_ast); //递归编译变量值表达式,最终需要得到一个ZEND_AST_ZVAL的节点 zend_delayed_compile_end(offset); - zend_emit_op(result, ZEND_ASSIGN, &var_node, &expr_node); + zend_emit_op(result, ZEND_ASSIGN, &var_node, &expr_node); //生成一条op + return; + ... + } +} +``` +这个地方主要有三步关键操作: + +__第1步:__变量赋值操作有两部分:变量名、变量值,所以首先是针对变量名的操作。 +```c +void zend_delayed_compile_var(znode *result, zend_ast *ast, uint32_t type) +{ + zend_op *opline; + switch (ast->kind) { + case ZEND_AST_VAR: + zend_compile_simple_var(result, ast, type, 1); return; ... + default: + zend_compile_var(result, ast, type); + return; + } +} + +static void zend_compile_simple_var(znode *result, zend_ast *ast, uint32_t type, int delayed) /* {{{ */ +{ + if (zend_try_compile_cv(result, ast) == FAILURE) { + zend_op *opline = zend_compile_simple_var_no_cv(result, ast, type, delayed); + zend_adjust_for_fetch_type(opline, type); } } + + ``` + + From dcf2ecb4aea262b57a76fe7ab212cf9f4d34653d Mon Sep 17 00:00:00 2001 From: qinpeng Date: Tue, 14 Mar 2017 20:07:21 +0800 Subject: [PATCH 041/379] update --- 3/zend_compile_opcode.md | 54 ++++++++++++++++++++++------------------ 1 file changed, 30 insertions(+), 24 deletions(-) diff --git a/3/zend_compile_opcode.md b/3/zend_compile_opcode.md index 214e726..4ff279f 100644 --- a/3/zend_compile_opcode.md +++ b/3/zend_compile_opcode.md @@ -4,12 +4,10 @@ 语法解析过程的产物保存于CG(AST),接着zend引擎会把AST进一步编译为__zend_op_array__,它是编译阶段最终的产物,也是执行阶段的输入,后面我们介绍的东西基本都是围绕zend_op_array展开的,AST解析过程确定了当前脚本定义了哪些变量,并为这些变量__顺序编号__,这些值在使用时都是按照这个编号获取的,另外也将变量的初始化值、调用的函数/类/常量名称等值(称之为字面量)保存到zend_op_array.literals中,这些字面量也有一个唯一的编号,所以执行的过程实际就是根据各指令调用不同的C函数,然后根据变量、字面量、临时变量的编号对这些值进行处理加工。 - +我们首先看下zend_op_array的结构,明确几个关键信息,然后再看下ast编译为zend_op_array的过程。 #### 3.1.2.1 zend_op_array数据结构 PHP主脚本会生成一个zend_op_array,每个function也会编译为独立的zend_op_array,所以从二进制程序的角度看zend_op_array包含着当前作用域下的所有堆栈信息,函数调用实际就是不同zend_op_array间的切换。 -我们首先看下zend_op_array的结构,明确几个关键信息,然后再看下ast编译为zend_op_array的过程。 - ![zend_compile](../img/zend_compile.png) ```c @@ -447,7 +445,7 @@ void zend_compile_assign(znode *result, zend_ast *ast) case ZEND_AST_VAR: case ZEND_AST_STATIC_PROP: offset = zend_delayed_compile_begin(); - zend_delayed_compile_var(&var_node, var_ast, BP_VAR_W); //生成变量名的znode + zend_delayed_compile_var(&var_node, var_ast, BP_VAR_W); //生成变量名的znode,这个结构只在这个地方临时用,所以直接分配在stack上 zend_compile_expr(&expr_node, expr_ast); //递归编译变量值表达式,最终需要得到一个ZEND_AST_ZVAL的节点 zend_delayed_compile_end(offset); zend_emit_op(result, ZEND_ASSIGN, &var_node, &expr_node); //生成一条op @@ -458,31 +456,39 @@ void zend_compile_assign(znode *result, zend_ast *ast) ``` 这个地方主要有三步关键操作: -__第1步:__变量赋值操作有两部分:变量名、变量值,所以首先是针对变量名的操作。 +__第1步:__变量赋值操作有两部分:变量名、变量值,所以首先是针对变量名的操作,介绍zend_op_array时曾提到每个PHP变量都有一个编号,变量的读写都是根据这个编号操作的,这个编号最早就是这一步生成的。 + +![](../img/zend_lookup_cv.png) + +中间过程我们不再细看,这里重点看下变量编号的过程,这个过程比较简单,每发现一个变量就遍历zend_op_array.vars数组,看此变量是否已经保存,没有保存的话则存入vars,然后后续变量的使用都是用的这个变量在数组中的下标,比如第一次定义的时候:`$a = 123;`将$a编号为0,然后:`echo $a;`再次使用时会遍历vars,直接用0操作$a。 ```c -void zend_delayed_compile_var(znode *result, zend_ast *ast, uint32_t type) +static int lookup_cv(zend_op_array *op_array, zend_string* name) { - zend_op *opline; - switch (ast->kind) { - case ZEND_AST_VAR: - zend_compile_simple_var(result, ast, type, 1); - return; - ... - default: - zend_compile_var(result, ast, type); - return; + int i = 0; + zend_ulong hash_value = zend_string_hash_val(name); + + //遍历op_array.vars检查此变量是否已存在 + while (i < op_array->last_var) { + if (ZSTR_VAL(op_array->vars[i]) == ZSTR_VAL(name) || + (ZSTR_H(op_array->vars[i]) == hash_value && + ZSTR_LEN(op_array->vars[i]) == ZSTR_LEN(name) && + memcmp(ZSTR_VAL(op_array->vars[i]), ZSTR_VAL(name), ZSTR_LEN(name)) == 0)) { + zend_string_release(name); + return (int)(zend_intptr_t)ZEND_CALL_VAR_NUM(NULL, i); + } + i++; } -} - -static void zend_compile_simple_var(znode *result, zend_ast *ast, uint32_t type, int delayed) /* {{{ */ -{ - if (zend_try_compile_cv(result, ast) == FAILURE) { - zend_op *opline = zend_compile_simple_var_no_cv(result, ast, type, delayed); - zend_adjust_for_fetch_type(opline, type); + //这是一个新变量 + i = op_array->last_var; + op_array->last_var++; + if (op_array->last_var > CG(context).vars_size) { + CG(context).vars_size += 16; /* FIXME */ + op_array->vars = erealloc(op_array->vars, CG(context).vars_size * sizeof(zend_string*)); } -} - + op_array->vars[i] = zend_new_interned_string(name); + return (int)(zend_intptr_t)ZEND_CALL_VAR_NUM(NULL, i); //传NULL时返回的就是i +} ``` From 52d4b4742cf16e08f101bb0beffd654e203de2d5 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Tue, 14 Mar 2017 21:08:08 +0800 Subject: [PATCH 042/379] udpate --- 3/zend_compile_opcode.md | 59 ++++++++++++++++++++++++++++++++++++--- img/zend_lookup_cv.png | Bin 0 -> 38874 bytes 2 files changed, 55 insertions(+), 4 deletions(-) create mode 100644 img/zend_lookup_cv.png diff --git a/3/zend_compile_opcode.md b/3/zend_compile_opcode.md index 4ff279f..021dc07 100644 --- a/3/zend_compile_opcode.md +++ b/3/zend_compile_opcode.md @@ -401,9 +401,11 @@ zendparse()阶段生成的AST: ![zend_ast](../img/zend_ast.png) -(1)首先从根节点开始,有3个child,第一个节点类型为ZEND_AST_ASSIGN,zend_compile_stmt()中走到default分支 +下面的过程比较复杂,有的函数会多次递归调用,我们根据例子一步步去看下,如果你对PHP各个语法实现比较熟悉再去看整个AST的编译过程就会比较轻松。 -(2)ZEND_AST_ASSIGN类型由zend_compile_expr()处理: +__(1)__首先从根节点开始,有3个child,第一个节点类型为ZEND_AST_ASSIGN,zend_compile_stmt()中走到default分支 + +__(2)__ZEND_AST_ASSIGN类型由zend_compile_expr()处理: ```c void zend_compile_expr(znode *result, zend_ast *ast) { @@ -460,7 +462,7 @@ __第1步:__变量赋值操作有两部分:变量名、变量值,所以首 ![](../img/zend_lookup_cv.png) -中间过程我们不再细看,这里重点看下变量编号的过程,这个过程比较简单,每发现一个变量就遍历zend_op_array.vars数组,看此变量是否已经保存,没有保存的话则存入vars,然后后续变量的使用都是用的这个变量在数组中的下标,比如第一次定义的时候:`$a = 123;`将$a编号为0,然后:`echo $a;`再次使用时会遍历vars,直接用0操作$a。 +中间过程我们不再细看,这里重点看下变量编号的过程,这个过程比较简单,每发现一个变量就遍历zend_op_array.vars数组,看此变量是否已经保存,没有保存的话则存入vars,然后后续变量的使用都是用的这个变量在数组中的下标,比如第一次定义的时候:`$a = 123;`将$a编号为0,然后:`echo $a;`再次使用时会遍历vars,发现已经存在,直接用其下标操作$a。 ```c static int lookup_cv(zend_op_array *op_array, zend_string* name) { @@ -483,12 +485,61 @@ static int lookup_cv(zend_op_array *op_array, zend_string* name) op_array->last_var++; if (op_array->last_var > CG(context).vars_size) { CG(context).vars_size += 16; /* FIXME */ - op_array->vars = erealloc(op_array->vars, CG(context).vars_size * sizeof(zend_string*)); + op_array->vars = erealloc(op_array->vars, CG(context).vars_size * sizeof(zend_string*));//扩容vars } op_array->vars[i] = zend_new_interned_string(name); return (int)(zend_intptr_t)ZEND_CALL_VAR_NUM(NULL, i); //传NULL时返回的就是i } ``` +__第2步:__编译变量值表达式,再次调用zend_compile_expr()编译,示例中的情况比较简单,expr_ast.kind为ZEND_AST_ZVAL: +```c +void zend_compile_expr(znode *result, zend_ast *ast) +{ + switch (ast->kind) { + case ZEND_AST_ZVAL: + ZVAL_COPY(&result->u.constant, zend_ast_get_zval(ast)); //将变量值复制到znode.u.constant中 + result->op_type = IS_CONST; //类型为IS_CONST,这种value后面将会保存在zend_op_array.literals中 + return; + ... + } +} +``` +__第3步:__上面两步已经分别生成了变量赋值的op1、op2,下面就是根据这俩值生成opcode的过程。 +```c +tatic zend_op *zend_emit_op(znode *result, zend_uchar opcode, znode *op1, znode *op2) /* {{{ */ +{ + zend_op *opline = get_next_op(CG(active_op_array)); //当前zend_op_array下生成一条新的指令 + opline->opcode = opcode; + //将op1、op2内容拷贝到zend_op中,设置op_type + //如果znode.op_type == IS_CONST,则会将znode.u.contstant值转移到zend_op_array.literals中 + if (op1 == NULL) { + SET_UNUSED(opline->op1); + } else { + SET_NODE(opline->op1, op1); + } + + if (op2 == NULL) { + SET_UNUSED(opline->op2); + } else { + SET_NODE(opline->op2, op2); + } + + //如果此指令有返回值则想变量那样为返回值编号(后面分配局部变量时将根据这个编号索引) + if (result) { + zend_make_var_result(result, opline); + } + return opline; +} + +static inline void zend_make_var_result(znode *result, zend_op *opline) +{ + opline->result_type = IS_VAR; //返回值类型固定为IS_VAR + opline->result.var = get_temporary_variable(CG(active_op_array)); //为返回值编个号,这个编号记在临时变量T上,上面介绍zend_op_array时说过T、last_var的区别 + GET_NODE(result, opline->result); +} +``` +到这我们示例中的第1条赋值语句就算编译完了,第2条同样是赋值,过程与上面相同,我们直接看最好一条输出的语句。 +__(3)__echo语句的编译。 diff --git a/img/zend_lookup_cv.png b/img/zend_lookup_cv.png new file mode 100644 index 0000000000000000000000000000000000000000..6128fe9b591b66870748a545a28b62763a2d8a52 GIT binary patch literal 38874 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

)rk1Fm~Z_*R8X5v0XN|1i%*} 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 Date: Tue, 14 Mar 2017 21:10:16 +0800 Subject: [PATCH 043/379] update --- 3/zend_compile_opcode.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/3/zend_compile_opcode.md b/3/zend_compile_opcode.md index 021dc07..6f8dbdf 100644 --- a/3/zend_compile_opcode.md +++ b/3/zend_compile_opcode.md @@ -507,7 +507,7 @@ void zend_compile_expr(znode *result, zend_ast *ast) ``` __第3步:__上面两步已经分别生成了变量赋值的op1、op2,下面就是根据这俩值生成opcode的过程。 ```c -tatic zend_op *zend_emit_op(znode *result, zend_uchar opcode, znode *op1, znode *op2) /* {{{ */ +tatic zend_op *zend_emit_op(znode *result, zend_uchar opcode, znode *op1, znode *op2) { zend_op *opline = get_next_op(CG(active_op_array)); //当前zend_op_array下生成一条新的指令 opline->opcode = opcode; @@ -542,4 +542,4 @@ static inline void zend_make_var_result(znode *result, zend_op *opline) ``` 到这我们示例中的第1条赋值语句就算编译完了,第2条同样是赋值,过程与上面相同,我们直接看最好一条输出的语句。 -__(3)__echo语句的编译。 +__(3)、__ echo语句的编译。 From 882425f3aa78e1ecb59c87d87464c58b1e0ba38d Mon Sep 17 00:00:00 2001 From: qinpeng Date: Tue, 14 Mar 2017 21:11:30 +0800 Subject: [PATCH 044/379] update --- 3/zend_compile_opcode.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/3/zend_compile_opcode.md b/3/zend_compile_opcode.md index 6f8dbdf..dcb7a82 100644 --- a/3/zend_compile_opcode.md +++ b/3/zend_compile_opcode.md @@ -403,9 +403,9 @@ zendparse()阶段生成的AST: 下面的过程比较复杂,有的函数会多次递归调用,我们根据例子一步步去看下,如果你对PHP各个语法实现比较熟悉再去看整个AST的编译过程就会比较轻松。 -__(1)__首先从根节点开始,有3个child,第一个节点类型为ZEND_AST_ASSIGN,zend_compile_stmt()中走到default分支 +__(1)、__ 首先从根节点开始,有3个child,第一个节点类型为ZEND_AST_ASSIGN,zend_compile_stmt()中走到default分支 -__(2)__ZEND_AST_ASSIGN类型由zend_compile_expr()处理: +__(2)、__ ZEND_AST_ASSIGN类型由zend_compile_expr()处理: ```c void zend_compile_expr(znode *result, zend_ast *ast) { @@ -458,7 +458,7 @@ void zend_compile_assign(znode *result, zend_ast *ast) ``` 这个地方主要有三步关键操作: -__第1步:__变量赋值操作有两部分:变量名、变量值,所以首先是针对变量名的操作,介绍zend_op_array时曾提到每个PHP变量都有一个编号,变量的读写都是根据这个编号操作的,这个编号最早就是这一步生成的。 +__第1步:__ 变量赋值操作有两部分:变量名、变量值,所以首先是针对变量名的操作,介绍zend_op_array时曾提到每个PHP变量都有一个编号,变量的读写都是根据这个编号操作的,这个编号最早就是这一步生成的。 ![](../img/zend_lookup_cv.png) @@ -492,7 +492,7 @@ static int lookup_cv(zend_op_array *op_array, zend_string* name) return (int)(zend_intptr_t)ZEND_CALL_VAR_NUM(NULL, i); //传NULL时返回的就是i } ``` -__第2步:__编译变量值表达式,再次调用zend_compile_expr()编译,示例中的情况比较简单,expr_ast.kind为ZEND_AST_ZVAL: +__第2步:__ 编译变量值表达式,再次调用zend_compile_expr()编译,示例中的情况比较简单,expr_ast.kind为ZEND_AST_ZVAL: ```c void zend_compile_expr(znode *result, zend_ast *ast) { @@ -505,7 +505,7 @@ void zend_compile_expr(znode *result, zend_ast *ast) } } ``` -__第3步:__上面两步已经分别生成了变量赋值的op1、op2,下面就是根据这俩值生成opcode的过程。 +__第3步:__ 上面两步已经分别生成了变量赋值的op1、op2,下面就是根据这俩值生成opcode的过程。 ```c tatic zend_op *zend_emit_op(znode *result, zend_uchar opcode, znode *op1, znode *op2) { From d8d3475210c110d6c5832e3ef0c85f63b2b33701 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Tue, 14 Mar 2017 21:14:17 +0800 Subject: [PATCH 045/379] update --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index c809d4f..52171ea 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,7 @@ * 第3章 Zend虚拟机 * [3.1 PHP代码的编译](3/zend_compile.md) * [3.1.1 词法解析、语法解析](3/zend_compile_parse.md) + * [3.1.2 抽象语法树编译流程](3/zend_compile_opcode.md) * [3.2 函数实现](3/function_implement.md) * [3.2.1 内部函数](3/function_implement.md) * 3.2.2 用户函数的实现 From 4697d981d87d98598d5097cdf18a0f820a1b15e8 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Wed, 15 Mar 2017 10:57:50 +0800 Subject: [PATCH 046/379] rm useless --- 3/zend_compile.md | 320 +--------------------------------------------- 1 file changed, 1 insertion(+), 319 deletions(-) diff --git a/3/zend_compile.md b/3/zend_compile.md index 51fc949..959d39a 100644 --- a/3/zend_compile.md +++ b/3/zend_compile.md @@ -4,8 +4,6 @@ PHP是解析型高级语言,事实上从Zend内核的角度来看PHP就是一 那么这个"翻译"过程具体都有哪些操作呢? -### 3.1.1 PHP的基本编译实现 - C程序在编译时将一行行代码编译为机器码,每一个操作都认为是一条机器指令,这些指令写入到编译后的二进制程序中,执行的时候将二进制程序load进相应的内存区域(常量区、数据区、代码区)、分配运行栈,然后从代码区起始位置开始执行,这是C程序编译、执行的简单过程。 同样,PHP的编译与普通的C程序类似,只是PHP代码没有编译成机器码,而是解析成了若干条opcode数组,每条opcode就是C里面普通的struct,含义对应C程序的机器指令,执行的过程就是引擎依次执行opcode,比如我们在PHP里定义一个变量:`$a = 123;`,最终到内核里执行就是malloc一块内存,然后把值写进去。 @@ -16,324 +14,8 @@ C程序在编译时将一行行代码编译为机器码,每一个操作都认 ![zend_compile2](../img/zend_compile2.png) -re2c的示例:(http://re2c.org/examples/examples.html) -```c -#include - -static const char *lex(const char *YYCURSOR) -{ - const char *YYMARKER; - /*!re2c - re2c:define:YYCTYPE = char; - re2c:yyfill:enable = 0; - - end = "\x00"; - bin = '0b' [01]+; - oct = "0" [0-7]*; - dec = [1-9][0-9]*; - hex = '0x' [0-9a-fA-F]+; - - * { return "err"; } - bin end { return "bin"; } - oct end { return "oct"; } - dec end { return "dec"; } - hex end { return "hex"; } - */ -} - -int main(int argc, char **argv) -{ - for (int i = 1; i < argc; ++i) { - printf ("%s: %s\n", lex(argv[i]), argv[i]); - } - return 0; -} -``` -### 3.1.2 编译过程 PHP编译阶段的基本过程如下图: ![zend_compile_process](../img/zend_compile_process.png) -zendparse、zend_compile_top_stmt的过程没作深入研究,这里只大致说下这两个过程:zendparse是词法、语法分析过程,即前面提到的re2c、bison,这个过程将PHP代码解析为AST,解析过程确定了当前脚本定义了哪些变量,为这些变量按照顺序编号,这些值在使用时都是按照这个编号获取的,另外也将变量的初始化值、调用的函数/类/常量名称等值(称之为字面量)保存到zend_op_array.literals中,这些字面量也有一个唯一的编号,所以执行的过程实际就是根据各指令调用不同的C函数,然后根据变量、字面量、临时变量的编号对这些值进行处理加工。 - -PHP编译阶段最终的产物—opcode数组结构为: - -![zend_compile](../img/zend_compile.png) - -```c -struct _zend_op_array { - //common是普通函数或类成员方法对应的opcodes快速访问时使用的字段,后面分析PHP函数实现的时候会详细讲 - /* Common elements */ - zend_uchar type; //标识函数类型:1为PHP内部函数(扩展或内核提供的函数)、2为用户自定义函数(即PHP代码中写的function) - zend_uchar arg_flags[3]; /* bitset of arg_info.pass_by_reference */ - uint32_t fn_flags; - zend_string *function_name; //函数名 - zend_class_entry *scope; //所属class - zend_function *prototype; - uint32_t num_args; //参数数量 - uint32_t required_num_args; //必传参数数量 - zend_arg_info *arg_info; //参数信息 - /* END of common elements */ - - uint32_t *refcount; - - uint32_t this_var; - - uint32_t last; - //opcode指令数组 - zend_op *opcodes; - - //PHP代码里定义的变量数:op_type为IS_CV的变量,不含IS_TMP_VAR、IS_VAR的 - int last_var; - //临时变量数:op_type为IS_TMP_VAR、IS_VAR的变量 - uint32_t T; - //PHP变量名列表 - zend_string **vars; - - int last_brk_cont; - int last_try_catch; - zend_brk_cont_element *brk_cont_array; - zend_try_catch_element *try_catch_array; - - //静态变量符号表:通过static声明的 - HashTable *static_variables; - - zend_string *filename; //PHP文件路径 - uint32_t line_start; - uint32_t line_end; - zend_string *doc_comment; - uint32_t early_binding; /* the linked list of delayed declarations */ - - //字面量数量 - int last_literal; - //字面量(常量)数组,这些都是在PHP代码定义的一些值 - zval *literals; - - //运行时缓存数组大小 - int cache_size; - //运行时缓存,主要用于缓存一些znode_op以便于快速获取数据,后面单独介绍这个机制 - void **run_time_cache; - - void *reserved[ZEND_MAX_RESERVED_RESOURCES]; -}; - -struct _zend_op { - const void *handler; //指令执行handler - znode_op op1; //操作数1 - znode_op op2; //操作数2 - znode_op result; //返回值 - uint32_t extended_value; - uint32_t lineno; - zend_uchar opcode; //opcode指令 - zend_uchar op1_type; //操作数1类型 - zend_uchar op2_type; //操作数2类型 - zend_uchar result_type; //返回值类型 -}; -``` - -opcode各字段含义下面展开说明。 - -#### 3.1.2.1 handler -handler为每条opcode对应的C语言编写的__处理过程__,所有opcode对应的处理过程定义在`zend_vm_def.h`中,值得注意的是这个文件并不是编译时用到的,因为opcode的__处理过程__有三种不同的提供形式:CALL、SWITCH、GOTO,默认方式为CALL,这个是什么意思呢? - -每个opcode都代表了一些特定的处理操作,这个东西怎么提供呢?一种是把每种opcode负责的工作封装成一个function,然后执行器循环执行即可,这就是CALL模式的工作方式;另外一种是把所有opcode的处理方式通过C语言里面的label标签区分开,然后执行器执行的时候goto到相应的位置处理,这就是GOTO模式的工作方式;最后还有一种方式是把所有的处理方式写到一个switch下,然后通过case不同的opcode执行具体的操作,这就是SWITCH模式的工作方式。 - -假设opcode数组是这个样子: -```c -int op_array[] = { - opcode_1, - opcode_2, - opcode_3, - ... -}; -``` -各模式下的工作过程类似这样: -```c -//CALL模式 -void opcode_1_handler() {...} - -void opcode_2_handler() {...} -... - -void execute(int []op_array) -{ - void *opcode_handler_list[] = {&opcode_1_handler, &opcode_2_handler, ...}; - - while(1){ - void handler = opcode_handler_list[op_array[i]]; - handler(); //call handler - i++; - } -} - -//GOTO模式 -void execute(int []op_array) -{ - while(1){ - goto opcode_xx_handler_label; - } - -opcode_1_handler_label: - ... - -opcode_2_handler_label: - ... -... -} - -//SWITCH模式 -void execute(int []op_array) -{ - while(1){ - switch(op_array[i]){ - case opcode_1: - ... - case opcode_2: - ... - ... - } - - i++; - } -} -``` -三种模式效率是不同的,GOTO最快,怎么选择其它模式呢?下载PHP源码后不要直接编译,Zend目录下有个文件:`zend_vm_gen.php`,在编译PHP前执行:`php zend_vm_gen.php --with-vm-kind=CALL|SWITCH|GOTO`,这个脚本将重新生成:`zend_vm_opcodes.h`、`zend_vm_opcodes.c`、`zend_vm_execute.h`三个文件覆盖原来的,然后再编译PHP即可。 - -后面分析的过程使用的都是默认模式`CALL`,也就是opcode对应的handler为一个函数指针,编译时opcode对应的handler是如何根据opcode索引到的呢? - -opcode的数值各不相同,同时可以根据两个zend_op的类型设置不同的处理handler,因此每个opcode指令最多有20个(25去掉重复的5个)对应的处理handler,所有的handler按照opcode数值的顺序定义在一个大数组中:`zend_opcode_handlers`,每25个为同一个opcode,如果对应的op_type类型handler则可以设置为空: -```c -//zend_vm_execute.h -void zend_init_opcodes_handlers(void) -{ - static const void *labels[] = { - ZEND_NOP_SPEC_HANDLER, - ZEND_NOP_SPEC_HANDLER, - ... - }; - zend_opcode_handlers = labels; -} -``` -索引的算法: -```c -//zend_vm_execute.h -static const void *zend_vm_get_opcode_handler(zend_uchar opcode, const zend_op* op) -{ - //因为op_type为2的倍数,所以这里做了下转化,转成了0-4 - static const int zend_vm_decode[] = { - _UNUSED_CODE, /* 0 */ - _CONST_CODE, /* 1 = IS_CONST */ - _TMP_CODE, /* 2 = IS_TMP_VAR */ - _UNUSED_CODE, /* 3 */ - _VAR_CODE, /* 4 = IS_VAR */ - _UNUSED_CODE, /* 5 */ - _UNUSED_CODE, /* 6 */ - _UNUSED_CODE, /* 7 */ - _UNUSED_CODE, /* 8 = IS_UNUSED */ - _UNUSED_CODE, /* 9 */ - _UNUSED_CODE, /* 10 */ - _UNUSED_CODE, /* 11 */ - _UNUSED_CODE, /* 12 */ - _UNUSED_CODE, /* 13 */ - _UNUSED_CODE, /* 14 */ - _UNUSED_CODE, /* 15 */ - _CV_CODE /* 16 = IS_CV */ - }; - //根据op1_type、op2_type、opcode得到对应的handler - return zend_opcode_handlers[opcode * 25 + zend_vm_decode[op->op1_type] * 5 + zend_vm_decode[op->op2_type]]; -} - -ZEND_API void zend_vm_set_opcode_handler(zend_op* op) -{ - //设置zend_op的handler,这个操作是在编译期间完成的 - op->handler = zend_vm_get_opcode_handler(zend_user_opcodes[op->opcode], op); -} - -#define _CONST_CODE 0 -#define _TMP_CODE 1 -#define _VAR_CODE 2 -#define _UNUSED_CODE 3 -#define _CV_CODE 4 -``` - -#### 3.1.2.2 操作数(znode_op) -操作数类型实际就是个32位整形,它主要用于存储一些变量的索引位置、数值记录等等。 - -```c -typedef union _znode_op { - uint32_t constant; - uint32_t var; - uint32_t num; - uint32_t opline_num; /* Needs to be signed */ - uint32_t jmp_offset; -} znode_op; -``` -每条opcode都有两个操作数(不一定都用到),操作数记录着当前指令的关键信息,可以用于变量的存储、访问,比如赋值语句:"$a = 45;",两个操作数分别记录"$a"、"45"的存储位置,执行时根据op2取到值"45",然后赋值给"$a",而"$a"的位置通过op1获取到。当然操作数并不是全部这么用的,上面只是赋值时候的情况,其它操作会有不同的用法,如函数调用时的传参,op1记录的就是传递的参数是第几个,op2记录的是参数的存储位置,result记录的是函数接收参数的存储位置。 - -#### 3.1.2.3 操作数类型(op_type) - -每个操作都有5种不同的类型: - -```c -#define IS_CONST (1<<0) //1 -#define IS_TMP_VAR (1<<1) //2 -#define IS_VAR (1<<2) //4 -#define IS_UNUSED (1<<3) //8 -#define IS_CV (1<<4) //16 -``` -* IS_CONST:字面量,编译时就可确定且不会改变的值,比如:$a = "hello~",其中字符串"hello~"就是常量 -* IS_TMP_VAR:临时变量,比如:$a = "hello~" . time(),其中`"hello~" . time()`的值类型就是IS_TMP_VAR,再比如:$a = "123" + $b,`"123" + $b`的结果类型也是IS_TMP_VAR,从这两个例子可以猜测,临时变量多是执行期间其它类型组合现生成的一个中间值,由于它是现生成的,所以把IS_TMP_VAR赋值给IS_CV变量时不会增加其引用计数 -* IS_VAR:PHP变量,这个很容易认为是PHP脚本里的变量,其实不是,这里PHP变量的含义可以这样理解:PHP变量是没有显式的在PHP脚本中定义的,不是直接在代码通过`$var_name`定义的。这个类型最常见的例子是PHP函数的返回值,再如`$a[0]`数组这种,它取出的值也是`IS_VAR`,再比如`$$a`这种 -* IS_UNUSED:表示操作数没有用 -* IS_CV:PHP脚本变量,即脚本里通过`$var_name`定义的变量,这些变量是编译阶段确定的,所以是compile variable, - -`result_type`除了上面几种类型外还有一种类型`EXT_TYPE_UNUSED (1<<5)`,返回值没有使用时会用到,这个跟`IS_UNUSED`的区别是:`IS_UNUSED`表示本操作返回值没有意义(也可简单的认为没有返回值),而`EXT_TYPE_UNUSED`的含义是有返回值,但是没有用到,比如函数返回值没有接收。 - -#### 3.1.2.4 字面量、变量的存储 - -我们先想一下C程序是如何读写字面量、变量的。 - -```c -#include -int main() -{ - char *name = "pangudashu"; - - printf("%s\n", name); - return 0; -} -``` -我们知道name的值分配在栈上,而"pangudashu"分配在常量区,那么"name"变量名分配在哪呢? - -实际上C里面是不会存变量名称的,编译的过程会将变量名替换为偏移量表示:`ebp - 偏移量`或`esp + 偏移量`,将上面的代码转为汇编: -```c -.LC0: - .string "pangudashu" - .text - .globl main - .type main, @function -main: -.LFB0: - pushq %rbp - movq %rsp, %rbp - subq $16, %rsp - movq $.LC0, -8(%rbp) - movq -8(%rbp), %rax - movq %rax, %rdi - call puts - movl $0, %eax - leave -``` -可以看到`movq $.LC0, -8(%rbp)`,而`-8(%rbp)`就是name变量。 - -虽然PHP代码不会直接编译为机器码,但编译、执行的设计跟C程序是一致的,也有常量区、变量也通过偏移量访问、也有虚拟的执行栈。 - -![php vs c](../img/php_vs_c.png) - -在编译时就可确定且不会改变的量称为字面量,也称作常量(IS_CONST),这些值在编译阶段就已经分配zval,保存在`zend_op_array->literals`数组中(对应c程序的常量内存区),访问时通过`_zend_op_array->literals + 偏移量`读取,举个例子: -```c -literals + 0)`取到,`hello`通过`(zval*)(_zend_op_array->literals + 16)`取到,具体变量的读写操作将在执行阶段详细分析,这里只分析编译阶段的操作。 +后面两个小节将看下__PHP代码->AST->Opcodes__的编译过程。 From 06e70b5068b6e71f3ad232bde202dd8b95586296 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Wed, 15 Mar 2017 10:58:46 +0800 Subject: [PATCH 047/379] rm useless --- 3/zend_compile.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3/zend_compile.md b/3/zend_compile.md index 959d39a..36aa9e2 100644 --- a/3/zend_compile.md +++ b/3/zend_compile.md @@ -18,4 +18,4 @@ PHP编译阶段的基本过程如下图: ![zend_compile_process](../img/zend_compile_process.png) -后面两个小节将看下__PHP代码->AST->Opcodes__的编译过程。 +后面两个小节将看下 __PHP代码->AST->Opcodes__ 的具体编译过程。 From d0c65c015cd6759d59e075781b19dad6d303f03b Mon Sep 17 00:00:00 2001 From: qinpeng Date: Wed, 15 Mar 2017 11:11:45 +0800 Subject: [PATCH 048/379] update --- 3/zend_executor.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3/zend_executor.md b/3/zend_executor.md index 1096f3a..d74c938 100644 --- a/3/zend_executor.md +++ b/3/zend_executor.md @@ -497,7 +497,7 @@ static zend_always_inline void i_free_compiled_variables(zend_execute_data *exec } ``` 除了函数调用完成时有return操作,其它还有两种情况也会有此过程: -* __1.PHP主脚本执行结束时:__也就是PHP脚本开始执行的入口脚本(PHP没有显式的main函数,这种就可以认为是main函数),但是这种情况并不会在return时清理,因为在main函数中定义的变量并非纯碎的局面变量,它们都是全局变量,与$__GET、$__POST是一类,这些全局变量的清理是在request_shutdown阶段处理 +* **1.PHP主脚本执行结束时:**也就是PHP脚本开始执行的入口脚本(PHP没有显式的main函数,这种就可以认为是main函数),但是这种情况并不会在return时清理,因为在main函数中定义的变量并非纯碎的局面变量,它们都是全局变量,与$__GET、$__POST是一类,这些全局变量的清理是在request_shutdown阶段处理 * __2.include、eval:__以include为例,如果include的文件中定义了全局变量,那么这些变量实际与上面1的情况一样,它们的存储位置是在一起的 所以实际上面说的这两种情况属于一类,它们并不是局部变量的清理,而是__全局变量的清理__,另外局部变量的清理也并非只有return一个时机,另外还有一个更重要的时机就是变量分离时,这种情况我们在《PHP语法实现》一节再具体说明。 From 2eabb356d8685ac0c818556fb1c61f2cf80137a8 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Wed, 15 Mar 2017 11:13:43 +0800 Subject: [PATCH 049/379] update --- 3/zend_executor.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/3/zend_executor.md b/3/zend_executor.md index d74c938..949e800 100644 --- a/3/zend_executor.md +++ b/3/zend_executor.md @@ -497,8 +497,8 @@ static zend_always_inline void i_free_compiled_variables(zend_execute_data *exec } ``` 除了函数调用完成时有return操作,其它还有两种情况也会有此过程: -* **1.PHP主脚本执行结束时:**也就是PHP脚本开始执行的入口脚本(PHP没有显式的main函数,这种就可以认为是main函数),但是这种情况并不会在return时清理,因为在main函数中定义的变量并非纯碎的局面变量,它们都是全局变量,与$__GET、$__POST是一类,这些全局变量的清理是在request_shutdown阶段处理 -* __2.include、eval:__以include为例,如果include的文件中定义了全局变量,那么这些变量实际与上面1的情况一样,它们的存储位置是在一起的 +* __1.PHP主脚本执行结束时:__ 也就是PHP脚本开始执行的入口脚本(PHP没有显式的main函数,这种就可以认为是main函数),但是这种情况并不会在return时清理,因为在main函数中定义的变量并非纯碎的局面变量,它们都是全局变量,与$__GET、$__POST是一类,这些全局变量的清理是在request_shutdown阶段处理 +* __2.include、eval:__ 以include为例,如果include的文件中定义了全局变量,那么这些变量实际与上面1的情况一样,它们的存储位置是在一起的 -所以实际上面说的这两种情况属于一类,它们并不是局部变量的清理,而是__全局变量的清理__,另外局部变量的清理也并非只有return一个时机,另外还有一个更重要的时机就是变量分离时,这种情况我们在《PHP语法实现》一节再具体说明。 +所以实际上面说的这两种情况属于一类,它们并不是局部变量的清理,而是 __全局变量的清理__ ,另外局部变量的清理也并非只有return一个时机,另外还有一个更重要的时机就是变量分离时,这种情况我们在《PHP语法实现》一节再具体说明。 From 892b7cbb7cb648b927fa377f02c5bc91fd2d6dde Mon Sep 17 00:00:00 2001 From: qinpeng Date: Wed, 15 Mar 2017 11:16:39 +0800 Subject: [PATCH 050/379] update --- 3/zend_executor.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/3/zend_executor.md b/3/zend_executor.md index 949e800..ef8bb0f 100644 --- a/3/zend_executor.md +++ b/3/zend_executor.md @@ -268,11 +268,11 @@ static zend_always_inline void zend_vm_stack_free_call_frame(zend_execute_data * (这里的函数指用户自定义的PHP函数,不含内部函数) 上一节我们介绍了zend执行引擎的几个关键步骤,也简单的介绍了函数的调用过程,这里再单独总结下: -* __【初始化阶段】:__这个阶段首先查找到函数的zend_function,普通function就是到EG(function_table)中查找,成员方法则先从EG(class_table)中找到zend_class_entry,然后再进一步在其function_table找到zend_function,接着就是根据zend_op_array新分配__zend_execute_data__结构并设置上下文切换的指针 -* __【参数传递阶段】:__如果函数没有参数则跳过此步骤,有的话则会将函数所需参数传递到__初始化阶段__新分配的__zend_execute_data动态变量区__ -* __【函数调用阶段】:__这个步骤主要是做上下文切换,将执行器切换到调用的函数上,可以理解会在这个阶段__递归调用zend_execute_ex__函数实现call的过程(实际并一定是递归,默认是在while(1){...}中切换执行空间的,但如果我们在扩展中重定义了zend_execute_ex用来介入执行流程则就是递归调用) -* __【函数执行阶段】:__被调用函数内部的执行过程,首先是接收参数,然后开始执行opcode -* __【函数返回阶段】:__被调用函数执行完毕返回过程,将返回值传递给调用方的zend_execute_data变量区,然后释放zend_execute_data以及分配的局部变量,将上下文切换到调用前,回到调用的位置继续执行,这个实际是函数执行中的一部分,不算是独立的一个过程 +* __【初始化阶段】__这个阶段首先查找到函数的zend_function,普通function就是到EG(function_table)中查找,成员方法则先从EG(class_table)中找到zend_class_entry,然后再进一步在其function_table找到zend_function,接着就是根据zend_op_array新分配__zend_execute_data__结构并设置上下文切换的指针 +* __【参数传递阶段】__如果函数没有参数则跳过此步骤,有的话则会将函数所需参数传递到__初始化阶段__新分配的__zend_execute_data动态变量区__ +* __【函数调用阶段】__这个步骤主要是做上下文切换,将执行器切换到调用的函数上,可以理解会在这个阶段__递归调用zend_execute_ex__函数实现call的过程(实际并一定是递归,默认是在while(1){...}中切换执行空间的,但如果我们在扩展中重定义了zend_execute_ex用来介入执行流程则就是递归调用) +* __【函数执行阶段】__被调用函数内部的执行过程,首先是接收参数,然后开始执行opcode +* __【函数返回阶段】__被调用函数执行完毕返回过程,将返回值传递给调用方的zend_execute_data变量区,然后释放zend_execute_data以及分配的局部变量,将上下文切换到调用前,回到调用的位置继续执行,这个实际是函数执行中的一部分,不算是独立的一个过程 接下来我们一个具体的例子详细分析下各个阶段的处理过程: ```php From 785847fa1419c7b3ab5415f215405077f708db9b Mon Sep 17 00:00:00 2001 From: qinpeng Date: Wed, 15 Mar 2017 11:21:44 +0800 Subject: [PATCH 051/379] update --- 3/function_implement.md | 17 +++++++++-------- 3/zend_executor.md | 18 +++++++++--------- 2 files changed, 18 insertions(+), 17 deletions(-) diff --git a/3/function_implement.md b/3/function_implement.md index a66929c..d8e0e19 100644 --- a/3/function_implement.md +++ b/3/function_implement.md @@ -18,7 +18,7 @@ echo $a; /* } */ ``` - +#### 3.2.1.1 函数的存储结构 下面具体看下PHP中函数的结构: ```c @@ -33,14 +33,14 @@ union _zend_function { zend_uchar arg_flags[3]; /* bitset of arg_info.pass_by_reference */ uint32_t fn_flags; zend_string *function_name; - zend_class_entry *scope; + zend_class_entry *scope; //成员方法所属类,面向对象实现中用到 union _zend_function *prototype; - uint32_t num_args; - uint32_t required_num_args; - zend_arg_info *arg_info; + uint32_t num_args; //参数数量 + uint32_t required_num_args; //必传参数数量 + zend_arg_info *arg_info; //参数信息 } common; - zend_op_array op_array; + zend_op_array op_array; //函数实际编译为普通的zend_op_array zend_internal_function internal_function; }; ``` @@ -60,6 +60,7 @@ union _zend_function { PHP在编译阶段将用户自定义的函数编译为独立的opcodes,保存在`EG(function_table)`中,调用时重新分配新的zend_execute_data(相当于运行栈),然后执行函数的opcodes,调用完再还原到旧的`zend_execute_data`,继续执行,关于zend引擎execute阶段后面会详细分析。 +#### 3.2.1.2 函数参数 ### 3.2.2 内部函数 上一节已经提过,内部函数指的是由内核、扩展提供的C语言编写的function,这类函数不需要经历opcode的编译过程,所以效率上要高于PHP用户自定义的函数,调用时与普通的C程序没有差异。 @@ -95,7 +96,7 @@ typedef struct _zend_internal_function { #### 3.2.2.2 定义与注册 内部函数与用户自定义函数冲突,用户无法在PHP代码中覆盖内部函数,执行PHP脚本时会提示error错误。 -内部函数的定义非常简单,我们只需要创建一个普通的C函数,然后创建一个`zend_internal_function`结构添加到__EG(function_table)__(也可能是CG(function_table),取决于在哪一阶段注册)中即可使用,内部函数__通常__情况下是在php_module_startup阶段注册的,这里之所以说通常是按照标准的扩展定义,除了扩展提供的方式我们可以在任何阶段自由定义内部函数,当然并不建议这样做。下面我们先不讨论扩展标准的定义方式,我们先自己尝试下如何注册一个内部函数。 +内部函数的定义非常简单,我们只需要创建一个普通的C函数,然后创建一个`zend_internal_function`结构添加到 __EG(function_table)__ (也可能是CG(function_table),取决于在哪一阶段注册)中即可使用,内部函数 __通常__ 情况下是在php_module_startup阶段注册的,这里之所以说通常是按照标准的扩展定义,除了扩展提供的方式我们可以在任何阶段自由定义内部函数,当然并不建议这样做。下面我们先不讨论扩展标准的定义方式,我们先自己尝试下如何注册一个内部函数。 根据`zend_internal_function`的结构我们知道需要定义一个handler: ```c @@ -131,7 +132,7 @@ qp_test(); 结果输出: `call internal function 'qp_test'` -这样一个内部函数就定义完成了。这里有一个地方需要注意的我们把这个函数注册到__CG(function_table)__中去了,而不是__EG(function_table)__,这是因为在`php_request_startup`阶段会把__CG(function_table)__赋值给__EG(function_table)__。 +这样一个内部函数就定义完成了。这里有一个地方需要注意的我们把这个函数注册到 __CG(function_table)__ 中去了,而不是 __EG(function_table)__ ,这是因为在`php_request_startup`阶段会把 __CG(function_table)__ 赋值给 __EG(function_table)__ 。 上面的过程看着比较简单,但是在实际应用中不要这样做,PHP提供给我们一套标准的定义方式,接下来看下如何在扩展中按照官方方式提供一个内部函数。 diff --git a/3/zend_executor.md b/3/zend_executor.md index ef8bb0f..f24a192 100644 --- a/3/zend_executor.md +++ b/3/zend_executor.md @@ -268,11 +268,11 @@ static zend_always_inline void zend_vm_stack_free_call_frame(zend_execute_data * (这里的函数指用户自定义的PHP函数,不含内部函数) 上一节我们介绍了zend执行引擎的几个关键步骤,也简单的介绍了函数的调用过程,这里再单独总结下: -* __【初始化阶段】__这个阶段首先查找到函数的zend_function,普通function就是到EG(function_table)中查找,成员方法则先从EG(class_table)中找到zend_class_entry,然后再进一步在其function_table找到zend_function,接着就是根据zend_op_array新分配__zend_execute_data__结构并设置上下文切换的指针 -* __【参数传递阶段】__如果函数没有参数则跳过此步骤,有的话则会将函数所需参数传递到__初始化阶段__新分配的__zend_execute_data动态变量区__ -* __【函数调用阶段】__这个步骤主要是做上下文切换,将执行器切换到调用的函数上,可以理解会在这个阶段__递归调用zend_execute_ex__函数实现call的过程(实际并一定是递归,默认是在while(1){...}中切换执行空间的,但如果我们在扩展中重定义了zend_execute_ex用来介入执行流程则就是递归调用) -* __【函数执行阶段】__被调用函数内部的执行过程,首先是接收参数,然后开始执行opcode -* __【函数返回阶段】__被调用函数执行完毕返回过程,将返回值传递给调用方的zend_execute_data变量区,然后释放zend_execute_data以及分配的局部变量,将上下文切换到调用前,回到调用的位置继续执行,这个实际是函数执行中的一部分,不算是独立的一个过程 +* __【初始化阶段】__ 这个阶段首先查找到函数的zend_function,普通function就是到EG(function_table)中查找,成员方法则先从EG(class_table)中找到zend_class_entry,然后再进一步在其function_table找到zend_function,接着就是根据zend_op_array新分配 __zend_execute_data__ 结构并设置上下文切换的指针 +* __【参数传递阶段】__ 如果函数没有参数则跳过此步骤,有的话则会将函数所需参数传递到 __初始化阶段__ 新分配的 __zend_execute_data动态变量区__ +* __【函数调用阶段】__ 这个步骤主要是做上下文切换,将执行器切换到调用的函数上,可以理解会在这个阶段__递归调用zend_execute_ex__函数实现call的过程(实际并一定是递归,默认是在while(1){...}中切换执行空间的,但如果我们在扩展中重定义了zend_execute_ex用来介入执行流程则就是递归调用) +* __【函数执行阶段】__ 被调用函数内部的执行过程,首先是接收参数,然后开始执行opcode +* __【函数返回阶段】__ 被调用函数执行完毕返回过程,将返回值传递给调用方的zend_execute_data变量区,然后释放zend_execute_data以及分配的局部变量,将上下文切换到调用前,回到调用的位置继续执行,这个实际是函数执行中的一部分,不算是独立的一个过程 接下来我们一个具体的例子详细分析下各个阶段的处理过程: ```php @@ -329,9 +329,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_FCALL_SPEC_CONST_HANDLER( ![zend_exe_init](../img/func_exe_init.png) -注意__This__这个值,它并不仅仅指的是面向对象中那个this,此外它还记录着其它两个信息: -* __call_info:__调用信息,通过__This.u1.reserved__记录,因为我们的主脚本、用户自定义函数调用、内核函数调用、include/require/eval等都会生成一个zend_execute_data,这个值就是用来区分这些不同类型的,对应的具体值为:ZEND_CALL_TOP_CODE、ZEND_CALL_NESTED_FUNCTION、ZEND_CALL_TOP_FUNCTION、ZEND_CALL_NESTED_CODE,这个信息是在分配zend_execute_data时显式声明的 -* __num_args:__函数调用实际传入的参数数量,通过__This.u2.num_args__记录,比如示例中我们定义的函数有3个参数,其中1个是必传的,而我们调用时传入了2个,所以这个例子中的num_args就是2,这个值在编译时知道的,保存在__zend_op->extended_value__中 +注意 __This__ 这个值,它并不仅仅指的是面向对象中那个this,此外它还记录着其它两个信息: +* __call_info:__ 调用信息,通过 __This.u1.reserved__ 记录,因为我们的主脚本、用户自定义函数调用、内核函数调用、include/require/eval等都会生成一个zend_execute_data,这个值就是用来区分这些不同类型的,对应的具体值为:ZEND_CALL_TOP_CODE、ZEND_CALL_NESTED_FUNCTION、ZEND_CALL_TOP_FUNCTION、ZEND_CALL_NESTED_CODE,这个信息是在分配zend_execute_data时显式声明的 +* __num_args:__ 函数调用实际传入的参数数量,通过 __This.u2.num_args__ 记录,比如示例中我们定义的函数有3个参数,其中1个是必传的,而我们调用时传入了2个,所以这个例子中的num_args就是2,这个值在编译时知道的,保存在 __zend_op->extended_value__ 中 #### 3.3.3.2 参数传递阶段 这个过程就是将当前作用空间下的变量值"复制"到新的zend_execute_data动态变量区中,那么调用方怎么知道要把值传递到新zend_execute_data哪个位置呢?实际这个地方是有固定规则的,zend_execute_data的动态变量区最前面是参数变量,按照参数的顺序依次分配,接着才是普通的局部变量、临时变量等,所以调用方就可以根据传的是第几个参数来确定其具体的存储位置。 @@ -340,7 +340,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_FCALL_SPEC_CONST_HANDLER( ![func_exe_send_var](../img/func_exe_send_var.png) -图中画的只是上面示例那种情况,比如`my_function(array());`直接传值则会是__literals区->新zend_execute_data动态变量区__的传递。 +图中画的只是上面示例那种情况,比如`my_function(array());`直接传值则会是 __literals区->新zend_execute_data动态变量区__ 的传递。 #### 3.3.3.3 函数调用阶段 这个过程主要是进行一些上下文切换,将执行器切换到调用的函数上。 From 61fcf269196165c650bc79ab3d631c643af242ea Mon Sep 17 00:00:00 2001 From: qinpeng Date: Wed, 15 Mar 2017 11:32:18 +0800 Subject: [PATCH 052/379] update --- 5/zend_alloc.md | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/5/zend_alloc.md b/5/zend_alloc.md index b7d6720..5627921 100644 --- a/5/zend_alloc.md +++ b/5/zend_alloc.md @@ -78,7 +78,7 @@ static void alloc_globals_ctor(zend_alloc_globals *alloc_globals) alloc_globals->mm_heap = zend_mm_init(); } ``` -__alloc_globals__是一个全局变量,即__AG宏__,它只有一个成员:mm_heap,保存着整个内存池的信息,所有内存的分配都是基于这个值,多线程模式下(ZTS)会有多个heap,也就是说每个线程都有一个独立的内存池,看下它的初始化: +__alloc_globals__ 是一个全局变量,即 __AG宏__ ,它只有一个成员:mm_heap,保存着整个内存池的信息,所有内存的分配都是基于这个值,多线程模式下(ZTS)会有多个heap,也就是说每个线程都有一个独立的内存池,看下它的初始化: ```c static zend_mm_heap *zend_mm_init(void) { @@ -154,7 +154,7 @@ static void *zend_mm_alloc_huge(zend_mm_heap *heap, size_t size ZEND_FILE_LINE_D huge的分配过程还是比较简单的。 #### 5.1.3.2 Large分配 -大于3/4的page_size(4KB)且小于等于511个page_size的内存申请,也就是一个chunk的大小够用(之所以是511个page而不是512个是因为第一个page始终被chunk结构占用),__如果申请多个page的话 分配的时候这些page都是连续的__。 +大于3/4的page_size(4KB)且小于等于511个page_size的内存申请,也就是一个chunk的大小够用(之所以是511个page而不是512个是因为第一个page始终被chunk结构占用),__如果申请多个page的话 分配的时候这些page都是连续的__ 。 ```c static zend_always_inline void *zend_mm_alloc_large(zend_mm_heap *heap, size_t size ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC) @@ -170,9 +170,9 @@ static zend_always_inline void *zend_mm_alloc_large(zend_mm_heap *heap, size_t s return ptr; } ``` -进一步看下`zend_mm_alloc_pages`,这个过程比较复杂,简单描述的话就是从第一个chunk开始查找当前chunk下是否有pages_count个连续可用的page,有的话就停止查找,没有的话则接着查找下一个chunk,如果直到最后一个chunk也没找到则重新分配一个新的chunk并插入chunk链表,这个过程中最不好理解的一点在于如何查找pages_count个连续可用的page,这个主要根据__chunk->free_map__实现的,在看具体执行过程之前我们先解释下__free_map__的作用: +进一步看下`zend_mm_alloc_pages`,这个过程比较复杂,简单描述的话就是从第一个chunk开始查找当前chunk下是否有pages_count个连续可用的page,有的话就停止查找,没有的话则接着查找下一个chunk,如果直到最后一个chunk也没找到则重新分配一个新的chunk并插入chunk链表,这个过程中最不好理解的一点在于如何查找pages_count个连续可用的page,这个主要根据 __chunk->free_map__ 实现的,在看具体执行过程之前我们先解释下 __free_map__ 的作用: -__我们已经知道每个chunk由512个page组成,而不管是large分配还是small分配,其分配的最小粒子都是page(small也是先分配1个或多个page然后再进行的切割),所以需要有一个数组来记录每个page是否已经分配,free_map的作用就是标识当前chunk下各page的分配与否,比较特别的是free_map并不是512大小的数组,因为需要记录的信息非常简单,只需要一个bit位就够了,所以free_map就用`长整形`的各bit位来记录的(实际就是bitmap),不同位数的机器长整形大小不同,因此在32、64位下16或8个长整形就够512bit了(每个byte等于8bit,长整形为4byte或8byte),当然这么做并仅仅是节省空间,更重要的作用是可以提高查询效率__。 +__我们已经知道每个chunk由512个page组成,而不管是large分配还是small分配,其分配的最小粒子都是page(small也是先分配1个或多个page然后再进行的切割),所以需要有一个数组来记录每个page是否已经分配,free_map的作用就是标识当前chunk下各page的分配与否,比较特别的是free_map并不是512大小的数组,因为需要记录的信息非常简单,只需要一个bit位就够了,所以free_map就用`长整形`的各bit位来记录的(实际就是bitmap),不同位数的机器长整形大小不同,因此在32、64位下16或8个长整形就够512bit了(每个byte等于8bit,长整形为4byte或8byte),当然这么做并仅仅是节省空间,更重要的作用是可以提高查询效率__ 。 ```c typedef zend_ulong zend_mm_bitset; /* 4-byte or 8-byte integer */ @@ -234,16 +234,16 @@ found: //找到可用page,page编号为page_num至(page_num + pages_count) ``` 查找过程就是从第一个chunk开始搜索,如果当前chunk没有合适的则进入下一chunk,如果直到最后都没有找到则新创建一个chunk。 -注意:查找page的过程并不仅仅是够数即可,这里有一个标准是:__申请的一个或多个的page要尽可能的填满chunk的空隙__,也就是说如果当前chunk有多块内存满足需求则会选择最合适的那块,而合适的标准前面提到的那个。 +注意:查找page的过程并不仅仅是够数即可,这里有一个标准是:__申请的一个或多个的page要尽可能的填满chunk的空隙__ ,也就是说如果当前chunk有多块内存满足需求则会选择最合适的那块,而合适的标准前面提到的那个。 -__最优page的检索过程__: +__最优page的检索过程__ : -* __step1:__首先从第一个page分组(page 0-63)开始检查,如果当前分组无可用page(即free_map[x] = -1)则进入下一分组,直到当前分组有空闲page,然后进入step2 -* __step2:__当前分组有可用page,首先找到第一个可用page的位置,记作page_num,接着__从page_num开始__向下找第一个已分配page的位置,记作end_page_num,这个地方需要注意,__如果当前分组剩下的page都是可用的则会进入下一分组接着搜索__,直到找到为止,这里还会借助chunk->free_tail避免无谓的查找到最后分组 -* __step3:__根据上一步找到的page_num、end_page_num可计算得到当前可用内存块大小为len个page,然后与申请的page页数(page_count)比较 - * __step3.1:__如果len=page_count则表示找到的内存块符合申请条件且非常完美,直接从page_num开始分配page_count个page - * __step3.2:__如果len>page_count则表示找到的内存块符合条件且空间很充裕,暂且记录下len、page_num,然后继续向下搜索,如果有更合适的则用更合适的替代 - * __step3.3:__如果lenfree_tail避免无谓的查找到最后分组 +* __step3:__ 根据上一步找到的page_num、end_page_num可计算得到当前可用内存块大小为len个page,然后与申请的page页数(page_count)比较 + * __step3.1:__ 如果len=page_count则表示找到的内存块符合申请条件且非常完美,直接从page_num开始分配page_count个page + * __step3.2:__ 如果len>page_count则表示找到的内存块符合条件且空间很充裕,暂且记录下len、page_num,然后继续向下搜索,如果有更合适的则用更合适的替代 + * __step3.3:__ 如果lenfree_slot中找到对应的slot规格bin_num,如果当前slot为空则首先分配对应的page,然后将这些page内存按slot大小切割为zend_mm_free_slot单向链表,free_slot[bin_num]始终指向第一个可用的slot -* __step2:__如果申请内存大小对应的的slot链表不为空则直接返回free_slot[bin_num],然后将free_slot[bin_num]指向下一个空闲位置free_slot[bin_num]->next_free_slot -* __step3:__释放内存时先将此内存的next_free_slot指向free_slot[bin_num],然后将free_slot[bin_num]指向释放的内存,也就是将释放的内存插到链表头部 +* __step1:__ 首先根据申请内存的大小在heap->free_slot中找到对应的slot规格bin_num,如果当前slot为空则首先分配对应的page,然后将这些page内存按slot大小切割为zend_mm_free_slot单向链表,free_slot[bin_num]始终指向第一个可用的slot +* __step2:__ 如果申请内存大小对应的的slot链表不为空则直接返回free_slot[bin_num],然后将free_slot[bin_num]指向下一个空闲位置free_slot[bin_num]->next_free_slot +* __step3:__ 释放内存时先将此内存的next_free_slot指向free_slot[bin_num],然后将free_slot[bin_num]指向释放的内存,也就是将释放的内存插到链表头部 ![free_slot](../img/free_slot.png) From dcb8719e2586258d9d54136a6bc35f7a16092045 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Wed, 15 Mar 2017 11:32:30 +0800 Subject: [PATCH 053/379] update --- 2/zval.md | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/2/zval.md b/2/zval.md index 0dc27eb..a257edb 100644 --- a/2/zval.md +++ b/2/zval.md @@ -51,8 +51,8 @@ struct _zval_struct { }; ``` `zval`结构比较简单,内嵌一个union类型的`zend_value`保存具体变量类型的值或指针,`zval`中还有两个union:`u1`、`u2`: -* __u1:__它的意义比较直观,变量的类型就通过`u1.type`区分,另外一个值`type_flags`为类型掩码,在变量的内存管理、gc机制中会用到,第三部分会详细分析,至于后面两个`const_flags`、`reserved`暂且不管 -* __u2:__这个值纯粹是个辅助值,假如`zval`只有:`value`、`u1`两个值,整个zval的大小也会对齐到16byte,既然不管有没有u2大小都是16byte,把多余的4byte拿出来用于一些特殊用途还是很划算的,比如next在哈希表解决哈希冲突时会用到,还有fe_pos在foreach会用到...... +* __u1:__ 它的意义比较直观,变量的类型就通过`u1.type`区分,另外一个值`type_flags`为类型掩码,在变量的内存管理、gc机制中会用到,第三部分会详细分析,至于后面两个`const_flags`、`reserved`暂且不管 +* __u2:__ 这个值纯粹是个辅助值,假如`zval`只有:`value`、`u1`两个值,整个zval的大小也会对齐到16byte,既然不管有没有u2大小都是16byte,把多余的4byte拿出来用于一些特殊用途还是很划算的,比如next在哈希表解决哈希冲突时会用到,还有fe_pos在foreach会用到...... 从`zend_value`可以看出,除`long`、`double`类型直接存储值外,其它类型都为指针,指向各自的结构。 @@ -98,10 +98,10 @@ struct _zend_string { char val[1]; }; ``` -* __gc:__变量引用信息,比如当前value的引用数,所有用到引用计数的变量类型都会有这个结构,3.1节会详细分析 +* __gc:__ 变量引用信息,比如当前value的引用数,所有用到引用计数的变量类型都会有这个结构,3.1节会详细分析 * __h:__哈希值,数组中计算索引时会用到 -* __len:__字符串长度,通过这个值保证二进制安全 -* __val:__字符串内容,变长struct,分配时按len长度申请内存 +* __len:__ 字符串长度,通过这个值保证二进制安全 +* __val:__ 字符串内容,变长struct,分配时按len长度申请内存 事实上字符串又可具体分为几类:IS_STR_PERSISTENT(通过malloc分配的)、IS_STR_INTERNED(php代码里写的一些字面量,比如函数名、变量值)、IS_STR_PERMANENT(永久值,生命周期大于request)、IS_STR_CONSTANT(常量)、IS_STR_CONSTANT_UNQUALIFIED,这个信息通过flag保存:zval.value->gc.u.flags,后面用到的时候再具体分析。 @@ -183,14 +183,14 @@ $a = "time:" . time(); //$a -> zend_string_1(refcount=1) $b = &$a; //$a,$b -> zend_reference_1(refcount=2) -> zend_string_1(refcount=1) $c = &$b;/*或$c = &$a*/ //$a,$b,$c -> zend_reference_1(refcount=3) -> zend_string_1(refcount=1) ``` -这个也表示PHP中的__引用只可能有一层__,__不会出现一个引用指向另外一个引用的情况__,也就是没有C语言中`指针的指针`的概念。 +这个也表示PHP中的 __引用只可能有一层__ ,__不会出现一个引用指向另外一个引用的情况__ ,也就是没有C语言中`指针的指针`的概念。 ### 2.1.3 内存管理 接下来分析下变量的分配、销毁。 在分析变量内存管理之前我们先自己想一下可能的实现方案,最简单的处理方式:定义变量时alloc一个zval及对应的value结构(ref/arr/str/res...),赋值、函数传参时硬拷贝一个副本,这样各变量最终的值完全都是独立的,不会出现多个变量同时共用一个value的情况,在执行完以后直接将各变量及value结构free掉。 -这种方式是可行的,而且内存管理也很简单,但是,硬拷贝带来的一个问题是效率低,比如我们定义了一个变量然后赋值给另外一个变量,可能后面都只是只读操作,假如硬拷贝的话就会有多余的一份数据,这个问题的解决方案是:__引用计数+写时复制__。PHP变量的管理正是基于这两点实现的。 +这种方式是可行的,而且内存管理也很简单,但是,硬拷贝带来的一个问题是效率低,比如我们定义了一个变量然后赋值给另外一个变量,可能后面都只是只读操作,假如硬拷贝的话就会有多余的一份数据,这个问题的解决方案是: __引用计数+写时复制__ 。PHP变量的管理正是基于这两点实现的。 #### 2.1.3.1 引用计数 引用计数是指在value中增加一个字段`refcount`记录指向当前value的数量,变量复制、函数传参时并不直接硬拷贝一份value数据,而是将`refcount++`,变量销毁时将`refcount--`,等到`refcount`减为0时表示已经没有变量引用这个value,将它销毁即可。 @@ -232,7 +232,7 @@ $a,$b -> zend_string_1(refcount=0,val="hi~") 事实上并不是所有的PHP变量都会用到引用计数,标量:true/false/double/long/null是硬拷贝自然不需要这种机制,但是除了这几个还有两个特殊的类型也不会用到:interned string(内部字符串,就是上面提到的字符串flag:IS_STR_INTERNED)、immutable array,它们的type是`IS_STRING`、`IS_ARRAY`,与普通string、array类型相同,那怎么区分一个value是否支持引用计数呢?还记得`zval.u1`中那个类型掩码`type_flag`吗?正是通过这个字段标识的,这个字段除了标识value是否支持引用计数外还有其它几个标识位,按位分割,注意:`type_flag`与`zval.value->gc.u.flag`不是一个值。 -支持引用计数的value类型其`zval.u1.type_flag`__包含__(注意是&,不是等于)`IS_TYPE_REFCOUNTED`: +支持引用计数的value类型其`zval.u1.type_flag` __包含__ (注意是&,不是等于)`IS_TYPE_REFCOUNTED`: ```c #define IS_TYPE_REFCOUNTED (1<<2) ``` @@ -250,9 +250,9 @@ $a,$b -> zend_string_1(refcount=0,val="hi~") |reference | Y | ``` simple types很显然用不到,不再解释,string、array、object、resource、reference有引用计数机制也很容易理解,下面具体解释下另外两个特殊的类型: -* __interned string:__内部字符串,这是种什么类型?我们在PHP中写的所有字符都可以认为是这种类型,比如function name、class name、variable name、静态字符串等等,我们这样定义:`$a = "hi~;"`后面的字符串内容是唯一不变的,这些字符串等同于C语言中定义在静态变量区的字符串:`char *a = "hi~";`,这些字符串的生命周期为request期间,request完成后会统一销毁释放,自然也就无需在运行期间通过引用计数管理内存。 +* __interned string:__ 内部字符串,这是种什么类型?我们在PHP中写的所有字符都可以认为是这种类型,比如function name、class name、variable name、静态字符串等等,我们这样定义:`$a = "hi~;"`后面的字符串内容是唯一不变的,这些字符串等同于C语言中定义在静态变量区的字符串:`char *a = "hi~";`,这些字符串的生命周期为request期间,request完成后会统一销毁释放,自然也就无需在运行期间通过引用计数管理内存。 -* __immutable array:__只有在用opcache的时候才会用到这种类型,不清楚具体实现,暂时忽略。 +* __immutable array:__ 只有在用opcache的时候才会用到这种类型,不清楚具体实现,暂时忽略。 #### 2.1.3.2 写时复制 上一小节介绍了引用计数,多个变量可能指向同一个value,然后通过refcount统计引用数,这时候如果其中一个变量试图更改value的内容则会重新拷贝一份value修改,同时断开旧的指向,写时复制的机制在计算机系统中有非常广的应用,它只有在必要的时候(写)才会发生硬拷贝,可以很好的提高效率,下面从示例看下: @@ -285,14 +285,14 @@ $b[] = 3; |resource | | |reference | | ``` -__copyable__的意思是当value发生duplication时是否需要copy,这个具体有两种情形下会发生: -* a.从__literal变量区__复制到__局部变量区__,比如:`$a = [];`实际会有两个数组,而`$a = "hi~";//interned string`则只有一个string +__copyable__ 的意思是当value发生duplication时是否需要copy,这个具体有两种情形下会发生: +* a.从 __literal变量区__ 复制到 __局部变量区__ ,比如:`$a = [];`实际会有两个数组,而`$a = "hi~";//interned string`则只有一个string * b.局部变量区分离时(写时复制):如改变变量内容时引用计数大于1则需要分离,`$a = [];$b = $a; $b[] = 1;`这里会分离,类型是array所以可以复制,如果是对象:`$a = new user;$b = $a;$a->name = "dd";`这种情况是不会复制object的,$a、$b指向的对象还是同一个 具体literal、局部变量区变量的初始化、赋值后面编译、执行两篇文章会具体分析,这里知道变量有个`copyable`的属性就行了。 #### 2.1.3.3 变量回收 -PHP变量的回收主要有两种:主动销毁、自动销毁。主动销毁指的就是__unset__,而自动销毁就是PHP的自动管理机制,在return时减掉局部变量的refcount,即使没有显式的return,PHP也会自动给加上这个操作。 +PHP变量的回收主要有两种:主动销毁、自动销毁。主动销毁指的就是 __unset__ ,而自动销毁就是PHP的自动管理机制,在return时减掉局部变量的refcount,即使没有显式的return,PHP也会自动给加上这个操作,另外一个就是写时复制时会断开原来value的指向,这时候也会检查断开后旧value的refcount。 #### 2.1.3.4 垃圾回收 PHP变量的回收是根据refcount实现的,当unset、return时会将变量的引用计数减掉,如果refcount减到0则直接释放value,这是变量的简单gc过程,但是实际过程中出现gc无法回收导致内存泄漏的bug,先看下一个例子: From 9b9dec993f6c68fd246ef5f3ec7fb068f181eac2 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Wed, 15 Mar 2017 11:38:57 +0800 Subject: [PATCH 054/379] update --- 3/zend_class.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/3/zend_class.md b/3/zend_class.md index 3ee0b9c..cb0df1f 100644 --- a/3/zend_class.md +++ b/3/zend_class.md @@ -124,15 +124,15 @@ class User extends Human #### 3.4.1.2 类常量 PHP中可以把在类中始终保持不变的值定义为常量,在定义和使用常量的时候不需要使用 $ 符号,常量的值必须是一个定值(如布尔型、整形、字符串、数组,php5.*不支持数组),不能是变量、数学运算的结果或函数调用,也就是说它是只读的,无法进行赋值。 -常量通过__const__定义: +常量通过 __const__ 定义: ```php class my_class { const 常量名 = 常量值; } ``` -常量通过__class_name::常量名__访问,或在class内部通过__self::常量名__访问。 +常量通过 __class_name::常量名__ 访问,或在class内部通过 __self::常量名__ 访问。 -常量是类维度的数据(而不是对象的),它们通过`zend_class_entry.constants_table`进行存储,这是一个哈希结构,通过__常量名__索引,value就是具体定义的常量值。 +常量是类维度的数据(而不是对象的),它们通过`zend_class_entry.constants_table`进行存储,这是一个哈希结构,通过 __常量名__ 索引,value就是具体定义的常量值。 __常量的读取:__ @@ -160,14 +160,14 @@ echo my_class::A1; 事实上这两种情况内核会有两种不同的处理方式,示例2这种情况的处理与我们上面的猜测相同,而示例1则有另外一种处理方式:PHP代码的编译是顺序的,示例1的情况编译到`echo my_class::A1`这行时首先会尝试检索下是否已经编译了my_class,如果能在CG(class_table)中找到,则进一步从类的`contants_table`查找对应的常量,找到的话则会复制其value替换常量,简单的讲就是类似C语言中的宏,__编译时替换为实际的值了__,而不是在运行时再去检索。 -具体debug下上面两个例子会发现示例2的主要的opcode只有一个ZEND_ECHO,也就是直接输出值了,并没有设计类常量的查找,这就是因为编译的时候已经将__my_class::A1__替换为__hi__了,`echo my_class::A1;`等同于:`echo "hi";`;而示例1首先的操作则是ZEND_FETCH_CONSTANT,查找常量,接着才是ZEND_ECHO。 +具体debug下上面两个例子会发现示例2的主要的opcode只有一个ZEND_ECHO,也就是直接输出值了,并没有设计类常量的查找,这就是因为编译的时候已经将 __my_class::A1__ 替换为 __hi__ 了,`echo my_class::A1;`等同于:`echo "hi";`;而示例1首先的操作则是ZEND_FETCH_CONSTANT,查找常量,接着才是ZEND_ECHO。 #### 3.4.1.3 成员属性 类的变量成员叫做“属性”。属性声明是由关键字 __public__,__protected__ 或者 __private__ 开头,然后跟一个普通的变量声明来组成,关于这三个关键字这里不作讨论,后面分析可见性的章节再作说明。 属性中的变量可以初始化,但是初始化的值必须是常数,这里的常数是指 PHP 脚本在编译阶段时就可以得到其值,而不依赖于运行时的信息才能求值,比如`public $time = time();`这样定义一个属性就会触发语法错误。 -成员属性又分为两类:__普通属性__、__静态属性__。静态属性通过__static__声明,通过__self::$property__或__类名::$property__访问;普通属性通过__$this->property__或__$object->property__访问。 +成员属性又分为两类:__普通属性__、__静态属性__。静态属性通过 __static__ 声明,通过 __self::$property__ 或 __类名::$property__ 访问;普通属性通过 __$this->property__ 或 __$object->property__ 访问。 ```php class my_class { @@ -178,13 +178,13 @@ class my_class { public static $property_2 = 初始化值; } ``` -与常量的存储方式不同,成员属性的__初始化值__并不是__直接__用以"属性名"作为索引的哈希表存储的,而是通过数组保存的,普通属性、静态属性各有一个数组分别存储。 +与常量的存储方式不同,成员属性的 __初始化值__ 并不是 __直接__ 用以"属性名"作为索引的哈希表存储的,而是通过数组保存的,普通属性、静态属性各有一个数组分别存储。 ![zend_class_property](../img/zend_class_property.png) 看到这里可能有个疑问:使用时成员属性是如果找到的呢? -实际只是成员属性的__VALUE__通过数组存储的,访问时仍然是根据以"属性名"为索引的散列表查找具体VALUE的,这个散列表并没有按照普通属性、静态属性分为两个,而是只用了一个:__HashTable properties_info__。此哈希表存储元素的value类型为__zend_property_info__。 +实际只是成员属性的 __VALUE__ 通过数组存储的,访问时仍然是根据以"属性名"为索引的散列表查找具体VALUE的,这个散列表并没有按照普通属性、静态属性分为两个,而是只用了一个:__HashTable properties_info__ 。此哈希表存储元素的value类型为__zend_property_info__ 。 ```c typedef struct _zend_property_info { @@ -217,7 +217,7 @@ class my_class { public static $property_3 = 110; } ``` -则__default_properties_table__、__default_static_properties_table__、__properties_info__关系图: +则 __default_properties_table__、__default_static_properties_table__、__properties_info__ 关系图: ![zend_property_info](../img/zend_property_info.png) @@ -247,7 +247,7 @@ my_class::test(); $method = 'test'; my_class::$method(); ``` -静态方法中调用其它静态方法或静态变量可以通过__self__访问。 +静态方法中调用其它静态方法或静态变量可以通过 __self__ 访问。 成员方法的调用与普通function过程基本相同,根据对象所属类或直接根据类取到method的zend_function,然后执行,具体的过程[《3.3 Zend引擎执行过程》](zend_executor.md)已经详细说过,这里不再重复。 From 13b74464caa2908df37c8d59160e43e847894c46 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Wed, 15 Mar 2017 11:48:09 +0800 Subject: [PATCH 055/379] update --- 3/zend_compile_opcode.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/3/zend_compile_opcode.md b/3/zend_compile_opcode.md index dcb7a82..9cebb6f 100644 --- a/3/zend_compile_opcode.md +++ b/3/zend_compile_opcode.md @@ -458,11 +458,11 @@ void zend_compile_assign(znode *result, zend_ast *ast) ``` 这个地方主要有三步关键操作: -__第1步:__ 变量赋值操作有两部分:变量名、变量值,所以首先是针对变量名的操作,介绍zend_op_array时曾提到每个PHP变量都有一个编号,变量的读写都是根据这个编号操作的,这个编号最早就是这一步生成的。 +> __第1步:__ 变量赋值操作有两部分:变量名、变量值,所以首先是针对变量名的操作,介绍zend_op_array时曾提到每个PHP变量都有一个编号,变量的读写都是根据这个编号操作的,这个编号最早就是这一步生成的。 -![](../img/zend_lookup_cv.png) +> ![](../img/zend_lookup_cv.png) -中间过程我们不再细看,这里重点看下变量编号的过程,这个过程比较简单,每发现一个变量就遍历zend_op_array.vars数组,看此变量是否已经保存,没有保存的话则存入vars,然后后续变量的使用都是用的这个变量在数组中的下标,比如第一次定义的时候:`$a = 123;`将$a编号为0,然后:`echo $a;`再次使用时会遍历vars,发现已经存在,直接用其下标操作$a。 +> 中间过程我们不再细看,这里重点看下变量编号的过程,这个过程比较简单,每发现一个变量就遍历zend_op_array.vars数组,看此变量是否已经保存,没有保存的话则存入vars,然后后续变量的使用都是用的这个变量在数组中的下标,比如第一次定义的时候:`$a = 123;`将$a编号为0,然后:`echo $a;`再次使用时会遍历vars,发现已经存在,直接用其下标操作$a。 ```c static int lookup_cv(zend_op_array *op_array, zend_string* name) { @@ -492,7 +492,7 @@ static int lookup_cv(zend_op_array *op_array, zend_string* name) return (int)(zend_intptr_t)ZEND_CALL_VAR_NUM(NULL, i); //传NULL时返回的就是i } ``` -__第2步:__ 编译变量值表达式,再次调用zend_compile_expr()编译,示例中的情况比较简单,expr_ast.kind为ZEND_AST_ZVAL: +> __第2步:__ 编译变量值表达式,再次调用zend_compile_expr()编译,示例中的情况比较简单,expr_ast.kind为ZEND_AST_ZVAL: ```c void zend_compile_expr(znode *result, zend_ast *ast) { @@ -505,7 +505,7 @@ void zend_compile_expr(znode *result, zend_ast *ast) } } ``` -__第3步:__ 上面两步已经分别生成了变量赋值的op1、op2,下面就是根据这俩值生成opcode的过程。 +> __第3步:__ 上面两步已经分别生成了变量赋值的op1、op2,下面就是根据这俩值生成opcode的过程。 ```c tatic zend_op *zend_emit_op(znode *result, zend_uchar opcode, znode *op1, znode *op2) { @@ -542,4 +542,4 @@ static inline void zend_make_var_result(znode *result, zend_op *opline) ``` 到这我们示例中的第1条赋值语句就算编译完了,第2条同样是赋值,过程与上面相同,我们直接看最好一条输出的语句。 -__(3)、__ echo语句的编译。 +__(3)、__ echo语句的编译 From abb78fe517c6c84d853ccef64762495c879125dc Mon Sep 17 00:00:00 2001 From: qinpeng Date: Wed, 15 Mar 2017 11:56:48 +0800 Subject: [PATCH 056/379] update --- 3/zend_compile_opcode.md | 28 +++++++++++++++------------- img/zend_ast_echo.png | Bin 0 -> 26976 bytes 2 files changed, 15 insertions(+), 13 deletions(-) create mode 100644 img/zend_ast_echo.png diff --git a/3/zend_compile_opcode.md b/3/zend_compile_opcode.md index 9cebb6f..1cfa597 100644 --- a/3/zend_compile_opcode.md +++ b/3/zend_compile_opcode.md @@ -403,10 +403,10 @@ zendparse()阶段生成的AST: 下面的过程比较复杂,有的函数会多次递归调用,我们根据例子一步步去看下,如果你对PHP各个语法实现比较熟悉再去看整个AST的编译过程就会比较轻松。 -__(1)、__ 首先从根节点开始,有3个child,第一个节点类型为ZEND_AST_ASSIGN,zend_compile_stmt()中走到default分支 +> __(1)、__ 首先从根节点开始,有3个child,第一个节点类型为ZEND_AST_ASSIGN,zend_compile_stmt()中走到default分支 -__(2)、__ ZEND_AST_ASSIGN类型由zend_compile_expr()处理: -```c +> __(2)、__ ZEND_AST_ASSIGN类型由zend_compile_expr()处理: +> ```c void zend_compile_expr(znode *result, zend_ast *ast) { CG(zend_lineno) = zend_ast_get_lineno(ast); @@ -425,8 +425,8 @@ void zend_compile_expr(znode *result, zend_ast *ast) } } ``` -继续进入zend_compile_assign(): -```c +> 继续进入zend_compile_assign(): +> ```c void zend_compile_assign(znode *result, zend_ast *ast) { zend_ast *var_ast = ast->child[0]; //变量名 @@ -456,13 +456,13 @@ void zend_compile_assign(znode *result, zend_ast *ast) } } ``` -这个地方主要有三步关键操作: +> 这个地方主要有三步关键操作: -> __第1步:__ 变量赋值操作有两部分:变量名、变量值,所以首先是针对变量名的操作,介绍zend_op_array时曾提到每个PHP变量都有一个编号,变量的读写都是根据这个编号操作的,这个编号最早就是这一步生成的。 +>> __第1步:__ 变量赋值操作有两部分:变量名、变量值,所以首先是针对变量名的操作,介绍zend_op_array时曾提到每个PHP变量都有一个编号,变量的读写都是根据这个编号操作的,这个编号最早就是这一步生成的。 -> ![](../img/zend_lookup_cv.png) +>> ![](../img/zend_lookup_cv.png) -> 中间过程我们不再细看,这里重点看下变量编号的过程,这个过程比较简单,每发现一个变量就遍历zend_op_array.vars数组,看此变量是否已经保存,没有保存的话则存入vars,然后后续变量的使用都是用的这个变量在数组中的下标,比如第一次定义的时候:`$a = 123;`将$a编号为0,然后:`echo $a;`再次使用时会遍历vars,发现已经存在,直接用其下标操作$a。 +>> 中间过程我们不再细看,这里重点看下变量编号的过程,这个过程比较简单,每发现一个变量就遍历zend_op_array.vars数组,看此变量是否已经保存,没有保存的话则存入vars,然后后续变量的使用都是用的这个变量在数组中的下标,比如第一次定义的时候:`$a = 123;`将$a编号为0,然后:`echo $a;`再次使用时会遍历vars,发现已经存在,直接用其下标操作$a。 ```c static int lookup_cv(zend_op_array *op_array, zend_string* name) { @@ -492,7 +492,7 @@ static int lookup_cv(zend_op_array *op_array, zend_string* name) return (int)(zend_intptr_t)ZEND_CALL_VAR_NUM(NULL, i); //传NULL时返回的就是i } ``` -> __第2步:__ 编译变量值表达式,再次调用zend_compile_expr()编译,示例中的情况比较简单,expr_ast.kind为ZEND_AST_ZVAL: +>> __第2步:__ 编译变量值表达式,再次调用zend_compile_expr()编译,示例中的情况比较简单,expr_ast.kind为ZEND_AST_ZVAL: ```c void zend_compile_expr(znode *result, zend_ast *ast) { @@ -505,7 +505,7 @@ void zend_compile_expr(znode *result, zend_ast *ast) } } ``` -> __第3步:__ 上面两步已经分别生成了变量赋值的op1、op2,下面就是根据这俩值生成opcode的过程。 +>> __第3步:__ 上面两步已经分别生成了变量赋值的op1、op2,下面就是根据这俩值生成opcode的过程。 ```c tatic zend_op *zend_emit_op(znode *result, zend_uchar opcode, znode *op1, znode *op2) { @@ -540,6 +540,8 @@ static inline void zend_make_var_result(znode *result, zend_op *opline) GET_NODE(result, opline->result); } ``` -到这我们示例中的第1条赋值语句就算编译完了,第2条同样是赋值,过程与上面相同,我们直接看最好一条输出的语句。 +>> 到这我们示例中的第1条赋值语句就算编译完了,第2条同样是赋值,过程与上面相同,我们直接看最好一条输出的语句。 + +> __(3)、__ echo语句的编译:`echo $a,$b;` -__(3)、__ echo语句的编译 +> ![](../img/zend_ast_echo.png) diff --git a/img/zend_ast_echo.png b/img/zend_ast_echo.png new file mode 100644 index 0000000000000000000000000000000000000000..a0e65907928f52f3d3b5dac5d2af37e423f52308 GIT binary patch literal 26976 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 Date: Wed, 15 Mar 2017 17:09:08 +0800 Subject: [PATCH 057/379] update --- 3/zend_compile_opcode.md | 46 ++++++++++++++++++++++++++++++++++----- img/zend_ast_echo_p.png | Bin 0 -> 66891 bytes 2 files changed, 40 insertions(+), 6 deletions(-) create mode 100644 img/zend_ast_echo_p.png diff --git a/3/zend_compile_opcode.md b/3/zend_compile_opcode.md index 1cfa597..ced21e6 100644 --- a/3/zend_compile_opcode.md +++ b/3/zend_compile_opcode.md @@ -406,7 +406,8 @@ zendparse()阶段生成的AST: > __(1)、__ 首先从根节点开始,有3个child,第一个节点类型为ZEND_AST_ASSIGN,zend_compile_stmt()中走到default分支 > __(2)、__ ZEND_AST_ASSIGN类型由zend_compile_expr()处理: -> ```c + +```c void zend_compile_expr(znode *result, zend_ast *ast) { CG(zend_lineno) = zend_ast_get_lineno(ast); @@ -426,7 +427,7 @@ void zend_compile_expr(znode *result, zend_ast *ast) } ``` > 继续进入zend_compile_assign(): -> ```c +```c void zend_compile_assign(znode *result, zend_ast *ast) { zend_ast *var_ast = ast->child[0]; //变量名 @@ -460,7 +461,7 @@ void zend_compile_assign(znode *result, zend_ast *ast) >> __第1步:__ 变量赋值操作有两部分:变量名、变量值,所以首先是针对变量名的操作,介绍zend_op_array时曾提到每个PHP变量都有一个编号,变量的读写都是根据这个编号操作的,这个编号最早就是这一步生成的。 ->> ![](../img/zend_lookup_cv.png) +![](../img/zend_lookup_cv.png) >> 中间过程我们不再细看,这里重点看下变量编号的过程,这个过程比较简单,每发现一个变量就遍历zend_op_array.vars数组,看此变量是否已经保存,没有保存的话则存入vars,然后后续变量的使用都是用的这个变量在数组中的下标,比如第一次定义的时候:`$a = 123;`将$a编号为0,然后:`echo $a;`再次使用时会遍历vars,发现已经存在,直接用其下标操作$a。 ```c @@ -489,9 +490,17 @@ static int lookup_cv(zend_op_array *op_array, zend_string* name) } op_array->vars[i] = zend_new_interned_string(name); - return (int)(zend_intptr_t)ZEND_CALL_VAR_NUM(NULL, i); //传NULL时返回的就是i + return (int)(zend_intptr_t)ZEND_CALL_VAR_NUM(NULL, i); //传NULL时返回的是96 + i*sizeof(zval) } ``` +>> __注意:这里变量的编号从0、1、2、3...依次递增的,但是实际使用中并不是直接用的这个下标,而是转化成了内存偏移量offset,这个是`ZEND_CALL_VAR_NUM`宏处理的,所以变量偏移量实际是96、112、128...递增的,这个96是根据zend_execute_data大小设定的(不同的平台下对应的值可能不同),下一篇介绍zend执行流程时会详细介绍这个结构。 +```c +#define ZEND_CALL_FRAME_SLOT \ + ((int)((ZEND_MM_ALIGNED_SIZE(sizeof(zend_execute_data)) + ZEND_MM_ALIGNED_SIZE(sizeof(zval)) - 1) / ZEND_MM_ALIGNED_SIZE(sizeof(zval)))) + +#define ZEND_CALL_VAR_NUM(call, n) \ + (((zval*)(call)) + (ZEND_CALL_FRAME_SLOT + ((int)(n)))) +``` >> __第2步:__ 编译变量值表达式,再次调用zend_compile_expr()编译,示例中的情况比较简单,expr_ast.kind为ZEND_AST_ZVAL: ```c void zend_compile_expr(znode *result, zend_ast *ast) @@ -542,6 +551,31 @@ static inline void zend_make_var_result(znode *result, zend_op *opline) ``` >> 到这我们示例中的第1条赋值语句就算编译完了,第2条同样是赋值,过程与上面相同,我们直接看最好一条输出的语句。 -> __(3)、__ echo语句的编译:`echo $a,$b;` +> __(3)、__ echo语句的编译:`echo $a,$b;`实际从编译后的语法树就可以看出,一次echo多个也被编译为多次echo了,所以示例中的用法与:`echo $a; echo $b;`等价,我们只分析其中一个就可以了。 + +![](../img/zend_ast_echo.png) + +> `zend_compile_stmt()`中首先发现节点类型是`ZEND_AST_STMT_LIST`,然后调用`zend_compile_stmt_list()`分别编译child,具体的流程如下图所示: + +![](../img/zend_ast_echo_p.png) + +> 最后生成`zend_op`的过程: +```c +void zend_compile_echo(zend_ast *ast) +{ + zend_op *opline; + zend_ast *expr_ast = ast->child[0]; + + znode expr_node; + zend_compile_expr(&expr_node, expr_ast); + + opline = zend_emit_op(NULL, ZEND_ECHO, &expr_node, NULL);//生成1条新的opcode + opline->extended_value = 0; +} +``` + +最终`zend_compile_top_stmt()`编译完成后`CG(active_op_array)`结构: + + + -> ![](../img/zend_ast_echo.png) diff --git a/img/zend_ast_echo_p.png b/img/zend_ast_echo_p.png new file mode 100644 index 0000000000000000000000000000000000000000..abae5eb2ddd0e3d0ecf4f0011d043484d12468a3 GIT binary patch literal 66891 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 literal 0 HcmV?d00001 From ec6546d0068c53923fc7898411819189929e0cec Mon Sep 17 00:00:00 2001 From: qinpeng Date: Wed, 15 Mar 2017 19:22:55 +0800 Subject: [PATCH 058/379] update --- 2/zval.md | 2 +- 3/zend_compile_opcode.md | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/2/zval.md b/2/zval.md index a257edb..8b11ffc 100644 --- a/2/zval.md +++ b/2/zval.md @@ -99,7 +99,7 @@ struct _zend_string { }; ``` * __gc:__ 变量引用信息,比如当前value的引用数,所有用到引用计数的变量类型都会有这个结构,3.1节会详细分析 -* __h:__哈希值,数组中计算索引时会用到 +* __h:__ 哈希值,数组中计算索引时会用到 * __len:__ 字符串长度,通过这个值保证二进制安全 * __val:__ 字符串内容,变长struct,分配时按len长度申请内存 diff --git a/3/zend_compile_opcode.md b/3/zend_compile_opcode.md index ced21e6..111c688 100644 --- a/3/zend_compile_opcode.md +++ b/3/zend_compile_opcode.md @@ -493,7 +493,7 @@ static int lookup_cv(zend_op_array *op_array, zend_string* name) return (int)(zend_intptr_t)ZEND_CALL_VAR_NUM(NULL, i); //传NULL时返回的是96 + i*sizeof(zval) } ``` ->> __注意:这里变量的编号从0、1、2、3...依次递增的,但是实际使用中并不是直接用的这个下标,而是转化成了内存偏移量offset,这个是`ZEND_CALL_VAR_NUM`宏处理的,所以变量偏移量实际是96、112、128...递增的,这个96是根据zend_execute_data大小设定的(不同的平台下对应的值可能不同),下一篇介绍zend执行流程时会详细介绍这个结构。 +>> __注意:这里变量的编号从0、1、2、3...依次递增的,但是实际使用中并不是直接用的这个下标,而是转化成了内存偏移量offset,这个是`ZEND_CALL_VAR_NUM`宏处理的,所以变量偏移量实际是96、112、128...递增的,这个96是根据zend_execute_data大小设定的(不同的平台下对应的值可能不同),下一篇介绍zend执行流程时会详细介绍这个结构。__ ```c #define ZEND_CALL_FRAME_SLOT \ ((int)((ZEND_MM_ALIGNED_SIZE(sizeof(zend_execute_data)) + ZEND_MM_ALIGNED_SIZE(sizeof(zval)) - 1) / ZEND_MM_ALIGNED_SIZE(sizeof(zval)))) @@ -576,6 +576,6 @@ void zend_compile_echo(zend_ast *ast) 最终`zend_compile_top_stmt()`编译完成后`CG(active_op_array)`结构: - +![](../img/zend_op_array_2.png) From e1612350e42487ed7639fb4a10d4db3fed794798 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Wed, 15 Mar 2017 20:20:17 +0800 Subject: [PATCH 059/379] update --- 3/zend_compile_opcode.md | 67 +++++++++++++++++++++++++++++++++++++-- img/zend_op_array_2.png | Bin 0 -> 77849 bytes img/zend_op_array_3.png | Bin 0 -> 39185 bytes 3 files changed, 64 insertions(+), 3 deletions(-) create mode 100644 img/zend_op_array_2.png create mode 100644 img/zend_op_array_3.png diff --git a/3/zend_compile_opcode.md b/3/zend_compile_opcode.md index 111c688..9a480a8 100644 --- a/3/zend_compile_opcode.md +++ b/3/zend_compile_opcode.md @@ -300,7 +300,7 @@ ZEND_API zend_op_array *compile_file(zend_file_handle *file_handle, int type) if (!zendparse()) { //语法解析 zval retval_zv; zend_file_context original_file_context; //保存原来的zend_file_context - zend_oparray_context original_oparray_context; //保存原来的zend_oparray_context + zend_oparray_context original_oparray_context; //保存原来的zend_oparray_context,编译期间用于记录当前zend_op_array的opcodes、vars等数组的总大小 zend_op_array *original_active_op_array = CG(active_op_array); op_array = emalloc(sizeof(zend_op_array)); //分配zend_op_array结构 init_op_array(op_array, ZEND_USER_FUNCTION, INITIAL_OP_ARRAY_SIZE);//初始化op_array @@ -359,7 +359,7 @@ void zend_compile_top_stmt(zend_ast *ast) //function、class两种情况的处理,非常关键的一步操作,后面分析函数、类实现的章节再详细分析 if (ast->kind == ZEND_AST_FUNC_DECL || ast->kind == ZEND_AST_CLASS) { CG(zend_lineno) = ((zend_ast_decl *) ast)->end_lineno; - zend_do_early_binding(); + zend_do_early_binding(); //很重要!!! } } ``` @@ -574,8 +574,69 @@ void zend_compile_echo(zend_ast *ast) } ``` -最终`zend_compile_top_stmt()`编译完成后`CG(active_op_array)`结构: +最终`zend_compile_top_stmt()`编译完成后整个编译流程基本是完成了,`CG(active_op_array)`结构如下图所示,但是后面还有一个处理`pass_two()`。 ![](../img/zend_op_array_2.png) +```c +ZEND_API int pass_two(zend_op_array *op_array) +{ + zend_op *opline, *end; + + if (!ZEND_USER_CODE(op_array->type)) { + return 0; + } + + //重置一些CG(context)的值,暂且忽略 + ... + + opline = op_array->opcodes; + end = opline + op_array->last; + while (opline < end) { + switch(opline->opcode){ + //这里对一些操作进行针对性的处理,后面有遇到的情况我们再看 + ... + } + + //如果是IS_CONST会将数组下标转化为内存偏移量,与IS_CV那种处理方式相同 + //所以这里实际就是将0、1、2...转为为16、32、48...(即:编号*sizeof(zval)) + if (opline->op1_type == IS_CONST) { + ZEND_PASS_TWO_UPDATE_CONSTANT(op_array, opline->op1); + } else if (opline->op1_type & (IS_VAR|IS_TMP_VAR)) { + //上面作相同的处理,不同的是这里的起始值是接着IS_CV的 + opline->op1.var = (uint32_t)(zend_intptr_t)ZEND_CALL_VAR_NUM(NULL, op_array->last_var + opline->op1.var); + } + //与op1完全相同 + if (opline->op2_type == IS_CONST) { + ZEND_PASS_TWO_UPDATE_CONSTANT(op_array, opline->op2); + } else if (opline->op2_type & (IS_VAR|IS_TMP_VAR)) { + opline->op2.var = (uint32_t)(zend_intptr_t)ZEND_CALL_VAR_NUM(NULL, op_array->last_var + opline->op2.var); + } + //返回值与op1/2相同处理 + if (opline->result_type & (IS_VAR|IS_TMP_VAR)) { + opline->result.var = (uint32_t)(zend_intptr_t)ZEND_CALL_VAR_NUM(NULL, op_array->last_var + opline->result.var); + } + //设置此opcode的处理handler + ZEND_VM_SET_OPCODE_HANDLER(opline); + opline++; + } + + //标识当前op_array已执行过此操作 + op_array->fn_flags |= ZEND_ACC_DONE_PASS_TWO; + return 0; +} +``` +抛开特殊opcode的处理,`pass_two()`主要有两个重要操作: + +* (1)将IS_CONST、IS_VAR、IS_TMP_VAR类型的操作数、返回值转化为内存偏移量,与上面提到的IS_CV变量的处理一样,其中IS_CONST类型起始值为0,然后按照编号依次递增sizeof(zval),而IS_VAR、IS_TMP_VAR唯一的不同时它的初始值接着IS_CV的,简单的讲就是先安排PHP变量的,然后接着才是各条语句的中间值、返回值 +* (2)另外一个重要操作就是设置各指令的处理handler,这个前面《3.1.2.1.1 handler》已经介绍过其索引规则 + +经过`pass_two()`处理后opcodes的样子: + +![](../img/zend_op_array_3.png) + +__总结:__ + +到这里整个PHP编译阶段就算全部完成了,最终编译的结果就是zend_op_array,其中最核心的操作就是AST的编译了,有兴趣的可以多写几个例子去看下不同节点类型的处理方式。 +另外,编译阶段很关键的一个操作就是确定了各个 __变量、中间值、临时值、返回值、字面量__的__内存编号__,这个地方非常重要,后面介绍执行流程时也会用到。 diff --git a/img/zend_op_array_2.png b/img/zend_op_array_2.png new file mode 100644 index 0000000000000000000000000000000000000000..728760ee4818d50e959d2af04ea62c2abc7ca7c4 GIT binary patch literal 77849 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ⅅ)*r^T|2JU5w7zu)2GA@AMkD^cW= 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 Date: Wed, 15 Mar 2017 20:21:16 +0800 Subject: [PATCH 060/379] update --- 3/zend_compile_opcode.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3/zend_compile_opcode.md b/3/zend_compile_opcode.md index 9a480a8..1dae502 100644 --- a/3/zend_compile_opcode.md +++ b/3/zend_compile_opcode.md @@ -639,4 +639,4 @@ __总结:__ 到这里整个PHP编译阶段就算全部完成了,最终编译的结果就是zend_op_array,其中最核心的操作就是AST的编译了,有兴趣的可以多写几个例子去看下不同节点类型的处理方式。 -另外,编译阶段很关键的一个操作就是确定了各个 __变量、中间值、临时值、返回值、字面量__的__内存编号__,这个地方非常重要,后面介绍执行流程时也会用到。 +另外,编译阶段很关键的一个操作就是确定了各个 __变量、中间值、临时值、返回值、字面量__ 的 __内存编号__ ,这个地方非常重要,后面介绍执行流程时也会用到。 From b733261e13d75660edf82fdf3f4eb47810f1223e Mon Sep 17 00:00:00 2001 From: qinpeng Date: Wed, 15 Mar 2017 20:23:06 +0800 Subject: [PATCH 061/379] update --- 1/base_process.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/1/base_process.md b/1/base_process.md index 729cf32..aa84487 100644 --- a/1/base_process.md +++ b/1/base_process.md @@ -1,7 +1,7 @@ ## 1.2 执行流程 PHP的生命周期: -![php_process](img/php.png) +![php_process](../img/php.png) ### 1.2.1 模块初始化阶段 From 50bf0726b075ac5b91bae963b868913f1af5ca41 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Thu, 16 Mar 2017 17:55:53 +0800 Subject: [PATCH 062/379] update --- 3/function_implement.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/3/function_implement.md b/3/function_implement.md index d8e0e19..4c807e9 100644 --- a/3/function_implement.md +++ b/3/function_implement.md @@ -62,6 +62,8 @@ PHP在编译阶段将用户自定义的函数编译为独立的opcodes,保存 #### 3.2.1.2 函数参数 +#### 3.2.1.3 函数的编译 + ### 3.2.2 内部函数 上一节已经提过,内部函数指的是由内核、扩展提供的C语言编写的function,这类函数不需要经历opcode的编译过程,所以效率上要高于PHP用户自定义的函数,调用时与普通的C程序没有差异。 From 2d65c9c82597acc517ad2c35bb8d40061b1f963b Mon Sep 17 00:00:00 2001 From: qinpeng Date: Mon, 20 Mar 2017 19:38:26 +0800 Subject: [PATCH 063/379] update --- 3/zend_compile_parse.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/3/zend_compile_parse.md b/3/zend_compile_parse.md index 2ab5165..538920e 100644 --- a/3/zend_compile_parse.md +++ b/3/zend_compile_parse.md @@ -54,11 +54,11 @@ expr: ![zend_compile_process](../img/zend_compile_process.png) -其中__zendparse()__就是词法、语法解析过程,这个函数实际就是bison中提供的语法解析函数__yyparse()__: +其中 __zendparse()__ 就是词法、语法解析过程,这个函数实际就是bison中提供的语法解析函数 __yyparse()__ : ```c #define yyparse zendparse ``` -__yyparse()__不断调用__yylex()__得到token,然后根据token匹配语法规则: +__yyparse()__ 不断调用 __yylex()__ 得到token,然后根据token匹配语法规则: ![](../img/zend_parse_2.png) @@ -91,7 +91,7 @@ again: ``` 这里两个关键点需要注意: -__(1) token值__:词法解析器解析到的token值内容就是token值,这些值统一通过__zval__存储,上面的过程中可以看到调用lex_scan参数是是个zval*,在具体的命中规则总会将解析到的token保存到这个值,从而传递给语法解析器使用,比如PHP中的解析变量的规则:`$a;`,其词法解析规则为: +__(1) token值__:词法解析器解析到的token值内容就是token值,这些值统一通过 __zval__ 存储,上面的过程中可以看到调用lex_scan参数是是个zval*,在具体的命中规则总会将解析到的token保存到这个值,从而传递给语法解析器使用,比如PHP中的解析变量的规则:`$a;`,其词法解析规则为: ```c "$"{LABEL} { //将匹配到的token值保存在zval中 @@ -101,7 +101,7 @@ __(1) token值__:词法解析器解析到的token值内容就是token值,这 ``` zendlval就是我们传入的zval*,yytext指向命中的token值起始位置,yyleng为token值的长度。 -__(2) 语义值类型__:bison调用re2c分割token有两个含义,第一个是token类型,另一个是token值,token类型一般以yylex的返回值告诉bison,而token值就是语义值,这个值一般定义为固定的类型,这个类型就是语义值类型,默认为int,可以通过__YYSTYPE__定义,而PHP中这个类型是__zend_parser_stack_elem__,这就是为什么zendlex的参数为zend_parser_stack_elem的原因。 +__(2) 语义值类型__:bison调用re2c分割token有两个含义,第一个是token类型,另一个是token值,token类型一般以yylex的返回值告诉bison,而token值就是语义值,这个值一般定义为固定的类型,这个类型就是语义值类型,默认为int,可以通过 __YYSTYPE__ 定义,而PHP中这个类型是 __zend_parser_stack_elem__ ,这就是为什么zendlex的参数为`zend_parser_stack_elem`的原因。 ```c #define YYSTYPE zend_parser_stack_elem @@ -111,7 +111,7 @@ typedef union _zend_parser_stack_elem { zend_ulong num; } zend_parser_stack_elem; ``` -实际这是个union,ast类型用的比较多(其它两种类型暂时没发现有地方在用),这样可以通过%token、%type将对应的值修改为elem.ast,所以在zend_language_parser.y中使用的$$、$1、$2......多数都是__zend_parser_stack_elem.ast__: +实际这是个union,ast类型用的比较多(其它两种类型暂时没发现有地方在用),这样可以通过%token、%type将对应的值修改为elem.ast,所以在zend_language_parser.y中使用的$$、$1、$2......多数都是 __zend_parser_stack_elem.ast__ : ```c %token T_LNUMBER "integer number (T_LNUMBER)" %token T_DNUMBER "floating-point number (T_DNUMBER)" @@ -123,7 +123,7 @@ typedef union _zend_parser_stack_elem { %type interface_declaration_statement interface_extends_list ``` -语法解析器从start开始调用,然后层层匹配各个规则,语法解析器根据命中的语法规则创建AST节点,最后将生成的AST根节点赋到__CG(ast)__: +语法解析器从start开始调用,然后层层匹配各个规则,语法解析器根据命中的语法规则创建AST节点,最后将生成的AST根节点赋到 __CG(ast)__ : ```c %% /* Rules */ @@ -191,4 +191,4 @@ echo $a,$b; __总结:__ -这一节我们主要介绍了PHP词法、语法解析生成抽象语法树(AST)的过程,此过程是PHP语法实现的基础,也是zend引擎非常关键的一部分,后续介绍的内容都是基于此过程的产出结果展开的。这部分内容关键在于对re2c、bison的应用上,如果是初次接触它们可能不太容易理解,这里不再对re2c、bison作更多解释,想要了解更多的推荐看下__《flex与bison》__这本书。 +这一节我们主要介绍了PHP词法、语法解析生成抽象语法树(AST)的过程,此过程是PHP语法实现的基础,也是zend引擎非常关键的一部分,后续介绍的内容都是基于此过程的产出结果展开的。这部分内容关键在于对re2c、bison的应用上,如果是初次接触它们可能不太容易理解,这里不再对re2c、bison作更多解释,想要了解更多的推荐看下 __《flex与bison》__ 这本书。 From 750c993fec410ec0e0e9f8198c787498a286b084 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Wed, 22 Mar 2017 20:34:22 +0800 Subject: [PATCH 064/379] update --- 3/function_implement.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/3/function_implement.md b/3/function_implement.md index 4c807e9..e7f5521 100644 --- a/3/function_implement.md +++ b/3/function_implement.md @@ -61,6 +61,20 @@ union _zend_function { PHP在编译阶段将用户自定义的函数编译为独立的opcodes,保存在`EG(function_table)`中,调用时重新分配新的zend_execute_data(相当于运行栈),然后执行函数的opcodes,调用完再还原到旧的`zend_execute_data`,继续执行,关于zend引擎execute阶段后面会详细分析。 #### 3.2.1.2 函数参数 +函数参数在内核实现上与函数内的局部变量实际是一样的,上一篇我们介绍编译的时候提供局部变量会有一个单独的 __编号__ ,而函数的参数与之相同,参数名称也在zend_op_array.vars中,编号首先是从参数开始的,所以按照参数顺序其编号依次为0、1、2...(转化为相对内存偏移量就是96、112、128...),然后函数调用时首先会在调用位置将参数的value复制到各参数各自的位置,详细的传参过程我们在执行一篇再作说明。 + +另外参数还有其它的信息,比如默认值、引用传递,这些信息通过`zend_arg_info`结构记录: +```c +typedef struct _zend_arg_info { + zend_string *name; //函数名 + zend_string *class_name; + zend_uchar type_hint; //显式声明的参数类型,比如(array $param_1) + zend_uchar pass_by_reference; //是否引用传参,参数前加&的这个值就是1 + zend_bool allow_null; //是否允许为空 + zend_bool is_variadic; //是否为可变参数,即...用法,与golang的用法相同,5.6以上新增的一个用法 +} zend_arg_info; +``` +每个参数都有一个上面的结构,所有参数的结构保存在`zend_op_array.arg_info`数组中。 #### 3.2.1.3 函数的编译 From 19597c7d5aeeaa5d1ffa502f523bd020543822d5 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Wed, 22 Mar 2017 20:44:06 +0800 Subject: [PATCH 065/379] update --- 3/function_implement.md | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/3/function_implement.md b/3/function_implement.md index e7f5521..19c3e38 100644 --- a/3/function_implement.md +++ b/3/function_implement.md @@ -63,6 +63,28 @@ PHP在编译阶段将用户自定义的函数编译为独立的opcodes,保存 #### 3.2.1.2 函数参数 函数参数在内核实现上与函数内的局部变量实际是一样的,上一篇我们介绍编译的时候提供局部变量会有一个单独的 __编号__ ,而函数的参数与之相同,参数名称也在zend_op_array.vars中,编号首先是从参数开始的,所以按照参数顺序其编号依次为0、1、2...(转化为相对内存偏移量就是96、112、128...),然后函数调用时首先会在调用位置将参数的value复制到各参数各自的位置,详细的传参过程我们在执行一篇再作说明。 +比如: +```php +function my_function($a, $b = "aa"){ + $ret = $a . $b; + return $ret; +} +``` +编译完后各变量的内存偏移量编号: +``` +$a => 96 +$b => 112 +$ret => 128 +``` +与下面这么写一样: +```php +function my_function(){ + $a = NULL; + $b = "aa"; + $ret = $a . $b; + return $ret; +} +``` 另外参数还有其它的信息,比如默认值、引用传递,这些信息通过`zend_arg_info`结构记录: ```c typedef struct _zend_arg_info { From c73b2f502306a50a442ea4c6ba8d1bb638b9cecb Mon Sep 17 00:00:00 2001 From: qinpeng Date: Wed, 22 Mar 2017 20:54:39 +0800 Subject: [PATCH 066/379] update --- 3/function_implement.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/3/function_implement.md b/3/function_implement.md index 19c3e38..7308c6b 100644 --- a/3/function_implement.md +++ b/3/function_implement.md @@ -99,6 +99,9 @@ typedef struct _zend_arg_info { 每个参数都有一个上面的结构,所有参数的结构保存在`zend_op_array.arg_info`数组中。 #### 3.2.1.3 函数的编译 +我们在上一篇文章介绍过PHP代码的编译过程,主要是PHP->AST->Opcodes的转化,上面也说了函数其实就是将一组PHP代码编译为单独的opcodes,函数的调用就是不同opcodes间的切换,所以函数的编译过程与普通PHP代码基本一致,只是会有一些特殊操作,我们从一个例子再简单看下编译过程。 + +...... ### 3.2.2 内部函数 上一节已经提过,内部函数指的是由内核、扩展提供的C语言编写的function,这类函数不需要经历opcode的编译过程,所以效率上要高于PHP用户自定义的函数,调用时与普通的C程序没有差异。 From 641e35917c0b78d6fb40a33b96cc8fe9b7d6654c Mon Sep 17 00:00:00 2001 From: qinpeng Date: Thu, 23 Mar 2017 11:34:42 +0800 Subject: [PATCH 067/379] add function ast --- 3/function_implement.md | 36 ++++++++++++++++++++++++++++++++++-- img/ast_function.png | Bin 0 -> 65777 bytes 2 files changed, 34 insertions(+), 2 deletions(-) create mode 100644 img/ast_function.png diff --git a/3/function_implement.md b/3/function_implement.md index 7308c6b..89e436c 100644 --- a/3/function_implement.md +++ b/3/function_implement.md @@ -99,9 +99,41 @@ typedef struct _zend_arg_info { 每个参数都有一个上面的结构,所有参数的结构保存在`zend_op_array.arg_info`数组中。 #### 3.2.1.3 函数的编译 -我们在上一篇文章介绍过PHP代码的编译过程,主要是PHP->AST->Opcodes的转化,上面也说了函数其实就是将一组PHP代码编译为单独的opcodes,函数的调用就是不同opcodes间的切换,所以函数的编译过程与普通PHP代码基本一致,只是会有一些特殊操作,我们从一个例子再简单看下编译过程。 +我们在上一篇文章介绍过PHP代码的编译过程,主要是PHP->AST->Opcodes的转化,上面也说了函数其实就是将一组PHP代码编译为单独的opcodes,函数的调用就是不同opcodes间的切换,所以函数的编译过程与普通PHP代码基本一致,只是会有一些特殊操作,我们以3.2.1.2开始那个例子简单看下编译过程。 -...... +普通函数的语法解析规则: +```c +function_declaration_statement: + function returns_ref T_STRING backup_doc_comment '(' parameter_list ')' return_type + '{' inner_statement_list '}' + { $$ = zend_ast_create_decl(ZEND_AST_FUNC_DECL, $2, $1, $4, + zend_ast_get_str($3), $6, NULL, $10, $8); } +; +``` +规则主要由五部分组成: +* __returns_ref:__ 是否返回引用,在函数名前加&,比如function &test(){...} +* __T_STRING:__ 函数名 +* __parameter_list:__ 参数列表 +* __return_type:__ 返回值类型 +* __inner_statement_list:__ 函数内部代码 + +函数生成的抽象语法树根节点类型是zend_ast_decl,所有函数相关的信息都记录在这个节点中(除了函数外类也是用的这个): +```c +typedef struct _zend_ast_decl { + zend_ast_kind kind; //函数就是ZEND_AST_FUNC_DECL,类则是ZEND_AST_CLASS + zend_ast_attr attr; /* Unused - for structure compatibility */ + uint32_t start_lineno; //函数起始行 + uint32_t end_lineno; //函数结束行 + uint32_t flags; //其中一个标识位用来标识返回值是否为引用,是则为ZEND_ACC_RETURN_REFERENCE + unsigned char *lex_pos; + zend_string *doc_comment; + zend_string *name; //函数名 + zend_ast *child[4]; //child有4个子节点,分别是:参数列表节点、use列表节点、函数内部表达式节点、返回值类型节点 +} zend_ast_decl; +``` +上面的例子最终生成的语法树: + +![](../img/ast_function.png) ### 3.2.2 内部函数 上一节已经提过,内部函数指的是由内核、扩展提供的C语言编写的function,这类函数不需要经历opcode的编译过程,所以效率上要高于PHP用户自定义的函数,调用时与普通的C程序没有差异。 diff --git a/img/ast_function.png b/img/ast_function.png new file mode 100644 index 0000000000000000000000000000000000000000..1e955590e0d9a34668d4b4c8bbab457baf4b557d GIT binary patch literal 65777 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 Pu0cWO$>Rzsv*7;$(1R}2 literal 0 HcmV?d00001 From 01ebfe6895c8c1de0a74a497ff9e6a3800172385 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Thu, 23 Mar 2017 12:22:50 +0800 Subject: [PATCH 068/379] update --- 3/function_implement.md | 52 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/3/function_implement.md b/3/function_implement.md index 89e436c..e7fe680 100644 --- a/3/function_implement.md +++ b/3/function_implement.md @@ -135,6 +135,58 @@ typedef struct _zend_ast_decl { ![](../img/ast_function.png) +具体编译为opcodes的过程在`zend_compile_func_decl()`中: +```c +void zend_compile_func_decl(znode *result, zend_ast *ast) +{ + zend_ast_decl *decl = (zend_ast_decl *) ast; + zend_ast *params_ast = decl->child[0]; //参数列表 + zend_ast *uses_ast = decl->child[1]; //use列表 + zend_ast *stmt_ast = decl->child[2]; //函数内部 + zend_ast *return_type_ast = decl->child[3]; //返回值类型 + zend_bool is_method = decl->kind == ZEND_AST_METHOD; //是否为成员函数 + + //这里保存当前正在编译的zend_op_array:CG(active_op_array),然后重新为函数生成一个新的zend_op_array, + //函数编译完再将旧的还原 + zend_op_array *orig_op_array = CG(active_op_array); + zend_op_array *op_array = zend_arena_alloc(&CG(arena), sizeof(zend_op_array)); //新分配zend_op_array + ... + + zend_compile_params(params_ast, return_type_ast); //编译参数 + if (uses_ast) { + zend_compile_closure_uses(uses_ast); + } + zend_compile_stmt(stmt_ast); //编译函数内部语法 + ... + pass_two(CG(active_op_array)); + ... + CG(active_op_array) = orig_op_array; //还原之前的 +} +``` +> __编译过程主要有这么几个处理:__ + +> (1)保存当前正在编译的zend_op_array,新分配一个结构,因为每个函数、include的文件都对应独立的一个zend_op_array,通过CG(active_op_array)记录当前编译所属zend_op_array,所以开始编译函数时就需要将这个值保存下来,等到函数编译完成再还原回去; + +```php +$a = 123; //当前为CG(active_op_array) = zend_op_array_1,编译到这时此opcode加到zend_op_array_1 + +//新分配一个zend_op_array_2,并将当前CG(active_op_array)保存到origin_op_array, +//然后将CG(active_op_array)=zend_op_array_2 +function test(){ + $b = 234; //编译到zend_op_array_2 +}//函数编译结束,将CG(active_op_array) = origin_op_array,切回zend_op_array_1 +$c = 345; //编译到zend_op_array_1 +``` +> (2)编译参数列表,函数的参数我们在上一小节已经介绍,完整的参数会有三个组成:参数类型(可选)、参数名、默认值(可选),这三部分分别保存在参数节点的三个child节点中,编译参数的过程有两个关键操作: + +>> 操作1:为每个参数编号 + +>> 操作2:每个参数生成一条opcode,如果是可变参数其opcode=ZEND_RECV_VARIADIC,如果有默认值则为ZEND_RECV_INIT,否则为ZEND_RECV + +> 上面的例子中$a编号为96,$b为112,同时生成了两条opcode:ZEND_RECV、ZEND_RECV_INIT,调用的时候会根据具体传参数量跳过部分opcode,比如这个函数我们这么调用`my_function($a)`则ZEND_RECV这条opcode就直接跳过了,然后执行ZEND_RECV_INIT将默认值写到112位置,具体的编译过程在`zend_compile_params()`中,这里不再展开。 + +> (3)编译函数内部语法,这个跟普通PHP代码编译过程无异。 + ### 3.2.2 内部函数 上一节已经提过,内部函数指的是由内核、扩展提供的C语言编写的function,这类函数不需要经历opcode的编译过程,所以效率上要高于PHP用户自定义的函数,调用时与普通的C程序没有差异。 From 196f5f57db310a11127bcc755849fa2249b584cd Mon Sep 17 00:00:00 2001 From: qinpeng Date: Thu, 23 Mar 2017 13:06:35 +0800 Subject: [PATCH 069/379] update --- 3/function_implement.md | 61 ++++++++++++++++++++++++++++++++++++---- img/ast_function_op.png | Bin 0 -> 11089 bytes img/function_dec.png | Bin 0 -> 5442 bytes 3 files changed, 56 insertions(+), 5 deletions(-) create mode 100644 img/ast_function_op.png create mode 100644 img/function_dec.png diff --git a/3/function_implement.md b/3/function_implement.md index e7fe680..acc77f5 100644 --- a/3/function_implement.md +++ b/3/function_implement.md @@ -151,6 +151,15 @@ void zend_compile_func_decl(znode *result, zend_ast *ast) zend_op_array *orig_op_array = CG(active_op_array); zend_op_array *op_array = zend_arena_alloc(&CG(arena), sizeof(zend_op_array)); //新分配zend_op_array ... + + if (is_method) { + zend_bool has_body = stmt_ast != NULL; + zend_begin_method_decl(op_array, decl->name, has_body); + } else { + zend_begin_func_decl(result, op_array, decl); //注意这里会在当前zend_op_array(不是新生成的函数那个)生成一条ZEND_DECLARE_FUNCTION的opcode + } + CG(active_op_array) = op_array; + ... zend_compile_params(params_ast, return_type_ast); //编译参数 if (uses_ast) { @@ -165,7 +174,7 @@ void zend_compile_func_decl(znode *result, zend_ast *ast) ``` > __编译过程主要有这么几个处理:__ -> (1)保存当前正在编译的zend_op_array,新分配一个结构,因为每个函数、include的文件都对应独立的一个zend_op_array,通过CG(active_op_array)记录当前编译所属zend_op_array,所以开始编译函数时就需要将这个值保存下来,等到函数编译完成再还原回去; +> __(1)__ 保存当前正在编译的zend_op_array,新分配一个结构,因为每个函数、include的文件都对应独立的一个zend_op_array,通过CG(active_op_array)记录当前编译所属zend_op_array,所以开始编译函数时就需要将这个值保存下来,等到函数编译完成再还原回去;另外还有一个关键操作:`zend_begin_func_decl`,这里会在当前zend_op_array(不是新生成的函数那个)生成一条 __ZEND_DECLARE_FUNCTION__ 的opcode,也就是函数声明操作。 ```php $a = 123; //当前为CG(active_op_array) = zend_op_array_1,编译到这时此opcode加到zend_op_array_1 @@ -177,15 +186,57 @@ function test(){ }//函数编译结束,将CG(active_op_array) = origin_op_array,切回zend_op_array_1 $c = 345; //编译到zend_op_array_1 ``` -> (2)编译参数列表,函数的参数我们在上一小节已经介绍,完整的参数会有三个组成:参数类型(可选)、参数名、默认值(可选),这三部分分别保存在参数节点的三个child节点中,编译参数的过程有两个关键操作: +> __(2)__ 编译参数列表,函数的参数我们在上一小节已经介绍,完整的参数会有三个组成:参数类型(可选)、参数名、默认值(可选),这三部分分别保存在参数节点的三个child节点中,编译参数的过程有两个关键操作: ->> 操作1:为每个参数编号 +>> __操作1:__ 为每个参数编号 ->> 操作2:每个参数生成一条opcode,如果是可变参数其opcode=ZEND_RECV_VARIADIC,如果有默认值则为ZEND_RECV_INIT,否则为ZEND_RECV +>> __操作2:__ 每个参数生成一条opcode,如果是可变参数其opcode=ZEND_RECV_VARIADIC,如果有默认值则为ZEND_RECV_INIT,否则为ZEND_RECV > 上面的例子中$a编号为96,$b为112,同时生成了两条opcode:ZEND_RECV、ZEND_RECV_INIT,调用的时候会根据具体传参数量跳过部分opcode,比如这个函数我们这么调用`my_function($a)`则ZEND_RECV这条opcode就直接跳过了,然后执行ZEND_RECV_INIT将默认值写到112位置,具体的编译过程在`zend_compile_params()`中,这里不再展开。 -> (3)编译函数内部语法,这个跟普通PHP代码编译过程无异。 +> __(3)__ 编译函数内部语法,这个跟普通PHP代码编译过程无异。 + +> __(4)__ pass_two(),上一篇介绍过,不再赘述。 + +最终生成两个zend_op_array: + +![](../img/ast_function_op.png) + +总体来看,PHP在逐行编译时发现一个function则生成一条ZEND_DECLARE_FUNCTION的opcode,然后调到函数中编译函数,编译完再跳回去继续下面的编译,这里多次提到ZEND_DECLARE_FUNCTION这个opcode是因为在函数编译结束后还有一个重要操作:`zend_do_early_binding()`,前面我们说过总的编译入口在`zend_compile_top_stmt()`,这里会对每条语法逐条编译,而函数、类在编译完成后还有后续的操作: + +```c +void zend_compile_top_stmt(zend_ast *ast) +{ + ... + if (ast->kind == ZEND_AST_STMT_LIST) { + for (i = 0; i < list->children; ++i) { + zend_compile_top_stmt(list->child[i]); + } + } + + zend_compile_stmt(ast); //编译各条语法,函数也是在这里编译完成 + + //函数编译完成后 + if (ast->kind == ZEND_AST_FUNC_DECL || ast->kind == ZEND_AST_CLASS) { + CG(zend_lineno) = ((zend_ast_decl *) ast)->end_lineno; + zend_do_early_binding(); + } +} +``` +`zend_do_early_binding()`核心工作就是 __将function、class加到CG(function_table)、CG(class_table)中__ ,加入成功了就直接把 __ZEND_DECLARE_FUNCTION__ 这条opcode干掉了,加入失败的话则保留,这个相当于 __有一部分opcode在『编译时』提前执行了__ ,这也是为什么PHP中可以先调用函数再声明函数的原因,比如: +```php + +$a = 1234; + +echo my_function($a); + +function my_function($a){ + ... +} +``` +实际原始的opcode以及执行顺序: + +![](function_dec.png) ### 3.2.2 内部函数 上一节已经提过,内部函数指的是由内核、扩展提供的C语言编写的function,这类函数不需要经历opcode的编译过程,所以效率上要高于PHP用户自定义的函数,调用时与普通的C程序没有差异。 diff --git a/img/ast_function_op.png b/img/ast_function_op.png new file mode 100644 index 0000000000000000000000000000000000000000..003d730da2b0d2d13b8218e5857a44b0b72ea2df GIT binary patch literal 11089 zcmbuFWn5HWyY~kX0}v@m2}e2{m68@1LQ=XJItP&MQ0Wkml9mQx=#WNITDk;8>5if6 zEc~DQxzD*@JkN_~@o@$>Ywx}G+Sj_``&+@U>dp=D z$+fsR2fl6@%1FW?SJywE8*-z;k-KlCG#wxiyteCq7_qE)ln@9lqD=BhQE!1T4$Cw-hpG>FcUst^O=ssj4=&h9-=1**hFGjlX!u%x`1ozd8QY>&!B5g>?HZ3u&(ZGDLhVOS^z?}aB~b?_i5nU6w`{mK z`NR)Je~9*>2aP%kwd&qx>ohpN4PuaU=5;&Aglbg@Nc`s1D@fKXU;d;~d~Q5>b$;YS zFjzS0u;hAD)^`4LBm5OJGRkx`fNA0ZP*-HJ`X6WVZB}AH^zFtr7jTMVOtsUr+`|Xo=$nf zTukcT1+6uHWf9gSX)qQ!y6`~wjN&&KW5_UOoak-E?%6}TySnr8g@&!N6%9nP+XI7F znl9};#9d3yjmc$TF#fo>bNkU%WjNYfQKUtNHJsRfU4qpLmq4|JN{T@7KXGmI29New`u(-+c#it{h`kmgC>0=lM1eb38a1R@g=5a{+d;TBe{dd{%6>eP$xc-^F%^v;U4Ljw`Uerko~hcd#%t&VIOkkX!x}nY)ryCh zhF1zMDJ?{?_^ad@vwtA9n8wNS6Rwg;gs`9;qJOr%C!->f)9Nt!!Th&sn~J^E__$Zm z+4YeoJw_SvY+t=MWyZMsob5eBXD40W#JtB$YV_IGv)G*n=e;9&G8JDQPd{5b*xkM1 zb%f!Yy}G@a|H}H?m3`UsI0;np3%9bw5in<^nRLQDNf$g@%yx1IY zQ0Ex5qf7aDk+N|Ff0*Iw{*4>qJjF_SLLNmtX$J>sKERNQi@8cz)Xr_FWRB2#3CFz) zp_QW@+TQyTJ>%mPQ`6I~*;<<;ENXI=VA*BmQdJUG$_wLxH@yAA2a@*(zf( zU2dWtEkq;INo*EHiCQ%2bT(`1RPGR@Z#>h@HNDCC!3opt^6Y5)ATdo>*@!w%g(xkd zS3#5}PbD$I>tdObW%>PM@f51=^7yq$wkG_^0xw=oaM1wvP-w=xpDxGkonY##vg_T8 z);J0LEt1VKn_re~ZH896b!SI=jAm zA2}KI%&tsDj&qCoS#i8vK`;q>Xs!L~Z>wDxfk*FR`!6tii-kIr+RQKn@rn!_R!?^Bvm`Jul{qRefhz6Plb4@Ki*C1h zb{nSWej<7gK}=owoN@m?j4}5&-$P#%uJU?)_pj}3gvx1YC2ONoxziBG>2}=O=wQ*C z5m%*R_48Y-q$``dHs9v+hs_f8oDi&wXtiBCx5>-oLXNcYqs*7OrGp0a^z{Ax{Upry zn&mYv4*ef_g}A`89=K2B7m?hK3L>>y$Wkr0Y*^eGJtN)z-aJNiH5>&j;!GVFfgf#W zPn}mem(dx?4B9N~N!{F}nK^sBnF$^=YAk2*O7d`Ko3GOTgNJmo%P}Snr;35^#r{g`km7Ke3nF#F3n0}Tw|d+)eG^d)h_;{#dcpRTlZbW~MQc!Uu7 zMoDLji;KIHPHuc)e~GB9s!~%|2QHZwf`Ne%K=NqeZRD?WOxcmKvBL?Yh~RcZlq2x? zzUiy;t%0?{?>wK}-ym^!(`UeBta?!d(PwI@6u>7$?={N;um1={8;)JIgLAlF#`zH-|u}Ny6bfF+o9hDz#>Q{$z{pQc_kv z33;9nCTDK?AvDy=%8EmUl+{n&abx1yjAMc<7-#3upWnY-mzI`H)tC|8**Q7g#?SlQ zxvcW@@_tw|PBS%dYPV?Rsan9{H(6Uz`Sg$u4jjc#pwJ8yN-pR9gG!fe zy((#OasQ_4Campm4J$~wP^_@r=6T#nCQ6M96%i3Zp-|J+wmj6wr`@fsnY#o$JUj{t z3edHU4V?yeE*Sy4-!};k(C8Puys9cH6%`fcv7Zy%HYQ40)e4`gs4FPkCn!x`U0tnn z*?z*tHX?0{M51?gXfuwFUHf|Hyw6bShO8_sKY#vQu&*&Sw6n7_GBPqYHnz0DYM-w-=C zGV-;ihMs{TE;e>`tmQ^v6#Mfb(Z|fmfq{VSQoGcShKR)3{7uGVSx)ZQ8eo2>1^lw4wu{q8RV6}pRUVl2m>tV0p<3+kj9A+Pw!U4EiT@^ z*b~nsv$M0~`X`)cf>S}gV6-P524i7iVP;PE@nQ>57#|(&OXTX2GCGDjYrbZQ<>utX zk1};iO-%*Cibv&+0*sxVKI8j$sq3Yp!V>FoxM2_qg+hPM%n%V0mX(#ccDeINt2;Ya z)z#H)RjpgU*Fw#f8cFKwe~ynQO*+`w(RU$ppTSHlS1;CEjD7B~+`q`1lAH_-!Ih_e z&d2IcA=#e&5RXwF4SSQj`_R}7Z^QC>CXM&8!ElZouvBOi)3ayKXleBqzDJQ1o9N%f z!m{Wu(>L=bwFQ;}>>V2Qz3rUec|%H8cBC#ZJv}`?pP7eeJjNb0+?0>yKIi`a{u>Op z2r4ToR-C^s*q@A{w1Fj0Zd6zdSIE~!M@P4|wz_>BCU1qIy~K996TT3e%(@<-Mjn=THg2ZXQc zc`1ij#r`a6em2KF$YiCZZKe>`1@}KHgIm7LOi1;<24Y zT3QZmER+f0;o*Td2%Klbtp5tn#a!ce*30q}amFGo`>mh6`#t2+O9N?X+ODn>I|PrZ zX^c!2gA3wHY!RGXT)-uLc*wiAGMIVZQuQ(xJj856WF(0cK0Qa``d^nOT#!`o!60CMOdvPQU`w$PG3b-aIWOp5-1B zh?1fs3`X0;%#v7E%Gt^UNde!c!Xi}gn#tYW-Lup!(2=AuF$twTwH_`Q&O^`T_xf7sRfu=Sf1NcOm8E+FOP9xon6=M zRe|wgmj99#QjMd0$%&6TiHyX=RaXl&ihQreu4VnBH)oV?R_c0C4V0t9!0mi6 z)w*kckLP=F-OSapCL0z!gJH!PkLv*nEC1H^WCwmTEV8ypZ)M!v2i&oJFfb2mGZZK)^OM_NbSRR za9Tc}63mnsytn!N*)lyMB4VpAT4c24ZJ=Ii$xMwy;N^jexp^xAmg#d&c%BI!+r!W9 zC0>T+TRf%YaSR+3oYQU37$=rzVqTKC*La+< z3XBVROrgz_l?Lot=mI?)^;ohjT?AY})Llw^yL>euRcp;j{4%FnEo3Q^x|aDp_Ierv z0|WNy?jIq7t!*M)!j_fAQUk^bN8oV+10}t@yriW=GBb@NB?Fc6dj|%N_V<;Uh&^|T z7Zw&GBO^~wPe%*X%Xe9pdJ|e_JLP3$>f8@l2zdGU_5$nO9(?%l!NkNQkvS?V>YP16 zp9*~zKYWgHs^ zM_EZ}qCzR(c)qx#Br@D13fL$yaoepl0|k8$HA~E;;L5r3x+VH=%gY^rLyl!t2bVN3 zctj}?)lkzH5*`s@RxGGj?^;TOse)dE#nKQB?sQUb&#hJ4a$g+@+c?cNNy5R(o33># zpr_>d3eppN0-rj_XPTRD3|ZrQPM&h@?(PC-Z8i*6W_CFNb5LGsY1I9y#oxb&hK4du zX6?<*S3n$Kl>I~-B{i`Q1HPSYVRU4~5j=uoM{RBG)?AYU+{VU6QBg5CIJg0iXM|BT zE%|vr^*KFPV>&Zd%#PQ=3vxPXrER)g~EuI;t`ic zANo}^1JsXiTzSm z_8bNqn4EMQNEN(xV1!fxu8|M8j5@;hmj~7xgZ?ZpR~vPHNa1(UdgGvnd-rh$L1t=& zegZ@vih0Qu^h9BqFYphUZ1jJqRv@HK1Pb#0LsJI65j+$AY{}Bcp%~ z*fVCe2IP;Dtt}&PDY+l!oXTlae&i z^F(YZayzuyHPVujoj+?F%=!}B<&gJ-K9fUWX*sQrmAvy6!x zq-fq3r`5CWR$!%!%{_oTMPGgz$UE^}H}V`R(~3&bOcvT1-oE_Ps#w!0Y9Mv|C8jt_%vgUO=tLMx_8kF)$392|7@ zc6R4?N1GGvV?xluuc~2&hK3;b?F^?Jx9SH^;{_fUOwV{-MP}xoa>3eyCe5j=$|6~dKEOU+;wxY znG-lQXurm~#&YmHR1$<%;6>?!lKy^qZ61u5`e^iC(4A_|oAbaSSJ~X~ZT<}WgY*Be zf6Vc{TVEeQAef>)-&-$mAY>nZ{H45B*9hU?YllGNd(S|hyhh#77zzSOC!D}Bv*hwR z(p~;+O%1`dzp=iE0r}M0?BGW7ac8KzZtg;0D)6juQhTc_bkm~hGv3C0s zI0St-cYc0~X`$TjZ+u@@l{;HM_BG6Prp2xSbjW&nWl$l8ga%Ku z-f?v5Ug5+zV)7*%D==aeB{-iQE0d|V$3AryI5*ei0^>0AK^)RUG<=;r-1Hjvm#}X3 zbc< z=jvdXsCv7*_Dpvu)a~$g*`rQg{qnqaSf%FXB z_G;MlE79OJfeV=ke+9_loD zqxJS-C>4F-Hiy$`uMDYWe;Ug0>XM&720&i?!H2Lpz_@+#V{B!mc|G-o2}Og!pW=#%GfzLb za;weAtxM|r@~UsTtIB^FeUMhn>v1sDehMoh92B;hGh}slKfzZ7eEyl0(UoUeuTx0x zI}b95tl5knHNoaoW4lubn{1{shey#-_Z;d^IbrT@hm5P?#)Q!5aT`(25{;l~Sh{$( zb9)Fqj@iJ0UOij42;JI&U*hyx;3mMT3ofO1In4SReXgjRVy>Za?B3p|%2I^RiKok< z2SeN~NSw(`q)X8nnp9l~cCv4g`rM+d2Sv#qAkXL|m$$8na-9EO5I<_WtzX1m>Mx1>N;-+J8a%RG@pEF>ldC1JC z?ldKJ7reKN&9%k*ABc6E4o$T7Si#tTx`wj}vtH?pt^ybhFl=x9R!^6qcth>Hi=kw2 z)c3OX1#` zXjxC;oD}CY4NLq!+{5T`_3cl)*RhP;wTS~DL2;~nM*3Nm2p$uVA5>bRfSS4(hgZO64b~?m5TRP z>3X=>&XqC!a5>c34%;{q64LA-Wk*zUFD~9ApWL2*PW`{}vYeKY>f2fBZIXxF7s*q< zvF+zhR@zDdL)Ol!m{=(RRW%6vp)t4g84JD7S|}QQc7Cm-i_TmtU~Prro63q}N~_rO(dp=Lbk$aWsS~Ropur@P z#Ggd}Dv+zX#w&;ZSe78?M->%Sy%Z6XdifHvg?m8xf$6E@%a^|C;$s&rHeeIArW5EfbZ>g)K4;A$p>ZoDG+1d2`{AbN? zF)Re4rwI`Lg+|-5=x(zKo@X1xOp_%c-fU;VKA3aqJMt-jwonbaXT_q_d&W zD50!a>Nm4w0O=#{~GY`y2KRoU6%4j_D6T3HRtl2dG)9*VoTxHvfM z)7oa~uCA?xeE6VOVXo-tSTWno*e0yz?CcESb<*Ye{y@Y--sdLWG0SN_v(wW_^wclj zG`F{#w1+&{+}s32#oOB(Ug2})4V9LYLlqYs38JZ z%C9&jn2pB1cTY}1VVwP~nGF(I?{Tyh$F3cwQtf^KvgkFCwQ+HC?`=JjDJ&{7-IY&& zy)oNR_x0;1`c!@wc{)N~US5E5cI=<%d@XU^HN@F`F9IiPs0S?ll0P9OWpjRB5rE;3 zAAhf`ObiYJ7Pr5@4*)MQHWq(s5ED3?jxMXQ(Ho@7pyCYzMN@P_!YeqSQ~)v3LnS38 zE4BJ4x(ePnI;wV#}v zoJS5%kyL7d>GuMc29@E;ig~K!_^5>t1cJSIy%&JhK|-SABfZQ-RH4j85Gd=G*kFMt z`)OBfQBnYiYC_l7QHUnJC-GnmM2cVuz@gwp5u)+NdqQBzn$p)pR44Tq&MPT-N>A@E z#~Le5atUU6cz77hbM(iL@7}!wvdOCAz!UIiaWQBjpVJyB5`f(Sb)iV721*zVx@!(J zRaC?TX_SJ(AFxgENea`e_r9oY=UM(2K;UW0+uO5uMwu}gJc^LB!V;S1?v(}i2Yhtn zHC@KonA)Kd@l`N=Mn^{nKqWwocud(->!&q7!#O%W4z?nI&%l6yJu4r8{8Uv{(Rr*p zi}8qCfWD&0sHhq|j%@rzpLw4jgLwjUxSZRyq|63309~->z3OT2>@2r>2&apZ(zves zWspdu@$QEpu&e-si;<=m{w^ve217Io7_{6BhPOcdK_?tHE-o%mWN2z?!be6&oq$LJ z1$97ZNQkto>;k<8e3UVlO;yFsttLB!qF3Wro$GD}igL&YI1M0uBsP6k%ID=w5FiTB%Y9MN7xBEr4z}3*)+#G=R182;(zCJ+Y%jY~EtK(wH zK^UuQ%`iNtTrEVnUWz1I?DY<` z3=Z3d?Ueysir1j0=jO&+r`Z)w$@5`m_zpHU;fk9YK#8WNIck3Z`I___8w7r*qphtC zkSWGAPo<;0A{2@q`ZzZkzzW?)&l8x>Ne_S)w{G9whpSO(TXlqy0}?(@XaoR}Aj|MWcZL<9jPr|&fi&TP9N-pAo|7l3vBciHcW-NJ%d9`yAozL023Y$W z3Oyc|V3vSG`G1j~I{Q=j*}w9_0{jRDgA^4KHSuuV&PDtl{Q)G_Gx2sE zz;;t5uT0(7QPpjRc2ZJ7!6#sW0;bQx%F0z|5hj{GQR9$nQ#&gflvh!qvdy~()R6tX zz2l*&DJ>8aNlD{ZR#pT(4i`XV?V=oB|6<~WBY+D-} z#=&*Yo7bdeoQ>OhiY``~gM$M|MJCTRm6ercWy6Y#VFV|~$A13)1W~!Uxf*P01*714 z2(N?D^OJoy3!wN%Hk*HU$B}qj;dFAfAu_ z*md1B@0tyyI@#Ov0RX?$mvpo-DFz2`;YYd{lAVSoEtC{SE$pomR5wN3>d4bOH+R*L zNt1v;7g)6@qzPGj^SX0!aw2EzPc|mY)mY}FNuKB&+kB(xB5bHvANPxoiNP(^yKYWS zmFcM|KpS(=!He65E1RL;E?W|2r_XN~<_ik62^{@&C@n3OkT>!_BdunO zm2U4B=cK2j!)>stBVqI<(rz&APwt|&D^ohrCz7~TZn8sa_VD4u<810a_(q!E-CscW z7TZ=OgAA|ET4O3-gQ&y1Al7#kNh+1z#U;Sj7Ypd16{~FCl>jg-J2E`XVc2$O z#_>NemG2|r%e>|HgV(qCX}eltV0oZG!fGu=#*KX8&U*3w;#LkNH}aEB#sQ7^W%V=n zFIbQg1~D;g?Bh+G60w!Vw+Z+lWxxkwHb7Vx=|}4oiNQd&1A5UCA{T_zaTWxRe|5Oe zS2foAY1S4NcFxWu!SKYn`BCd;{Q$`*5vf}WFa>ZL(17pY;20rrG9_s`%1_2EfT_4{ zvc1=NVn%O1+2rE`{G*c-mzB1L2H5}!5mBpPZ~Z_! zp&Rw3lU9{V`s*Ng#*ZIAKyFFB2gGLP_w^ng9xl$#YHDh0R82y3bbi@&H8ra?+qAh? z!!wrWJS$h_3TxjOxwxDR+%rj%?{Umq{_Sx#|rOtLg5y7l03VB{s(g_iTZecU_4g8o zhKG4zqtUCgDkI}v5ZGYlb9(pjXI#tHz-e8^ndAFkf7}Ca6Kr*`M#X>x z69_9>RdL_Ceo<*(;`28DdR8Ge>kCY|nnYcFJiWn|S0L-g(;(d5af{6p%CC383vwPJ z!dNe@3l)Lr4*(wZ2vi-tetOqn_d2r&M>xQ46@4JWd6JXM8Z1Pq`U&8NfjnjAEjNZE z*3Fw_T7HqYMZreIr-}*+12FG&#>Phr7|r;8+Y>FXef6k6-FyIt>Gd>aXln2P?T)}qvRg5?^iIPykDMpRT(N>;0?s=$J3%=`SgSt6XmG3=oz za2cXyAXu|&SCy=0Wo1=bjgO6w6Dg{xjad~pn67w4G|y{M`$lfe)K%x^2FjTk8y}yY zdAPdbE4sSAAP|?7oG!By^#vm~JWp#bDB30<4b(p{r`JUB^Vhg z=6{du+LHgL=lW;!r5^R2yVtvP(EpbQ`;PeyKNxOcVDML;$y3b4Wv2*8lf#dzs^SLN z@Mi1eq$VrY_})wXfcu>yI1GaxdH--j;ZOgfg6BR+98BK>wVjV(M=a!(xIDZ_RR7(7 E0pGFg&Hw-a literal 0 HcmV?d00001 diff --git a/img/function_dec.png b/img/function_dec.png new file mode 100644 index 0000000000000000000000000000000000000000..0cabab0796cee44c3213407905c60047468aae6e GIT binary patch literal 5442 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 literal 0 HcmV?d00001 From ea06014d3403b576c2d1932447bb9a17ba478148 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Thu, 23 Mar 2017 13:12:44 +0800 Subject: [PATCH 070/379] update --- 3/function_implement.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/3/function_implement.md b/3/function_implement.md index acc77f5..13bf061 100644 --- a/3/function_implement.md +++ b/3/function_implement.md @@ -236,7 +236,9 @@ function my_function($a){ ``` 实际原始的opcode以及执行顺序: -![](function_dec.png) +![](../img/function_dec.png) + +类的情况也是如此,后面我们再作说明。 ### 3.2.2 内部函数 上一节已经提过,内部函数指的是由内核、扩展提供的C语言编写的function,这类函数不需要经历opcode的编译过程,所以效率上要高于PHP用户自定义的函数,调用时与普通的C程序没有差异。 From 535ac699e24c7cc49ccb59c1dd0015ba77ca98cb Mon Sep 17 00:00:00 2001 From: qinpeng Date: Thu, 23 Mar 2017 14:14:24 +0800 Subject: [PATCH 071/379] finish function --- 3/function_implement.md | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/3/function_implement.md b/3/function_implement.md index 13bf061..4458dec 100644 --- a/3/function_implement.md +++ b/3/function_implement.md @@ -240,6 +240,32 @@ function my_function($a){ 类的情况也是如此,后面我们再作说明。 +#### 3.2.1.4 匿名函数 +匿名函数(Anonymous functions),也叫闭包函数(closures),允许临时创建一个没有指定名称的函数。最经常用作回调函数(callback)参数的值。当然,也有其它应用的情况。 + +官网的示例: +```php +$greet = function($name) +{ + printf("Hello %s\r\n", $name); +}; + +$greet('World'); +$greet('PHP'); +``` +这里提函数函数只是想说明编译函数时那个use的用法: + +__匿名函数可以从父作用域中继承变量。 任何此类变量都应该用 use 语言结构传递进去。__ + +```php +$message = 'hello'; + +$example = function () use ($message) { + var_dump($message); +}; +$example(); +``` + ### 3.2.2 内部函数 上一节已经提过,内部函数指的是由内核、扩展提供的C语言编写的function,这类函数不需要经历opcode的编译过程,所以效率上要高于PHP用户自定义的函数,调用时与普通的C程序没有差异。 From 26bf1fc0119192b337bf567125526a06dc2efcb6 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Thu, 23 Mar 2017 15:50:36 +0800 Subject: [PATCH 072/379] update --- 3/zend_class.md | 75 +++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 72 insertions(+), 3 deletions(-) diff --git a/3/zend_class.md b/3/zend_class.md index cb0df1f..0b9fb7a 100644 --- a/3/zend_class.md +++ b/3/zend_class.md @@ -158,13 +158,15 @@ echo my_class::A1; ``` 唯一的不同就是常量的使用时机:示例1是在定义前使用的,示例2是在定义后使用的。我们都知道PHP变量无需提前声明,这俩会有什么不同呢? -事实上这两种情况内核会有两种不同的处理方式,示例2这种情况的处理与我们上面的猜测相同,而示例1则有另外一种处理方式:PHP代码的编译是顺序的,示例1的情况编译到`echo my_class::A1`这行时首先会尝试检索下是否已经编译了my_class,如果能在CG(class_table)中找到,则进一步从类的`contants_table`查找对应的常量,找到的话则会复制其value替换常量,简单的讲就是类似C语言中的宏,__编译时替换为实际的值了__,而不是在运行时再去检索。 +事实上这两种情况内核会有两种不同的处理方式,示例1这种情况的处理与我们上面的猜测相同,而示例2则有另外一种处理方式:PHP代码的编译是顺序的,示例2的情况编译到`echo my_class::A1`这行时首先会尝试检索下是否已经编译了my_class,如果能在CG(class_table)中找到,则进一步从类的`contants_table`查找对应的常量,找到的话则会复制其value替换常量,简单的讲就是类似C语言中的宏,__编译时替换为实际的值了__,而不是在运行时再去检索。 具体debug下上面两个例子会发现示例2的主要的opcode只有一个ZEND_ECHO,也就是直接输出值了,并没有设计类常量的查找,这就是因为编译的时候已经将 __my_class::A1__ 替换为 __hi__ 了,`echo my_class::A1;`等同于:`echo "hi";`;而示例1首先的操作则是ZEND_FETCH_CONSTANT,查找常量,接着才是ZEND_ECHO。 #### 3.4.1.3 成员属性 类的变量成员叫做“属性”。属性声明是由关键字 __public__,__protected__ 或者 __private__ 开头,然后跟一个普通的变量声明来组成,关于这三个关键字这里不作讨论,后面分析可见性的章节再作说明。 +> 【修饰符(public/private/protected/static)】【成员属性名】= 【属性默认值】; + 属性中的变量可以初始化,但是初始化的值必须是常数,这里的常数是指 PHP 脚本在编译阶段时就可以得到其值,而不依赖于运行时的信息才能求值,比如`public $time = time();`这样定义一个属性就会触发语法错误。 成员属性又分为两类:__普通属性__、__静态属性__。静态属性通过 __static__ 声明,通过 __self::$property__ 或 __类名::$property__ 访问;普通属性通过 __$this->property__ 或 __$object->property__ 访问。 @@ -184,7 +186,7 @@ class my_class { 看到这里可能有个疑问:使用时成员属性是如果找到的呢? -实际只是成员属性的 __VALUE__ 通过数组存储的,访问时仍然是根据以"属性名"为索引的散列表查找具体VALUE的,这个散列表并没有按照普通属性、静态属性分为两个,而是只用了一个:__HashTable properties_info__ 。此哈希表存储元素的value类型为__zend_property_info__ 。 +实际只是成员属性的 __VALUE__ 通过数组存储的,访问时仍然是根据以"属性名"为索引的散列表查找具体VALUE的,这个散列表并没有按照普通属性、静态属性分为两个,而是只用了一个:__HashTable properties_info__ 。此哈希表存储元素的value类型为 __zend_property_info__ 。 ```c typedef struct _zend_property_info { @@ -203,7 +205,7 @@ typedef struct _zend_property_info { #define ZEND_ACC_STATIC 0x01 ``` -* __offset__:这个值记录的就是上面说的通过数组保存的属性值的索引,也就是说属性值保存在一个数组中,然后将其在数组中的位置保存在offset中,另外需要说明的一点的是普通属性、静态属性这个值用法是不一样的,静态属性是类的范畴,与对象无关,所以其offset为default_static_members_table数组的下标:0,、1、2......,而普通属性归属于对象,每个对象有其各自的属性,所以这个offset记录的实际是各属性在object中偏移值(在后面《3.4.2 对象》一节我们再具体说明普通属性的存储方式),其值是:40、56、72......是按照zval的内存大小偏移的 +* __offset__:这个值记录的就是上面说的通过数组保存的属性值的索引,也就是说属性值保存在一个数组中,然后将其在数组中的位置保存在offset中,另外需要说明的一点的是普通属性、静态属性这个值用法是不一样的,静态属性是类的范畴,与对象无关,所以其offset为default_static_members_table数组的下标:0,、1、2......,而普通属性归属于对象,每个对象有其各自的属性,所以这个offset记录的实际是 __各属性在object中偏移值__ (在后面《3.4.2 对象》一节我们再具体说明普通属性的存储方式),其值是:40、56、72......是按照zval的内存大小偏移的 * __flags__:bit位,标识的是属性的信息,如public、private、protected及是否为静态属性 所以访问成员属性时首先是根据属性名查找到此属性的存储位置,然后再进一步获取属性值。 @@ -230,6 +232,9 @@ class my_class { ![zend_class_function](../img/zend_class_function.png) +> 成员方法的定义: +> 【修饰符(public/private/protected/static/abstruct/final)】function 【&】【成员方法名】(【参数列表】)【返回值类型】{【成员方法】}; + 成员方法也有静态、非静态之分,静态方法中不能使用$this,因为其操作的作用域全部都是类的而不是对象的,而非静态方法中可以通过$this访问属于本对象的成员属性。 静态方法也是通过static关键词定义: @@ -251,3 +256,67 @@ my_class::$method(); 成员方法的调用与普通function过程基本相同,根据对象所属类或直接根据类取到method的zend_function,然后执行,具体的过程[《3.3 Zend引擎执行过程》](zend_executor.md)已经详细说过,这里不再重复。 +#### 3.4.1.5 类的编译 +前面我们先介绍了类的相关组成部分,接下来我们从一个例子简单看下类的编译过程。 + +```php +//示例 +class Human { + public $aa = array(1,2,3); +} + +class User extends Human +{ + const type = 110; + + static $name = "uuu"; + public $uid = 900; + public $sex = 'w'; + + public function __construct(){ + } + + public function getName(){ + return $this->name; + } +} +``` +类的定义组成部分: + +【修饰符(abstract/final)】 class 【类名】 【extends 父类】 【implements 接口1,接口2】 {} + +语法规则为: +```c +class_declaration_statement: + class_modifiers T_CLASS { $$ = CG(zend_lineno); } + T_STRING extends_from implements_list backup_doc_comment '{' class_statement_list '}' + { $$ = zend_ast_create_decl(ZEND_AST_CLASS, $1, $3, $7, zend_ast_get_str($4), $5, $6, $9, NULL); } + | T_CLASS { $$ = CG(zend_lineno); } + T_STRING extends_from implements_list backup_doc_comment '{' class_statement_list '}' + { $$ = zend_ast_create_decl(ZEND_AST_CLASS, 0, $2, $6, zend_ast_get_str($3), $4, $5, $8, NULL); } +; + +//整个类内为list,每个成员属性、成员方法都是一个子节点 +class_statement_list: + class_statement_list class_statement + { $$ = zend_ast_list_add($1, $2); } + | /* empty */ + { $$ = zend_ast_create_list(0, ZEND_AST_STMT_LIST); } +; + +//类内语法规则:成员属性、成员方法 +class_statement: + variable_modifiers property_list ';' + { $$ = $2; $$->attr = $1; } + | T_CONST class_const_list ';' + { $$ = $2; RESET_DOC_COMMENT(); } + | T_USE name_list trait_adaptations + { $$ = zend_ast_create(ZEND_AST_USE_TRAIT, $2, $3); } + | method_modifiers function returns_ref identifier backup_doc_comment '(' parameter_list ')' + return_type method_body + { $$ = zend_ast_create_decl(ZEND_AST_METHOD, $3 | $1, $2, $5, + zend_ast_get_str($4), $7, NULL, $10, $9); } +; +``` + + From 83d1434dfc9ee4ad335eb971e8063090c5c465f4 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Thu, 23 Mar 2017 18:58:36 +0800 Subject: [PATCH 073/379] update --- 3/zend_class.md | 70 ++++++++++++++++++++++++++++++++++++++++++++-- img/ast_class.png | Bin 0 -> 79554 bytes 2 files changed, 67 insertions(+), 3 deletions(-) create mode 100644 img/ast_class.png diff --git a/3/zend_class.md b/3/zend_class.md index 0b9fb7a..75a0bf3 100644 --- a/3/zend_class.md +++ b/3/zend_class.md @@ -233,6 +233,7 @@ class my_class { ![zend_class_function](../img/zend_class_function.png) > 成员方法的定义: + > 【修饰符(public/private/protected/static/abstruct/final)】function 【&】【成员方法名】(【参数列表】)【返回值类型】{【成员方法】}; 成员方法也有静态、非静态之分,静态方法中不能使用$this,因为其操作的作用域全部都是类的而不是对象的,而非静态方法中可以通过$this访问属于本对象的成员属性。 @@ -257,7 +258,7 @@ my_class::$method(); 成员方法的调用与普通function过程基本相同,根据对象所属类或直接根据类取到method的zend_function,然后执行,具体的过程[《3.3 Zend引擎执行过程》](zend_executor.md)已经详细说过,这里不再重复。 #### 3.4.1.5 类的编译 -前面我们先介绍了类的相关组成部分,接下来我们从一个例子简单看下类的编译过程。 +前面我们先介绍了类的相关组成部分,接下来我们从一个例子简单看下类的编译过程,这个过程最终的产物就是zend_class_entry。 ```php //示例 @@ -281,9 +282,9 @@ class User extends Human } } ``` -类的定义组成部分: +> 类的定义组成部分: -【修饰符(abstract/final)】 class 【类名】 【extends 父类】 【implements 接口1,接口2】 {} +> 【修饰符(abstract/final)】 class 【类名】 【extends 父类】 【implements 接口1,接口2】 {} 语法规则为: ```c @@ -318,5 +319,68 @@ class_statement: zend_ast_get_str($4), $7, NULL, $10, $9); } ; ``` +生成的抽象语法树: + +![](../img/ast_class.png) + +类的语法树根节点为ZEND_AST_CLASS,此节点有3个子节点:继承子节点、实现接口子节点、类中声明表达式节点,其中child[2](即类中声明表达式节点)为zend_ast_list,每个常量定义、成员属性、成员方法对应一个节点,比如上面的例子中user类有6个子节点,这些子节点类型有3类:常量声明(ZEND_AST_CLASS_CONST_DECL)、属性声明(ZEND_AST_PROP_DECL)、方法声明(ZEND_AST_METHOD)。 + +编译为opcodes操作为:`zend_compile_class_decl()`,它的输入就是ZEND_AST_CLASS节点,这个函数中再针对常量、属性、方法、继承、接口等分别处理。 +```c +void zend_compile_class_decl(zend_ast *ast) +{ + zend_ast_decl *decl = (zend_ast_decl *) ast; + zend_ast *extends_ast = decl->child[0]; //继承类节点,zen_ast_zval节点,存的是父类名 + zend_ast *implements_ast = decl->child[1]; //实现接口节点 + zend_ast *stmt_ast = decl->child[2]; //类中声明的常量、属性、方法 + zend_string *name, *lcname; + zend_class_entry *ce = zend_arena_alloc(&CG(arena), sizeof(zend_class_entry)); + zend_op *opline; + ... + + lcname = zend_new_interned_string(lcname); + + ce->type = ZEND_USER_CLASS; //类型为用户自定义类 + ce->name = name; //类名 + zend_initialize_class_data(ce, 1); + ... + if (extends_ast) { + ... + zend_compile_class_ref(&extends_node, extends_ast, 0); + } + + //在当前父空间生成一条opcode + opline = get_next_op(CG(active_op_array)); + zend_make_var_result(&declare_node, opline); + ... + opline->op2_type = IS_CONST; + LITERAL_STR(opline->op2, lcname); + + if (decl->flags & ZEND_ACC_ANON_CLASS) { + //暂不清楚这种情况 + }else{ + zend_string *key; + + if (extends_ast) { + opline->opcode = ZEND_DECLARE_INHERITED_CLASS; //有继承的类为这个opcode + opline->extended_value = extends_node.u.op.var; + } else { + opline->opcode = ZEND_DECLARE_CLASS; //无继承的类为这个opcode + } + + key = zend_build_runtime_definition_key(lcname, decl->lex_pos); //这个key并不是类名,而是:类名+file+lex_pos + + opline->op1_type = IS_CONST; + LITERAL_STR(opline->op1, key);//将这个临时key保存到操作数1中 + + zend_hash_update_ptr(CG(class_table), key, ce); //将半成品的zend_class_entry插入CG(class_table),注意这里并不是执行时用于索引类的,它的key不是类名!!! + } + CG(active_class_entry) = ce; + zend_compile_stmt(stmt_ast); + ... + + CG(active_class_entry) = original_ce; +} +``` diff --git a/img/ast_class.png b/img/ast_class.png new file mode 100644 index 0000000000000000000000000000000000000000..acbed73d7e1b056a6e8aeae7eb039b41ffe1d989 GIT binary patch literal 79554 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�=|{O#<@7!RqY|ugc%U@sA$4=bqCH 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 literal 0 HcmV?d00001 From de761dfc78441a9de839419e774de8bfb87d8c3a Mon Sep 17 00:00:00 2001 From: qinpeng Date: Thu, 23 Mar 2017 20:27:56 +0800 Subject: [PATCH 074/379] update class --- 3/zend_class.md | 86 +++++++++++++++++++++++++++++++++++++++- img/zend_class_init.png | Bin 0 -> 52964 bytes 2 files changed, 85 insertions(+), 1 deletion(-) create mode 100644 img/zend_class_init.png diff --git a/3/zend_class.md b/3/zend_class.md index 75a0bf3..8b12c8c 100644 --- a/3/zend_class.md +++ b/3/zend_class.md @@ -376,11 +376,95 @@ void zend_compile_class_decl(zend_ast *ast) zend_hash_update_ptr(CG(class_table), key, ce); //将半成品的zend_class_entry插入CG(class_table),注意这里并不是执行时用于索引类的,它的key不是类名!!! } CG(active_class_entry) = ce; - zend_compile_stmt(stmt_ast); + zend_compile_stmt(stmt_ast); //将常量、成员属性、方法编译到CG(active_class_entry)中 ... CG(active_class_entry) = original_ce; } ``` +上面这个过程主要操作是新分配一个zend_class_entry,如果有继承的话首先生成一条ZEND_FETCH_CLASS的opcode,然后生成一条类声明的opcode(这个地方与之前3.2.1.3节介绍函数的编译时相同),接着就是编译常量、属性、成员方法到新分配的zend_class_entry中,这个过程还有一个容易误解的地方:将生成的zend_class_entry插入到CG(class_table)哈希表中,这个操作这是中间步骤,它的key并不是类名,而是类名后面带来一长串其它的字符,也就是这个时候通过类名在class_table是索引不到对应类的,后面我们会说明这样处理的作用。 + +Human类情况比较简单,不再展开,我们看下User类在`zend_compile_class_decl()`中执行到`zend_compile_stmt(stmt_ast)`这步时关键数据结构: + +![](../img/zend_class_init.png) + +接下来我们分别看下常量、成员属性、方法的编译过程。 + +__(1)常量编译__ + +常量的节点类型为:`ZEND_AST_CLASS_CONST_DECL`,每个常量对应一个这样的节点,处理函数为:`zend_compile_class_const_decl()`: +```c +void zend_compile_class_const_decl(zend_ast *ast) +{ + zend_ast_list *list = zend_ast_get_list(ast); + zend_class_entry *ce = CG(active_class_entry); + uint32_t i; + + for (i = 0; i < list->children; ++i) { //不清楚这个地方为什么要用list,试了几个例子这个节点都只有一个child,即for只循环一次 + zend_ast *const_ast = list->child[i]; + zend_ast *name_ast = const_ast->child[0]; //常量名节点 + zend_ast *value_ast = const_ast->child[1];//常量值节点 + zend_string *name = zend_ast_get_str(name_ast); //常量名 + zval value_zv; + + //取出常量值 + zend_const_expr_to_zval(&value_zv, value_ast); + + name = zend_new_interned_string_safe(name); + //将常量添加到zend_class_entry.constants_table哈希表中 + if (zend_hash_add(&ce->constants_table, name, &value_zv) == NULL) { + ... + } + ... + } +} +``` +__(2)属性编译__ + +属性节点类型为:`ZEND_AST_PROP_DECL`,对应的处理函数:`zend_compile_prop_decl()`: +```c +void zend_compile_prop_decl(zend_ast *ast) +{ + zend_ast_list *list = zend_ast_get_list(ast); + uint32_t flags = list->attr; //属性修饰符:static、public、private、protected + zend_class_entry *ce = CG(active_class_entry); + uint32_t i, children = list->children; + + //也不清楚这里为啥用循环,测试的情况child只有一个 + for (i = 0; i < children; ++i) { + zend_ast *prop_ast = list->child[i]; //这个节点类型为:ZEND_AST_PROP_ELEM + zend_ast *name_ast = prop_ast->child[0]; //属性名节点 + zend_ast *value_ast = prop_ast->child[1]; //属性值节点 + zend_ast *doc_comment_ast = prop_ast->child[2]; + zend_string *name = zend_ast_get_str(name_ast); //属性名 + zend_string *doc_comment = NULL; + zval value_zv; + ... + //检查该属性是否在当前类中已经定义 + if (zend_hash_exists(&ce->properties_info, name)) { + zend_error_noreturn(...); + } + if (value_ast) { + //取出默认值 + zend_const_expr_to_zval(&value_zv, value_ast); + } else { + //默认值为null + ZVAL_NULL(&value_zv); + } + + name = zend_new_interned_string_safe(name); + //保存属性 + zend_declare_property_ex(ce, name, &value_zv, flags, doc_comment); + } +} + +//zend_API.c +ZEND_API int zend_declare_property_ex(zend_class_entry *ce, zend_string *name, zval *property, int access_type,...) +{ +} +``` +__(3)方法编译__ + + diff --git a/img/zend_class_init.png b/img/zend_class_init.png new file mode 100644 index 0000000000000000000000000000000000000000..c552ab299aff9122b90519f756c2315299121bb7 GIT binary patch literal 52964 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

EUs#SDJuIRmktg2;8G|x9%q!h`28WqSOG$6t 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 literal 0 HcmV?d00001 From 2cd571712933672c1783b061255b7b9c0ec026e3 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Fri, 24 Mar 2017 12:11:54 +0800 Subject: [PATCH 075/379] update --- 3/zend_class.md | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/3/zend_class.md b/3/zend_class.md index 8b12c8c..f8b034d 100644 --- a/3/zend_class.md +++ b/3/zend_class.md @@ -458,12 +458,50 @@ void zend_compile_prop_decl(zend_ast *ast) zend_declare_property_ex(ce, name, &value_zv, flags, doc_comment); } } +``` +开始的时候我们已经介绍:属性值是通过 __数组__ 保存的,然后其存储位置通过以 __属性名__ 为key的哈希表保存,使用的时候先从这个哈希表中找到属性信息同时得到属性值的保存位置,然后再进一步取出属性值。 +`zend_declare_property_ex()`这步操作就是来确定属性的存储位置的,它将属性值按静态、非静态分别保存在default_static_members_table、default_properties_table两个数组中,同时将其存储位置保存到属性结构的offset中。 +```c //zend_API.c ZEND_API int zend_declare_property_ex(zend_class_entry *ce, zend_string *name, zval *property, int access_type,...) { + zend_property_info *property_info, *property_info_ptr; + + if (ce->type == ZEND_INTERNAL_CLASS) {//内部类 + ... + }else{ + property_info = zend_arena_alloc(&CG(arena), sizeof(zend_property_info)); + } + + if (access_type & ZEND_ACC_STATIC) { + //静态属性 + ... + property_info->offset = ce->default_static_members_count++; //分配属性编号,同变量一样,静态属性的就是数组索引 + ce->default_static_members_table = perealloc(ce->default_static_members_table, sizeof(zval) * ce->default_static_members_count, ce->type == ZEND_INTERNAL_CLASS); + + ZVAL_COPY_VALUE(&ce->default_static_members_table[property_info->offset], property); + if (ce->type == ZEND_USER_CLASS) { + ce->static_members_table = ce->default_static_members_table; + } + }else{ + //非静态属性 + ... + //非静态属性值存储在对象中,所以与静态属性不同,它的offset并不是default_properties_table数组索引 + //而是相对于zend_object大小的(因为普通属性值数组保存在zend_object结构之后,这个与局部变量、zend_execute_data关系一样) + property_info->offset = OBJ_PROP_TO_OFFSET(ce->default_properties_count); + ce->default_properties_count++; + ce->default_properties_table = perealloc(ce->default_properties_table, sizeof(zval) * ce->default_properties_count, ce->type == ZEND_INTERNAL_CLASS); + + ZVAL_COPY_VALUE(&ce->default_properties_table[OBJ_PROP_TO_NUM(property_info->offset)], property); + } + + //设置property_info其它的一些值 + ... } ``` +这个操作中重点是offset的计算方式,静态属性这个比较好理解,就是default_static_members_table数组索引;非静态属性zend_class_entry.default_properties_table保存的只是默认属性值,我们在下>一篇介绍对象时再具体说明object、class之间属性的存储关系。 + __(3)方法编译__ From 42d21e3fde8ccce5d42aac52a943527b2a9e3cf5 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Fri, 24 Mar 2017 16:26:24 +0800 Subject: [PATCH 076/379] finish zend class --- 3/zend_class.md | 180 +++++++++++++++++++++++++++++++++++++++- img/ast_fetch_class.png | Bin 0 -> 21170 bytes img/zend_ast_class.png | Bin 0 -> 78639 bytes 3 files changed, 178 insertions(+), 2 deletions(-) create mode 100644 img/ast_fetch_class.png create mode 100644 img/zend_ast_class.png diff --git a/3/zend_class.md b/3/zend_class.md index f8b034d..17dfaa4 100644 --- a/3/zend_class.md +++ b/3/zend_class.md @@ -346,6 +346,7 @@ void zend_compile_class_decl(zend_ast *ast) ... if (extends_ast) { ... + //有继承的父类则首先生成一条ZEND_FETCH_CLASS的opcode zend_compile_class_ref(&extends_node, extends_ast, 0); } @@ -500,9 +501,184 @@ ZEND_API int zend_declare_property_ex(zend_class_entry *ce, zend_string *name, z ... } ``` -这个操作中重点是offset的计算方式,静态属性这个比较好理解,就是default_static_members_table数组索引;非静态属性zend_class_entry.default_properties_table保存的只是默认属性值,我们在下>一篇介绍对象时再具体说明object、class之间属性的存储关系。 +这个操作中重点是offset的计算方式,静态属性这个比较好理解,就是default_static_members_table数组索引;非静态属性zend_class_entry.default_properties_table保存的只是默认属性值,我们在下一篇介绍对象时再具体说明object、class之间属性的存储关系。 -__(3)方法编译__ +__(3)成员方法编译__ +3.4.1.4一节已经介绍过成员方法与普通函数的关系,两者没有很大的区别,实现上是相同,不同的地方在于成员方法保存在各zend_class_entry中,调用时会有一些可见性方面的限制,如private、public、protected,还有一些专有用法,比如this、self等,但在编译、执行、存储结构等方面两者基本是一致的。 +成员方法的语法树根节点为`ZEND_AST_METHOD`: +```c +void zend_compile_stmt(zend_ast *ast) +{ + ... + switch (ast->kind) { + ... + case ZEND_AST_FUNC_DECL: //函数 + case ZEND_AST_METHOD: //成员方法 + zend_compile_func_decl(NULL, ast); + break; + ... + } +} +``` +如果你还记得3.2.1.3函数处理的过程就会发现函数、成员方法的编译是同一个函数:`zend_compile_func_decl()`。 +```c +void zend_compile_func_decl(znode *result, zend_ast *ast) +{ + //参数、函数内语法编译等不看了,与函数的相同,不清楚请看3.2.1.3节 + ... + + if (is_method) { + zend_bool has_body = stmt_ast != NULL; + zend_begin_method_decl(op_array, decl->name, has_body); + } else { + //函数是在当前空间生成了一条ZEND_DECLARE_FUNCTION的opcode + //然后在zend_do_early_binding()中"执行"了这条opcode,即将函数添加到CG(function_table) + zend_begin_func_decl(result, op_array, decl); + } + ... +} +``` +这个过程之前已经说过,这里不再重复,我们只看下与普通函数处理不同的地方:`zend_begin_method_decl()`,它的工作也比较简单,最重要的一个地方就是将成员方法的zend_op_array插入 __zend_class_entry.function_table__。 +```c +void zend_begin_method_decl(zend_op_array *op_array, zend_string *name, zend_bool has_body) +{ + zend_class_entry *ce = CG(active_class_entry); + ... + + op_array->scope = ce; + op_array->function_name = zend_string_copy(name); + + lcname = zend_string_tolower(name); + lcname = zend_new_interned_string(lcname); + + //插入类的function_table中 + if (zend_hash_add_ptr(&ce->function_table, lcname, op_array) == NULL) { + zend_error_noreturn(..); + } + + //后面主要是设置一些构造函数、析构函数、魔法函数指针,以及其它一些可见性、静态非静态的检查 + ... +} +``` + +上面我们分别介绍了常量、成员属性、方法的编译过程,最后再用一张图总结下整个类的编译过程: + +![](../img/zend_ast_class.png) + +图中还有一步我们没有说到:__zend_do_early_binding()__ ,这是非常关键的一步,如果你看过3.2.1.3一节那么对这个函数应该不陌生,没错,在函数编译的最后一步也会调用这个函数,它的作用是将编译的function以函数名为key添加到CG(function_table)中,同样地上面整个过程中你可能发现所有的操作都是针对zend_class_entry,并没有发现最后把它存到什么位置了,这最后的一步就是把zend_class_entry以类名为key添加到CG(class_table)。 + +```c +void zend_do_early_binding(void) +{ + ... + switch (opline->opcode) { + ... + case ZEND_DECLARE_CLASS: + if (do_bind_class(CG(active_op_array), opline, CG(class_table), 1) == NULL) { + return; + } + table = CG(class_table); + break; + case ZEND_DECLARE_INHERITED_CLASS: + //比较长,后面单独摘出来 + break; + } + + //将那个以(类名+file+lex_pos)为key的值从CG(class_table)中删除 + //同时删除两个相关的literals:key、类名 + zend_hash_del(table, Z_STR_P(CT_CONSTANT(opline->op1))); + zend_del_literal(CG(active_op_array), opline->op1.constant); + zend_del_literal(CG(active_op_array), opline->op2.constant); + MAKE_NOP(opline); //将ZEND_DECLARE_CLASS或ZEND_DECLARE_INHERITED_CLASS的opcode置为空,表示已执行 +} +``` +这个地方会有两种情况,上面我们说过,如果是普通的没有继承的类定义会生成一条`ZEND_DECLARE_CLASS`的opcode,而有继承的类则会生成`ZEND_FETCH_CLASS`、`ZEND_DECLARE_INHERITED_CLASS`两条opcode,这两种有很大的不同,接下来我们具体看下: + +> __(1)无继承类:__ 这种情况直接调用`do_bind_class()`处理了。 +```c +ZEND_API zend_class_entry *do_bind_class( + const zend_op_array* op_array, + const zend_op *opline, + HashTable *class_table, + zend_bool compile_time) +{ + if (compile_time) { //编译时 + //还记得zend_compile_class_decl()中有一个把zend_class_entry以(类名+file+lex_pos) + //为key存入CG(class_table)的操作吗?那个key的存储位置保存在op1中了 + //这里就是从op_array.literals中取出那个key + op1 = CT_CONSTANT_EX(op_array, opline->op1.constant); + //op2为类名 + op2 = CT_CONSTANT_EX(op_array, opline->op2.constant); + } else { //运行时,如果当前类在编译阶段没有编译完成则也有可能在zend_execute执行阶段完成 + op1 = RT_CONSTANT(op_array, opline->op1); + op2 = RT_CONSTANT(op_array, opline->op2); + } + //从CG(class_table)中取出zend_class_entry + if ((ce = zend_hash_find_ptr(class_table, Z_STR_P(op1))) == NULL) { + zend_error_noreturn(E_COMPILE_ERROR, ...); + return NULL; + } + ce->refcount++; //这里加1是因为CG(class_table)中多了一个bucket指向这个ce了 + + //以标准类名为key将zend_class_entry插入CG(class_table) + //这才是后面要用到的类 + if (zend_hash_add_ptr(class_table, Z_STR_P(op2), ce) == NULL) { + //插入失败 + return NULL; + }else{ + //插入成功 + return ce; + } +} +``` +> 这个函数就是将类以 __正确的类名__ 为key插入到CG(class_table),这一步完成后`zend_do_early_binding()`后面就将`ZEND_DECLARE_CLASS`这条opcode置为0了,这样在运行时就直接跳过此opcode了,现在清楚为什么执行时会有很多为0的opcode了吧? + +> __(2)有继承类:__ 这种类是有继承的父类,它的定义有两条opcode:`ZEND_FETCH_CLASS`、`ZEND_DECLARE_INHERITED_CLASS`,上面我们一张图画过示例中user类编译的情况,我们先看下它的opcode再作说明。 + +![](../img/ast_fetch_class.png) + +```c +case ZEND_DECLARE_INHERITED_CLASS: +{ + zend_op *fetch_class_opline = opline-1; + zval *parent_name; + zend_class_entry *ce; + + parent_name = CT_CONSTANT(fetch_class_opline->op2); //父类名 + + //在EG(class_table)中查找父类(注意:EG(class_table)与CG(class_table)指向同一个位置) + if (((ce = zend_lookup_class_ex(Z_STR_P(parent_name), parent_name + 1, 0)) == NULL) || ...) { + //没找到父类,有可能父类没有定义、有可能父类在子类之后定义的...... + if (CG(compiler_options) & ZEND_COMPILE_DELAYED_BINDING) { + uint32_t *opline_num = &CG(active_op_array)->early_binding; + + while (*opline_num != (uint32_t)-1) { + opline_num = &CG(active_op_array)->opcodes[*opline_num].result.opline_num; + } + *opline_num = opline - CG(active_op_array)->opcodes; + opline->opcode = ZEND_DECLARE_INHERITED_CLASS_DELAYED; + opline->result_type = IS_UNUSED; + opline->result.opline_num = -1; + } + return; + } + if (do_bind_inherited_class(CG(active_op_array), opline, CG(class_table), ce, 1) == NULL) { + return; + } + + //清理无用的opcode:ZEND_FETCH_CLASS + zend_del_literal(CG(active_op_array), fetch_class_opline->op2.constant); + MAKE_NOP(fetch_class_opline); + + table = CG(class_table); + break; +} +``` +> 通过上面的处理我们可以看到,首先是查找父类: + +>> 1)如果父类没有找到则将opcode置为`ZEND_DECLARE_INHERITED_CLASS_DELAYED`,这种情况下当前类是没有编译到CG(class_table)中去的,也就是这个时候这个类是无法使用的,在执行的时候会再次尝试这个过程,那个时候如果找到父类了则再加入EG(class_table); + +>> 2)如果找到父类了则与无继承的类处理一样,将zend_class_entry添加到CG(class_table)中,然后将对应的两条opcode删掉,除了这个外还有一个非常重要的操作:`zend_do_inheritance()`,这里主要是进行属性、常量、成员方法的合并、拷贝,这个过程这里暂不展开,《3.4.3继承》一节再作具体说明。 diff --git a/img/ast_fetch_class.png b/img/ast_fetch_class.png new file mode 100644 index 0000000000000000000000000000000000000000..dddd00c4cbd0508ad4696bb90656f46cf5499934 GIT binary patch literal 21170 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 literal 0 HcmV?d00001 From d59a6ef5c93feca69d5ed7884f218d16287a887f Mon Sep 17 00:00:00 2001 From: qinpeng Date: Fri, 24 Mar 2017 17:19:10 +0800 Subject: [PATCH 077/379] finish class --- 3/zend_class.md | 59 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/3/zend_class.md b/3/zend_class.md index 17dfaa4..307c075 100644 --- a/3/zend_class.md +++ b/3/zend_class.md @@ -681,4 +681,63 @@ case ZEND_DECLARE_INHERITED_CLASS: >> 2)如果找到父类了则与无继承的类处理一样,将zend_class_entry添加到CG(class_table)中,然后将对应的两条opcode删掉,除了这个外还有一个非常重要的操作:`zend_do_inheritance()`,这里主要是进行属性、常量、成员方法的合并、拷贝,这个过程这里暂不展开,《3.4.3继承》一节再作具体说明。 +__总结:__ + +上面我们介绍了类的编译过程,整个流程东西比较但并不复杂,主要围绕zend_class_entry进行的操作,另外我们知道了类插入EG(class_table)的过程,这个相当于类的声明在编译阶段提前"执行"了,也有可能因为父类找不到等原因延至运行时执行,清楚了这个过程你应该能明白下面这些例子为什么有的可以运行而有的则报错的原因了吧? + +```php +//情况1 +new A(); + +class A extends B{} +class B{} + +=================== +完整opcodes: +1 ZEND_NEW => 执行到这报错,因为此时A因为找不到B尚未编译进EG(class_table) +2 ZEND_DO_FCALL +3 ZEND_FETCH_CLASS +4 ZEND_DECLARE_INHERITED_CLASS +5 ZEND_DECLARE_CLASS => 注册class B +6 ZEND_RETURN + +实际执行顺序:5->1->2->3->4->6 +``` +```php +//情况2 +class A extends B{} +class B{} + +new A(); +=================== +完整opcodes: +1 ZEND_FETCH_CLASS +2 ZEND_DECLARE_INHERITED_CLASS => 注册class A,此时已经可以找到B +3 ZEND_DECLARE_CLASS => 注册class B +4 ZEND_NEW +5 ZEND_DO_FCALL +6 ZEND_RETURN + +实际执行顺序:3->1->2->4->5->6,执行到4时A都已经注册,所以可以执行 +``` +```php +//情况3 +class A extends B{} +class B extends C{} +class C{} + +new A(); +=================== +完整opcodes: +1 ZEND_FETCH_CLASS => 找不到B,直接报错 +2 ZEND_DECLARE_INHERITED_CLASS +3 ZEND_FETCH_CLASS +4 ZEND_DECLARE_INHERITED_CLASS => 注册class B,此时可以找到C,所以注册成功 +5 ZEND_DECLARE_CLASS => 注册class C +6 ZEND_NEW +7 ZEND_DO_FCALL +8 ZEND_RETURN + +实际执行顺序:5->1->2->3->4->5->6->7->8,执行到1发现还是找不到父类B,报错 +``` From 86991d34d649f7c0026a216332b91a00cf6beed9 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Fri, 24 Mar 2017 17:40:27 +0800 Subject: [PATCH 078/379] update --- README.md | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 52171ea..06f8229 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,8 @@ # PHP7内核剖析 - (更新中...) - 文中涉及代码版本:php-7.0.12 +## 目录: * 第1章 PHP基本架构 * 1.1 基本概念(1/base_introduction.md) * [1.2 PHP框架执行流程](1/base_process.md) @@ -40,3 +39,10 @@ * [5.1 Zend内存池](5/zend_alloc.md) * 5.2 垃圾回收(gc.md) * 第6章 扩展开发 + +## 反馈 +[交流&扯淡](https://github.com/pangudashu/php7-internal/issues/3) + +[错误反馈](https://github.com/pangudashu/php7-internal/issues/2) + + From 09a1f394b85774ef403198ebe354d60d023c92b2 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Sat, 25 Mar 2017 17:55:19 +0800 Subject: [PATCH 079/379] update object --- 3/zend_object.md | 151 ++++++++++++++++++++++++++++++++++++++++++ img/object_new_op.png | Bin 0 -> 13390 bytes 2 files changed, 151 insertions(+) create mode 100644 img/object_new_op.png diff --git a/3/zend_object.md b/3/zend_object.md index 3feb2a3..405e4cf 100644 --- a/3/zend_object.md +++ b/3/zend_object.md @@ -1 +1,152 @@ ### 3.4.2 对象 +对象是类的实例,PHP中要创建一个类的实例,必须使用 new 关键字。类应在被实例化之前定义(某些情况下则必须这样,比如3.4.1最后那几个例子)。 + +#### 3.4.2.1 对象的数据结构 +对象的数据结构非常简单: +```c +typedef struct _zend_object zend_object; + +struct _zend_object { + zend_refcounted_h gc; //引用计数 + uint32_t handle; + zend_class_entry *ce; //所属类 + const zend_object_handlers *handlers; //对象的一些操作接口 + HashTable *properties; + zval properties_table[1]; //普通属性值数组 +}; + +``` +几个主要的成员: +__(1)ce:__ 所属类 + +__(2)handlers:__ 这个保存的对象相关操作的一些函数指针,比如成员属性的读写、成员方法的获取、对象的销毁/克隆等等,这些操作接口都有默认的函数。 +```c +struct _zend_object_handlers { + int offset; + zend_object_free_obj_t free_obj; //释放对象 + zend_object_dtor_obj_t dtor_obj; //销毁对象 + zend_object_clone_obj_t clone_obj;//复制对象 + + zend_object_read_property_t read_property; //读取成员属性 + zend_object_write_property_t write_property;//修改成员属性 + ... +} + +//默认值处理handler +ZEND_API zend_object_handlers std_object_handlers = { + 0, + zend_object_std_dtor, /* free_obj */ + zend_objects_destroy_object, /* dtor_obj */ + zend_objects_clone_obj, /* clone_obj */ + zend_std_read_property, /* read_property */ + zend_std_write_property, /* write_property */ + ... +} +``` +__(3):__ + +#### 3.4.2.2 对象的创建 +PHP中通过`new + 类名`创建一个类的实例,我们从一个例子分析下对象创建的过程中都有哪些操作。 + +```php +class my_class +{ + const TYPE = 90; + public $name = "pangudashu"; +} + +$obj = new my_class(); +``` +类的定义就不用再说了,我们只看`$obj = new my_class();`这一句,这条语句包括两部分:实例化类、赋值,下面看下实例化类的语法规则: +```c +new_expr: + T_NEW class_name_reference ctor_arguments + { $$ = zend_ast_create(ZEND_AST_NEW, $2, $3); } + | T_NEW anonymous_class + { $$ = $2; } +; +``` +从语法规则可以很直观的看出此语法的两个主要部分:类名、参数列表,编译器在解析到实例化类时就创建一个`ZEND_AST_NEW`类型的节点,后面编译为opcodes的过程我们不再细究,这里直接看下最终生成的opcodes。 + +![](../img/object_new_op.png) + +你会发现实例化类产生了两条opcode(实际可能还会更多):ZEND_NEW、ZEND_DO_FCALL,除了创建对象的操作还有一条函数调用的,没错,那条就是调用`构造方法`的操作。 + +根据opcode、操作数类型可知`ZEND_NEW`对应的处理handler为`ZEND_NEW_SPEC_CONST_HANDLER()`: +```c +static int ZEND_NEW_SPEC_CONST_HANDLER(zend_execute_data *execute_data) +{ + zval object_zval; + zend_function *constructor; + zend_class_entry *ce; + ... + //第1步:根据类名查找zend_class_entry + ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op1)), ...); + ... + //第2步:创建&初始化一个这个类的对象 + if (UNEXPECTED(object_init_ex(&object_zval, ce) != SUCCESS)) { + HANDLE_EXCEPTION(); + } + //第3步:获取构造方法 + //获取构造方法函数,实际就是直接取zend_class_entry.constructor + //get_constructor => zend_std_get_constructor() + constructor = Z_OBJ_HT(object_zval)->get_constructor(Z_OBJ(object_zval)); + + if (constructor == NULL) { + ... + //此opcode之后还有传参、调用构造方法的操作 + //所以如果没有定义构造方法则直接跳过这些操作 + ZEND_VM_JMP(OP_JMP_ADDR(opline, opline->op2)); + }else{ + //定义了构造方法 + //初始化调用构造函数的zend_execute_data + zend_execute_data *call = zend_vm_stack_push_call_frame(...); + call->prev_execute_data = EX(call); + EX(call) = call; + ... + } +} +``` +从上面的创建对象的过程看整个流程主要分为三步:首先是根据类名在EG(class_table)中查找对应zend_class_entry、然后是创建并初始化一个对象、最后是初始化调用构造函数的zend_execute_data。 + +我们再具体看下第2步创建、初始化对象的操作,`object_init_ex(&object_zval, ce)`最终调用的是`_object_and_properties_init()`。 +```c +//zend_API.c +ZEND_API int _object_and_properties_init(zval *arg, zend_class_entry *class_type, ...) +{ + //检查类是否可以实例化 + ... + + //用户自定义的类create_object都是NULL + //只有PHP几个内部的类有这个值,比如exception、error等 + if (class_type->create_object == NULL) { + //分配一个对象 + ZVAL_OBJ(arg, zend_objects_new(class_type)); + ... + //初始化成员属性 + object_properties_init(Z_OBJ_P(arg), class_type); + } else { + ZVAL_OBJ(arg, class_type->create_object(class_type)); + } + return SUCCESS; +} +``` +这个过程又具体分了两步:分配对象结构、初始化成员属性,我们继续看下这里面的处理。 + +__(1)分配对象结构:zend_object__ +```c +//zend_objects.c +ZEND_API zend_object *zend_objects_new(zend_class_entry *ce) +{ + //分配zend_object + zend_object *object = emalloc(sizeof(zend_object) + zend_object_properties_size(ce)); + + zend_object_std_init(object, ce); + //设置对象的操作handler为std_object_handlers + object->handlers = &std_object_handlers; + return object; +} +``` +这里需要注意,分配zend_object并不仅仅 + +__(2)初始化成员属性__ diff --git a/img/object_new_op.png b/img/object_new_op.png new file mode 100644 index 0000000000000000000000000000000000000000..96f1e7fea10118575cc6a06912398eab0cfb5b21 GIT binary patch literal 13390 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

`AQAw_D$MEI zS@$Tok+!nFeq9B7k!|pr16Quq7q1WcHp(RE9!2hMZk!Cr44NhSp}Ybo&x<%H#E^$X zlPkhn7kktA)cMM^-n~K>T16Ez!iPX*nKqN(GZ~=!icTv8z9D~Nn_`TuB8s$U7<5rF zSBnW$P1HgpuDkT&2c+eH-n%Hhd*vg?0|A&jse=$t43)UXJQRYxB@I}v`mb6@^m@qt zoiVmp{yev%zT0m~(&*<8X3Ee{JU-0nomhpxlKNMp1+QWpE8wA1@u)2Pq5q%K*r|4y z6FPY8@!NmPQU86}XMSt8< Date: Sat, 25 Mar 2017 18:37:27 +0800 Subject: [PATCH 080/379] update --- 3/zend_object.md | 34 ++++++++++++++++++++++++++++++++-- img/object_class_prop.png | Bin 0 -> 40455 bytes 2 files changed, 32 insertions(+), 2 deletions(-) create mode 100644 img/object_class_prop.png diff --git a/3/zend_object.md b/3/zend_object.md index 405e4cf..3b854ea 100644 --- a/3/zend_object.md +++ b/3/zend_object.md @@ -17,6 +17,7 @@ struct _zend_object { ``` 几个主要的成员: + __(1)ce:__ 所属类 __(2)handlers:__ 这个保存的对象相关操作的一些函数指针,比如成员属性的读写、成员方法的获取、对象的销毁/克隆等等,这些操作接口都有默认的函数。 @@ -43,7 +44,7 @@ ZEND_API zend_object_handlers std_object_handlers = { ... } ``` -__(3):__ +__(3)properties_table:__ 成员属性数组,还记得我们在介绍类一节时提过非静态属性存储在对象结构中吗?就是这个properties_table!注意,它是一个数组,`zend_object`是个变长结构体,分配时会根据非静态属性的数量确定其大小。 #### 3.4.2.2 对象的创建 PHP中通过`new + 类名`创建一个类的实例,我们从一个例子分析下对象创建的过程中都有哪些操作。 @@ -53,6 +54,7 @@ class my_class { const TYPE = 90; public $name = "pangudashu"; + public $ids = array(); } $obj = new my_class(); @@ -147,6 +149,34 @@ ZEND_API zend_object *zend_objects_new(zend_class_entry *ce) return object; } ``` -这里需要注意,分配zend_object并不仅仅 +有个地方这里需要特别注意:分配对象结构的内存并不仅仅是zend_object的大小。我们在3.4.2.1介绍properties_table时说过这是一个变长数组,它用来存放非静态属性的值,所以分配zend_object时需要加上非静态属性所占用的内存大小:`zend_object_properties_size()`(实际就是zend_class_entry.default_properties_count)。 __(2)初始化成员属性__ +```c +ZEND_API void object_properties_init(zend_object *object, zend_class_entry *class_type) +{ + if (class_type->default_properties_count) { + zval *src = class_type->default_properties_table; + zval *dst = object->properties_table; + zval *end = src + class_type->default_properties_count; + + //将非静态属性值从: + //zend_class_entry.default_properties_table复制到zend_object.properties_table + do { + ZVAL_COPY(dst, src); + src++; + dst++; + } while (src != end); + object->properties = NULL; + } +} +``` +这一步操作是将非静态属性的值从`zend_class_entry.default_properties_table -> zend_object.properties_table`,当然这里不是硬拷贝,而是增加引用,两者当前指向的value还是同一份,除非对象试图改写指向的属性值,那时将触发写时复制机制重新拷贝一份。 + +上面那个例子,类有两个普通属性:$name、$ids,假如我们实例化了两个对象,那么zend_class_entry与zend_object中普通属性值的关系如下图所示。 + +![](../object_class_prop.png) + + + + diff --git a/img/object_class_prop.png b/img/object_class_prop.png new file mode 100644 index 0000000000000000000000000000000000000000..64efab7cfcdea3c5846090838297c5e24973a299 GIT binary patch literal 40455 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 @@C(wO^ZL+y!_VwUA#=m9i2b~W=^Hm8`=w#9 z_xM;rjJe;nR#mf?l|`}vZvxk~9NynsK}+#Ev_MqGW>keP4xSEc`Dp)8^lYk5ay9#$ zlWd6S?^&JajEoA5MYC2i)dW#jJ)W=YIdFCLX=g&hj4!KvT*g?0qk_@Gb!Qhx_XhJN zT1B8-hFKu>udOzD%ANsSJ{1X5QObzVnLkI2*mRkD_FAT=Y$PIXV zc>B&%FPSmQ4LNIXT!@ILSD}h(OUkMf0X?WqIuy`oDr9@hOlpcpJ)EB|jDdqSxR($B zK{=~QF|Lj2j`w-5xt7k)%w^D*`p$3`UbA6vJX#UabA`cTp6A_Q_F#p=+2yxFk_jr} zU&(V1I2N;c26Im3zVGw)RBMX`fB||N3#vUzejR%!W&v?{evNBN+G9*l3#*OdW*OSE zTt2~0_r`x=O=&jg3|wtii*febY;%?~^-Y`Gv24-z zEaZIpogt1%!hWE#l~Q!D*Pi&j({<{uiGH!Vv`qfcy>G@}m6^j{5( z;@A5GH1-h7Lqq9xU5s4;CIsim?^D<%~tF@%nyit?s?Zo!yKb!oo+(_Nh zQ>_!{XxsFFfq;3n>Ek+@Hlna>yu1p*pGw=Zqf}I8B%EszJ?t1^-|HTA8 z^}n=bK7Ro-3leg{r5K33d;X(a6)V@p{qQZu#a))zf&Ojo+3C*JVq6_`nO$t{hU3?eegqjM@L-^_`;anm z9HW@FP)p!$>@H} zwt!GPtX6%2hX2FlcYv*-=|AxG^x2FfQKDb;7Q-15;Ain9? z8Z*kq$om_I|7H=21N3cRj(4*k-yem-ND|we`QL3OA-{qt>{+J+h}r|&SP^bos#({D z87SSfrkU5;q!0af>n=JCAFcZXr>zUTVTy*^g;kSplF?uYseRnIgd1Da|otM=%4k`sLOs8cIuW+wgS(=i)o` zqSMPa(OIwAOOM|^l1w2uGswq3gzZtB1<8vK`eUhJBgs%w{JsGICPus z800g0LP+6R_A?k1!FnQA+#>z@1*p7}-{WhzyA>XzQHhv{$XW^< z+F$Sk*y?a7)Op@MMH8W9f+fxBY*YJ(ZC@k$Lqos5(Cc7;7JO2s+)O;`#CW7b$f6)Z z4U+ZbA&A|r8PRkd*O81>XT5bkP-xK1xIP$Wlfvk|;28yQ1`3SmVwmmLVgim>YvaZO zMA9QyXEd+bW&Wc}U;AK9iw=y7{U4P(3r&7ag8u(Dm|0~~q;6G-+PW*2z|TnyonyJ` H7B~I{%R;ui literal 0 HcmV?d00001 From 4ccc0d752812321e6ceeb7b89ef103ea661a62cd Mon Sep 17 00:00:00 2001 From: qinpeng Date: Sat, 25 Mar 2017 19:10:08 +0800 Subject: [PATCH 081/379] fix error --- 2/zval.md | 2 +- 3/zend_object.md | 25 ++++++++++++++++++++++++- README.md | 9 +++++---- 3 files changed, 30 insertions(+), 6 deletions(-) diff --git a/2/zval.md b/2/zval.md index 8b11ffc..ef851a2 100644 --- a/2/zval.md +++ b/2/zval.md @@ -271,7 +271,7 @@ $b[] = 3; 不是所有类型都可以copy的,比如对象、资源,实时上只有string、array两种支持,与引用计数相同,也是通过`zval.u1.type_flag`标识value是否可复制的: ```c -#define IS_TYPE_COLLECTABLE (1<<3) +#define IS_TYPE_COPYABLE (1<<4) ``` ```c | type | copyable | diff --git a/3/zend_object.md b/3/zend_object.md index 3b854ea..cb258d1 100644 --- a/3/zend_object.md +++ b/3/zend_object.md @@ -175,8 +175,31 @@ ZEND_API void object_properties_init(zend_object *object, zend_class_entry *clas 上面那个例子,类有两个普通属性:$name、$ids,假如我们实例化了两个对象,那么zend_class_entry与zend_object中普通属性值的关系如下图所示。 -![](../object_class_prop.png) +![](../img/object_class_prop.png) +3.4.2.3 对象的复制 +PHP中普通变量的复制可以通过直接赋值完成,比如: +```php +$a = array(); +$b = $a; +``` +但是对象无法这么进行复制,仅仅通过赋值传递对象,它们指向的都是同一个对象,修改时也不会发生硬拷贝。比如上面这个例子,我们把`$a`赋值给`$b`,然后如果我们修改`$b`的内容,那么这时候会进行value分离,`$a`的内容是不变的,但是如果是把一个对象赋值给了另一个变量,这俩对象不管哪一个修改另外一个都随之改变。 + +```php +class my_class +{ + public $arr = array(); +} +$a = new my_class; +$b = $a; +$b->arr[] = 1; + +var_dump($a === $b); +==================== +输出:bool(true) +``` +还记得我们在《2.1.3.2 写时复制》一节讲过zval有个类型掩码: __type_flag__ 吗?其中有个是否可复制的标识:__IS_TYPE_COLLECTABLE__ ,copyable的意思是当value发生duplication时是否需要或能够copy,而object的类型是不能复制(不清楚的可以翻下前面的章节),所以我们不能简单的通过赋值语句进行对象的复制。 +PHP提供了另外一个关键词来实现对象的复制:__clone__。 diff --git a/README.md b/README.md index 06f8229..f48d14c 100644 --- a/README.md +++ b/README.md @@ -23,10 +23,11 @@ * 3.3.3 函数的执行流程 * 3.4 面向对象实现 * [3.4.1 类](3/zend_class.md) - * 3.4.2 对象(3/zend_object.md) - * 3.4.3 继承 - * 3.4.4 魔术方法 - * 3.4.5 抽象类和接口 + * [3.4.2 对象](3/zend_object.md) + * 3.4.3 属性与方法(3/zend_prop_method.md) + * 3.4.4 继承 + * 3.4.5 魔术方法 + * 3.4.6 抽象类和接口 * 3.5 运行时缓存(3/zend_runtime_cache.md) * [第4章 PHP语法实现](4/php_language.md) * 4.1 变量 From aee9fe3ac82a57cf306ddc3792ef86e38d2a8183 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Sat, 25 Mar 2017 19:12:02 +0800 Subject: [PATCH 082/379] update --- 2/zval.md | 2 +- 3/zend_object.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/2/zval.md b/2/zval.md index ef851a2..c507595 100644 --- a/2/zval.md +++ b/2/zval.md @@ -285,7 +285,7 @@ $b[] = 3; |resource | | |reference | | ``` -__copyable__ 的意思是当value发生duplication时是否需要copy,这个具体有两种情形下会发生: +__copyable__ 的意思是当value发生duplication时是否需要或者能够copy,这个具体有两种情形下会发生: * a.从 __literal变量区__ 复制到 __局部变量区__ ,比如:`$a = [];`实际会有两个数组,而`$a = "hi~";//interned string`则只有一个string * b.局部变量区分离时(写时复制):如改变变量内容时引用计数大于1则需要分离,`$a = [];$b = $a; $b[] = 1;`这里会分离,类型是array所以可以复制,如果是对象:`$a = new user;$b = $a;$a->name = "dd";`这种情况是不会复制object的,$a、$b指向的对象还是同一个 diff --git a/3/zend_object.md b/3/zend_object.md index cb258d1..483dfbc 100644 --- a/3/zend_object.md +++ b/3/zend_object.md @@ -200,6 +200,6 @@ var_dump($a === $b); ==================== 输出:bool(true) ``` -还记得我们在《2.1.3.2 写时复制》一节讲过zval有个类型掩码: __type_flag__ 吗?其中有个是否可复制的标识:__IS_TYPE_COLLECTABLE__ ,copyable的意思是当value发生duplication时是否需要或能够copy,而object的类型是不能复制(不清楚的可以翻下前面的章节),所以我们不能简单的通过赋值语句进行对象的复制。 +还记得我们在《2.1.3.2 写时复制》一节讲过zval有个类型掩码: __type_flag__ 吗?其中有个是否可复制的标识:__IS_TYPE_COPYABLE__ ,copyable的意思是当value发生duplication时是否需要或能够copy,而object的类型是不能复制(不清楚的可以翻下前面的章节),所以我们不能简单的通过赋值语句进行对象的复制。 PHP提供了另外一个关键词来实现对象的复制:__clone__。 From 44d8cc051043945f285a6c4e7e1ba8d85f110551 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Sat, 25 Mar 2017 19:12:40 +0800 Subject: [PATCH 083/379] update --- 3/zend_object.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3/zend_object.md b/3/zend_object.md index 483dfbc..904015c 100644 --- a/3/zend_object.md +++ b/3/zend_object.md @@ -177,7 +177,7 @@ ZEND_API void object_properties_init(zend_object *object, zend_class_entry *clas ![](../img/object_class_prop.png) -3.4.2.3 对象的复制 +#### 3.4.2.3 对象的复制 PHP中普通变量的复制可以通过直接赋值完成,比如: ```php $a = array(); From 5f2bf47f07b173db5ee2ba32b7560ebd85319a2d Mon Sep 17 00:00:00 2001 From: qinpeng Date: Sat, 25 Mar 2017 19:23:35 +0800 Subject: [PATCH 084/379] update --- 3/zend_object.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/3/zend_object.md b/3/zend_object.md index 904015c..3cda83f 100644 --- a/3/zend_object.md +++ b/3/zend_object.md @@ -177,6 +177,13 @@ ZEND_API void object_properties_init(zend_object *object, zend_class_entry *clas ![](../img/object_class_prop.png) +以上就是实例化一个对象的过程,总结一下具体的步骤: +* __step1:__ 首先根据类名去EG(class_table)中找到具体的类,即zend_class_entry +* __step2:__ 分配zend_object结构,一起分配的还有普通非静态属性值的内存 +* __step3:__ 初始化对象的非静态属性,将属性值从zend_class_entry拷贝至对象中 +* __step4:__ 查找当前类是否定义了构造函数,如果没有定义则跳过执行构造函数的opcode,否则为调用构造函数的执行进行一些准备工作(分配zend_execute_data) +* __step5:__ 实例化完成,返回新实例化的对象(如果返回的对象没有变量使用则直接释放掉了) + #### 3.4.2.3 对象的复制 PHP中普通变量的复制可以通过直接赋值完成,比如: ```php From 3c20f085cdab1604815f2ee26c3245f41e0847ec Mon Sep 17 00:00:00 2001 From: qinpeng Date: Sat, 25 Mar 2017 20:56:05 +0800 Subject: [PATCH 085/379] update --- 3/zend_object.md | 40 ++++++++++++++++++++++++++++++++++++---- 1 file changed, 36 insertions(+), 4 deletions(-) diff --git a/3/zend_object.md b/3/zend_object.md index 3cda83f..e5653bb 100644 --- a/3/zend_object.md +++ b/3/zend_object.md @@ -18,7 +18,7 @@ struct _zend_object { ``` 几个主要的成员: -__(1)ce:__ 所属类 +__(1)ce:__ 所属类的zend_class_entry。 __(2)handlers:__ 这个保存的对象相关操作的一些函数指针,比如成员属性的读写、成员方法的获取、对象的销毁/克隆等等,这些操作接口都有默认的函数。 ```c @@ -41,7 +41,28 @@ ZEND_API zend_object_handlers std_object_handlers = { zend_objects_clone_obj, /* clone_obj */ zend_std_read_property, /* read_property */ zend_std_write_property, /* write_property */ - ... + zend_std_read_dimension, /* read_dimension */ + zend_std_write_dimension, /* write_dimension */ + zend_std_get_property_ptr_ptr, /* get_property_ptr_ptr */ + NULL, /* get */ + NULL, /* set */ + zend_std_has_property, /* has_property */ + zend_std_unset_property, /* unset_property */ + zend_std_has_dimension, /* has_dimension */ + zend_std_unset_dimension, /* unset_dimension */ + zend_std_get_properties, /* get_properties */ + zend_std_get_method, /* get_method */ + NULL, /* call_method */ + zend_std_get_constructor, /* get_constructor */ + zend_std_object_get_class_name, /* get_class_name */ + zend_std_compare_objects, /* compare_objects */ + zend_std_cast_object_tostring, /* cast_object */ + NULL, /* count_elements */ + zend_std_get_debug_info, /* get_debug_info */ + zend_std_get_closure, /* get_closure */ + zend_std_get_gc, /* get_gc */ + NULL, /* do_operation */ + NULL, /* compare */ } ``` __(3)properties_table:__ 成员属性数组,还记得我们在介绍类一节时提过非静态属性存储在对象结构中吗?就是这个properties_table!注意,它是一个数组,`zend_object`是个变长结构体,分配时会根据非静态属性的数量确定其大小。 @@ -171,7 +192,7 @@ ZEND_API void object_properties_init(zend_object *object, zend_class_entry *clas } } ``` -这一步操作是将非静态属性的值从`zend_class_entry.default_properties_table -> zend_object.properties_table`,当然这里不是硬拷贝,而是增加引用,两者当前指向的value还是同一份,除非对象试图改写指向的属性值,那时将触发写时复制机制重新拷贝一份。 +这一步操作是将非静态属性的值从`zend_class_entry.default_properties_table -> zend_object.properties_table`,当然这里不是硬拷贝,而是浅复制(增加引用),两者当前指向的value还是同一份,除非对象试图改写指向的属性值,那时将触发写时复制机制重新拷贝一份。 上面那个例子,类有两个普通属性:$name、$ids,假如我们实例化了两个对象,那么zend_class_entry与zend_object中普通属性值的关系如下图所示。 @@ -180,7 +201,7 @@ ZEND_API void object_properties_init(zend_object *object, zend_class_entry *clas 以上就是实例化一个对象的过程,总结一下具体的步骤: * __step1:__ 首先根据类名去EG(class_table)中找到具体的类,即zend_class_entry * __step2:__ 分配zend_object结构,一起分配的还有普通非静态属性值的内存 -* __step3:__ 初始化对象的非静态属性,将属性值从zend_class_entry拷贝至对象中 +* __step3:__ 初始化对象的非静态属性,将属性值从zend_class_entry浅复制到对象中 * __step4:__ 查找当前类是否定义了构造函数,如果没有定义则跳过执行构造函数的opcode,否则为调用构造函数的执行进行一些准备工作(分配zend_execute_data) * __step5:__ 实例化完成,返回新实例化的对象(如果返回的对象没有变量使用则直接释放掉了) @@ -210,3 +231,14 @@ var_dump($a === $b); 还记得我们在《2.1.3.2 写时复制》一节讲过zval有个类型掩码: __type_flag__ 吗?其中有个是否可复制的标识:__IS_TYPE_COPYABLE__ ,copyable的意思是当value发生duplication时是否需要或能够copy,而object的类型是不能复制(不清楚的可以翻下前面的章节),所以我们不能简单的通过赋值语句进行对象的复制。 PHP提供了另外一个关键词来实现对象的复制:__clone__。 +```php +$copy_of_object = clone $object; +``` +`clone`出的对象就与原来的对象完全隔离了,各自修改都不会相互影响,另外如果类中定义了`__clone()`魔法函数,那么在`clone`时将调用此函数。 + +`clone`的实现比较简单,这里简单看下。 + +```c + +``` + From 21cddd26da44a65fa52a8cf5861b16daef7b933a Mon Sep 17 00:00:00 2001 From: qinpeng Date: Sat, 25 Mar 2017 21:42:19 +0800 Subject: [PATCH 086/379] update --- 3/zend_object.md | 39 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/3/zend_object.md b/3/zend_object.md index e5653bb..59f922b 100644 --- a/3/zend_object.md +++ b/3/zend_object.md @@ -236,9 +236,46 @@ $copy_of_object = clone $object; ``` `clone`出的对象就与原来的对象完全隔离了,各自修改都不会相互影响,另外如果类中定义了`__clone()`魔法函数,那么在`clone`时将调用此函数。 -`clone`的实现比较简单,这里简单看下。 +`clone`的实现比较简单,通过`zend_object.clone_obj`(即:`zend_objects_clone_obj()`)完成。 +```c +//zend_objects.c +ZEND_API zend_object *zend_objects_clone_obj(zval *zobject) +{ + zend_object *old_object; + zend_object *new_object; + + old_object = Z_OBJ_P(zobject); + //重新分配一个zend_object + new_object = zend_objects_new(old_object->ce); + + //浅复制properties_table、properties + //如果定义了__clone()则调用此方法 + zend_objects_clone_members(new_object, old_object); + + return new_object; +} +``` +#### 3.4.2.4 对象比较 +当使用比较运算符(==)比较两个对象变量时,比较的原则是:如果两个对象的属性和属性值 都相等,而且两个对象是同一个类的实例,那么这两个对象变量相等;而如果使用全等运算符(===),这两个对象变量一定要指向某个类的同一个实例(即同一个对象)。 +PHP中对象间的"=="比较通过函数`zend_std_compare_objects()`处理。 ```c +static int zend_std_compare_objects(zval *o1, zval *o2) +{ + ... + if (zobj1->ce != zobj2->ce) { + return 1; /* different classes */ + } + if (!zobj1->properties && !zobj2->properties) { + //逐个比较properties_table + ... + }else{ + //比较properties + return zend_compare_symbol_tables(zobj1->properties, zobj2->properties); + } +} ``` +"==="的比较通过函数`zend_is_identical()`处理,比较简单,这里不再展开。 +#### 3.4.2.5 From bddd0eeabc6c003f608bd80c58676fa629252f8e Mon Sep 17 00:00:00 2001 From: qinpeng Date: Sun, 26 Mar 2017 11:20:06 +0800 Subject: [PATCH 087/379] update --- 3/zend_class.md | 27 ++++++++++++++++++++++----- 3/zend_object.md | 8 +++++--- 2 files changed, 27 insertions(+), 8 deletions(-) diff --git a/3/zend_class.md b/3/zend_class.md index 307c075..adb82e1 100644 --- a/3/zend_class.md +++ b/3/zend_class.md @@ -38,7 +38,7 @@ struct _zend_class_entry { HashTable properties_info; //成员属性基本信息哈希表,key为成员名,value为zend_property_info HashTable constants_table; //常量哈希表,通过constant定义的 - //以下是构造函授、析构函数、魔法函数的指针 + //以下是构造函授、析构函数、魔术方法的指针 union _zend_function *constructor; union _zend_function *destructor; union _zend_function *clone; @@ -55,8 +55,8 @@ struct _zend_class_entry { zend_class_iterator_funcs iterator_funcs; - //下面这几个暂时忽略,后面碰到的时候再分析其作用 - /* handlers */ + //自定义的钩子函数,通常是定义内部类时使用,可以灵活的进行一些个性化的操作 + //用户自定义类不会用到,暂时忽略即可 zend_object* (*create_object)(zend_class_entry *class_type); zend_object_iterator *(*get_iterator)(zend_class_entry *ce, zval *object, int by_ref); int (*interface_gets_implemented)(zend_class_entry *iface, zend_class_entry *class_type); /* a class implements this interface */ @@ -257,7 +257,7 @@ my_class::$method(); 成员方法的调用与普通function过程基本相同,根据对象所属类或直接根据类取到method的zend_function,然后执行,具体的过程[《3.3 Zend引擎执行过程》](zend_executor.md)已经详细说过,这里不再重复。 -#### 3.4.1.5 类的编译 +#### 3.4.1.5 自定义类的编译 前面我们先介绍了类的相关组成部分,接下来我们从一个例子简单看下类的编译过程,这个过程最终的产物就是zend_class_entry。 ```php @@ -557,7 +557,7 @@ void zend_begin_method_decl(zend_op_array *op_array, zend_string *name, zend_boo zend_error_noreturn(..); } - //后面主要是设置一些构造函数、析构函数、魔法函数指针,以及其它一些可见性、静态非静态的检查 + //后面主要是设置一些构造函数、析构函数、魔术方法指针,以及其它一些可见性、静态非静态的检查 ... } ``` @@ -741,3 +741,20 @@ new A(); 实际执行顺序:5->1->2->3->4->5->6->7->8,执行到1发现还是找不到父类B,报错 ``` +3.4.1.6 内部类 +前面我们介绍了类的基本组成以及用户自定义类的编译,除了在PHP代码中可以定义一个类,我们也可以在内核或扩展中定义一个类(与定义内部函数类似),这种类称之为 __内部类__。 + +相比于用户自定义类的编译实现,内部类的定义比较简单,也更加灵活,可以进行一些个性化的处理,比如我们可以定义创建对象的钩子函数:`create_object`,从而在对象实例化时调用我们自己定义的函数完成,这样我们就可以进行很多其它的操作。 + +内部类的定义简单的概括就是`创建一个zend_class_entry结构,然后插入到EG(class_table)中`,涉及的操作主要有: + +* __注册类到符号表__ +* __实现继承、接口__ +* __定义常量__ +* __定义成员属性__ +* __定义成员方法__ + +实际这些与用户自定义类的实现相同,只是内部类直接调用相关API完成这些操作,具体的API接口本节不再介绍,我们将在后面介绍扩展开发一章中再系统说明。 + + + diff --git a/3/zend_object.md b/3/zend_object.md index 59f922b..aa4f4e9 100644 --- a/3/zend_object.md +++ b/3/zend_object.md @@ -149,14 +149,16 @@ ZEND_API int _object_and_properties_init(zval *arg, zend_class_entry *class_type //初始化成员属性 object_properties_init(Z_OBJ_P(arg), class_type); } else { + //调用自定义的创建object的钩子函数 ZVAL_OBJ(arg, class_type->create_object(class_type)); } return SUCCESS; } ``` -这个过程又具体分了两步:分配对象结构、初始化成员属性,我们继续看下这里面的处理。 +还记得上一节介绍zend_class_entry时有几个自定义的钩子函数吗?如果定义了`create_object`这个地方就会调用自定义的函数来创建zend_object,这种情况通常发生在内核或扩展中定义的内部类(当然用户自定义类也可以修改,但一般不会那样做);用户自定义类在这个地方又具体分了两步:分配对象结构、初始化成员属性,我们继续看下这里面的处理。 __(1)分配对象结构:zend_object__ + ```c //zend_objects.c ZEND_API zend_object *zend_objects_new(zend_class_entry *ce) @@ -234,7 +236,7 @@ PHP提供了另外一个关键词来实现对象的复制:__clone__。 ```php $copy_of_object = clone $object; ``` -`clone`出的对象就与原来的对象完全隔离了,各自修改都不会相互影响,另外如果类中定义了`__clone()`魔法函数,那么在`clone`时将调用此函数。 +`clone`出的对象就与原来的对象完全隔离了,各自修改都不会相互影响,另外如果类中定义了`__clone()`魔术方法,那么在`clone`时将调用此函数。 `clone`的实现比较简单,通过`zend_object.clone_obj`(即:`zend_objects_clone_obj()`)完成。 ```c @@ -278,4 +280,4 @@ static int zend_std_compare_objects(zval *o1, zval *o2) ``` "==="的比较通过函数`zend_is_identical()`处理,比较简单,这里不再展开。 -#### 3.4.2.5 +#### 3.4.2.5 对象的销毁 From bb003532c4ceaf6a32880008851382207f9f0d4e Mon Sep 17 00:00:00 2001 From: qinpeng Date: Sun, 26 Mar 2017 11:21:06 +0800 Subject: [PATCH 088/379] update --- 3/zend_class.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3/zend_class.md b/3/zend_class.md index adb82e1..1c1f4d8 100644 --- a/3/zend_class.md +++ b/3/zend_class.md @@ -741,7 +741,7 @@ new A(); 实际执行顺序:5->1->2->3->4->5->6->7->8,执行到1发现还是找不到父类B,报错 ``` -3.4.1.6 内部类 +#### 3.4.1.6 内部类 前面我们介绍了类的基本组成以及用户自定义类的编译,除了在PHP代码中可以定义一个类,我们也可以在内核或扩展中定义一个类(与定义内部函数类似),这种类称之为 __内部类__。 相比于用户自定义类的编译实现,内部类的定义比较简单,也更加灵活,可以进行一些个性化的处理,比如我们可以定义创建对象的钩子函数:`create_object`,从而在对象实例化时调用我们自己定义的函数完成,这样我们就可以进行很多其它的操作。 From b3860b8871e0387a04093546046a66ff70cc8f8f Mon Sep 17 00:00:00 2001 From: qinpeng Date: Sun, 26 Mar 2017 13:25:43 +0800 Subject: [PATCH 089/379] add object dtor --- 3/zend_object.md | 81 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) diff --git a/3/zend_object.md b/3/zend_object.md index aa4f4e9..f909ff0 100644 --- a/3/zend_object.md +++ b/3/zend_object.md @@ -174,6 +174,40 @@ ZEND_API zend_object *zend_objects_new(zend_class_entry *ce) ``` 有个地方这里需要特别注意:分配对象结构的内存并不仅仅是zend_object的大小。我们在3.4.2.1介绍properties_table时说过这是一个变长数组,它用来存放非静态属性的值,所以分配zend_object时需要加上非静态属性所占用的内存大小:`zend_object_properties_size()`(实际就是zend_class_entry.default_properties_count)。 +另外这里还有一个关键操作:__将object编号并插入EG(objects_store).object_buckets数组__。zend_object有个成员:handle,这个值在一次request期间所有实例化对象的编号,每调用`zend_objects_new()`实例化一个对象就会将其插入到object_buckets数组中,其在数组中的下标就是handle。这个过程是在`zend_objects_store_put()`中完成的。 +```c +//zend_objects_API.c +ZEND_API void zend_objects_store_put(zend_object *object) +{ + int handle; + + if (EG(objects_store).free_list_head != -1) { + //这种情况主要是gc中会将中间一些object销毁,空出一些bucket位置 + //然后free_list_head就指向了第一个可用的bucket位置 + //后面可用的保存在第一个空闲bucket的handle中 + handle = EG(objects_store).free_list_head; + EG(objects_store).free_list_head = GET_OBJ_BUCKET_NUMBER(EG(objects_store).object_buckets[handle]); + } else { + if (EG(objects_store).top == EG(objects_store).size) { + //扩容 + } + //递增加1 + handle = EG(objects_store).top++; + } + object->handle = handle; + //存入object_buckets数组 + EG(objects_store).object_buckets[handle] = object; +} + +typedef struct _zend_objects_store { + zend_object **object_buckets; //对象数组 + uint32_t top; //当前全部object数 + uint32_t size; //object_buckets大小 + int free_list_head; //第一个可用object_buckets位置 +} zend_objects_store; +``` +将所有的对象保存在`EG(objects_store).object_buckets`中的目的是用于垃圾回收(不确定是不是还有其它的作用),防止出现循环引用而导致内存泄漏的问题,这个机制后面章节会单独介绍,这里只要记得有这么个东西就行了。 + __(2)初始化成员属性__ ```c ZEND_API void object_properties_init(zend_object *object, zend_class_entry *class_type) @@ -281,3 +315,50 @@ static int zend_std_compare_objects(zval *o1, zval *o2) "==="的比较通过函数`zend_is_identical()`处理,比较简单,这里不再展开。 #### 3.4.2.5 对象的销毁 +object与string、array等类型不同,它是个符合类型,所以它的销毁过程更加复杂,赋值、函数调用结束或主动unset等操作中如果发现object引用计数为0则将触发销毁动作。 +```php +//情况1 +$obj1 = new my_function(); + +$obj1 = 123; //此时将断开对zend_object的引用,如果refcount=0则销毁 + +//情况2 +function xxxx(){ + $obj1 = new my_function(); + ... + return null; //清理局部变量时如果发现$obj1引用为0则销毁 +} + +//情况3 +$obj1 = new my_function(); +//整个脚本结束,清理全局变量时 + +//情况4 +$obj1 = new my_function(); +unset($obj1); +``` +上面这几个都是比较常见的会进行变量销毁的情况,销毁一个对象由`zend_objects_store_del()`完成,销毁的过程主要是清理成员属性、从EG(objects_store).object_buckets中删除、释放zend_object内存等等。 +```c +//zend_objects_API.c +ZEND_API void zend_objects_store_del(zend_object *object) +{ + //这个函数if嵌套写的很挫... + ... + if (GC_REFCOUNT(object) > 0) { + GC_REFCOUNT(object)--; + return; + } + ... + + //调用dtor_obj,默认zend_objects_destroy_object() + //接着调用free_obj,默认zend_object_std_dtor() + object->handlers->dtor_obj(object); + object->handlers->free_obj(object); + ... + ptr = ((char*)object) - object->handlers->offset; + efree(ptr); +} +``` +另外,在减少refcount时如果发现object的引用计数大于0那么并不是什么都不做了,还记得2.1.3.4介绍的垃圾回收吗?PHP变量类型有的会因为循环引用导致正常的gc无法生效,这种类型的变量就有可能成为垃圾,所以会对这些类型的`zval.u1.type_flag`打上`IS_TYPE_COLLECTABLE`标签,然后在减少引用时即使refcount大于0也会启动垃圾检查,目前只有object、array两种类型会使用这种机制。 + + From ad4c2323463c35df85051cd13a8ae17d88ed307e Mon Sep 17 00:00:00 2001 From: qinpeng Date: Sun, 26 Mar 2017 13:33:51 +0800 Subject: [PATCH 090/379] update --- 3/zend_object.md | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/3/zend_object.md b/3/zend_object.md index f909ff0..9e5e3d8 100644 --- a/3/zend_object.md +++ b/3/zend_object.md @@ -18,9 +18,11 @@ struct _zend_object { ``` 几个主要的成员: -__(1)ce:__ 所属类的zend_class_entry。 +__(1)handle:__ 一次request期间对象的编号,每个对象都有一个唯一的编号,与创建先后顺序有关,主要在垃圾回收时用,下面会详细说明。 -__(2)handlers:__ 这个保存的对象相关操作的一些函数指针,比如成员属性的读写、成员方法的获取、对象的销毁/克隆等等,这些操作接口都有默认的函数。 +__(2)ce:__ 所属类的zend_class_entry。 + +__(3)handlers:__ 这个保存的对象相关操作的一些函数指针,比如成员属性的读写、成员方法的获取、对象的销毁/克隆等等,这些操作接口都有默认的函数。 ```c struct _zend_object_handlers { int offset; @@ -65,7 +67,9 @@ ZEND_API zend_object_handlers std_object_handlers = { NULL, /* compare */ } ``` -__(3)properties_table:__ 成员属性数组,还记得我们在介绍类一节时提过非静态属性存储在对象结构中吗?就是这个properties_table!注意,它是一个数组,`zend_object`是个变长结构体,分配时会根据非静态属性的数量确定其大小。 +__(4)properties:__ 普通成员属性哈希表,对象创建之初这个值为NULL,主要是在动态定义属性时会用到,与properties_table有一定关系,下一节我们将单独说明,这里暂时忽略。 + +__(5)properties_table:__ 成员属性数组,还记得我们在介绍类一节时提过非静态属性存储在对象结构中吗?就是这个properties_table!注意,它是一个数组,`zend_object`是个变长结构体,分配时会根据非静态属性的数量确定其大小。 #### 3.4.2.2 对象的创建 PHP中通过`new + 类名`创建一个类的实例,我们从一个例子分析下对象创建的过程中都有哪些操作。 From 7b2d32bf64d01c5b61f96d3e86b0e7ab0d54c405 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Sun, 26 Mar 2017 13:59:07 +0800 Subject: [PATCH 091/379] update directory --- 3/zend_extends.md | 1 + 3/zend_prop.md | 6 ++++++ README.md | 4 ++-- 3 files changed, 9 insertions(+), 2 deletions(-) create mode 100644 3/zend_extends.md create mode 100644 3/zend_prop.md diff --git a/3/zend_extends.md b/3/zend_extends.md new file mode 100644 index 0000000..5c29df0 --- /dev/null +++ b/3/zend_extends.md @@ -0,0 +1 @@ +### 3.4.3 继承 diff --git a/3/zend_prop.md b/3/zend_prop.md new file mode 100644 index 0000000..e23c221 --- /dev/null +++ b/3/zend_prop.md @@ -0,0 +1,6 @@ +### 3.4.4 成员属性 +前面类、对象两节中已经对成员属性进行了很多介绍,包括成员属性的类型、静态/非静态属性的存储等等,这一节之所以又把成员属性单独列出来是因为PHP中成员属性还有一些前面未讲到的特性,这一节我们再详细的、总结性的介绍下。 + +#### 3.4.4.1 静态属性 + +#### 3.4.4.2 非静态属性 diff --git a/README.md b/README.md index f48d14c..d333204 100644 --- a/README.md +++ b/README.md @@ -24,8 +24,8 @@ * 3.4 面向对象实现 * [3.4.1 类](3/zend_class.md) * [3.4.2 对象](3/zend_object.md) - * 3.4.3 属性与方法(3/zend_prop_method.md) - * 3.4.4 继承 + * 3.4.3 继承(3/zend_extends.md) + * 3.4.4 成员属性(3/zend_prop.md) * 3.4.5 魔术方法 * 3.4.6 抽象类和接口 * 3.5 运行时缓存(3/zend_runtime_cache.md) From 623981e48cb78651911e8c20a4c7adc8913c306b Mon Sep 17 00:00:00 2001 From: qinpeng Date: Mon, 27 Mar 2017 14:56:05 +0800 Subject: [PATCH 092/379] add extends --- 3/zend_class.md | 11 ++-- 3/zend_extends.md | 106 ++++++++++++++++++++++++++++++++ 3/zend_prop.md | 3 +- img/zend_extends_merge_prop.png | Bin 0 -> 35037 bytes img/zend_extents.png | Bin 0 -> 14164 bytes 5 files changed, 112 insertions(+), 8 deletions(-) create mode 100644 img/zend_extends_merge_prop.png create mode 100644 img/zend_extents.png diff --git a/3/zend_class.md b/3/zend_class.md index 1c1f4d8..cfe81ba 100644 --- a/3/zend_class.md +++ b/3/zend_class.md @@ -651,23 +651,20 @@ case ZEND_DECLARE_INHERITED_CLASS: if (((ce = zend_lookup_class_ex(Z_STR_P(parent_name), parent_name + 1, 0)) == NULL) || ...) { //没找到父类,有可能父类没有定义、有可能父类在子类之后定义的...... if (CG(compiler_options) & ZEND_COMPILE_DELAYED_BINDING) { - uint32_t *opline_num = &CG(active_op_array)->early_binding; - - while (*opline_num != (uint32_t)-1) { - opline_num = &CG(active_op_array)->opcodes[*opline_num].result.opline_num; - } - *opline_num = opline - CG(active_op_array)->opcodes; + ... + //将opcode重置为ZEND_DECLARE_INHERITED_CLASS_DELAYED opline->opcode = ZEND_DECLARE_INHERITED_CLASS_DELAYED; opline->result_type = IS_UNUSED; opline->result.opline_num = -1; } return; } + //注册继承类 if (do_bind_inherited_class(CG(active_op_array), opline, CG(class_table), ce, 1) == NULL) { return; } - //清理无用的opcode:ZEND_FETCH_CLASS + //清理无用的opcode:ZEND_FETCH_CLASS,重置为0,执行时直接跳过 zend_del_literal(CG(active_op_array), fetch_class_opline->op2.constant); MAKE_NOP(fetch_class_opline); diff --git a/3/zend_extends.md b/3/zend_extends.md index 5c29df0..e596558 100644 --- a/3/zend_extends.md +++ b/3/zend_extends.md @@ -1 +1,107 @@ ### 3.4.3 继承 +继承是面向对象编程技术的一块基石,它允许创建分等级层次的类,它允许子类继承父类所有公有或受保护的特征和行为,使得子类对象具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。 + +继承对于功能的设计和抽象是非常有用的,而且对于类似的对象增加新功能就无须重新再写这些公用的功能。 + +PHP中通过`extends`关键词继承一个父类,一个类只允许继承一个父类,但是可以多级继承。 +```php +class 父类 { +} + +class 子类 extends 父类 { +} +``` + +前面的介绍我们已经知道,类中保存着成员属性、方法、常量等,父类与子类之间通过`zend_class_entry.parent`建立关联,如下图所示。 + +![](../img/zend_extends.png) + +问题来了:每个类都有自己独立的常量、成员属性、成员方法,那么继承类父子之间的这些信息是如何进行关联的呢?接下来我们将带着这个疑问再重新分析一下类的编译过程中是如何处理继承关系的。 + +3.4.1.5一节详细介绍了类的编译过程,这里再简单回顾下:首先为类分配一个zend_class_entry结构,如果没有继承类则生成一条类声明的opcode(ZEND_DECLARE_CLASS),有继承类则生成两条opcode(ZEND_FETCH_CLASS、ZEND_DECLARE_INHERITED_CLASS),然后再继续编译常量、成员属性、成员方法注册到zend_class_entry中,最后编译完成后调用`zend_do_early_binding()`进行 __父子类关联__ 以及 __注册到EG(class_table)符号表__。 + +如果父类在子类之前定义的,那么父子类之间的关联就是在`zend_do_early_binding()`中完成的,这里不考虑子类在父类前定义的情况,实际两者没有本质差别,区别在于在哪一个阶段执行。有继承类的情况在`zend_do_early_binding()`中首先是查找父类,然后调用`do_bind_inherited_class()`处理,最后将`ZEND_FETCH_CLASS`、`ZEND_DECLARE_INHERITED_CLASS`两条opcode删除,这些过程前面已经介绍过了,下面我们重点看下`do_bind_inherited_class()`的处理过程。 +```c +ZEND_API zend_class_entry *do_bind_inherited_class( + const zend_op_array *op_array, //这个是定义类的地方的 + const zend_op *opline, //类声明的opcode:ZEND_DECLARE_INHERITED_CLASS + HashTable *class_table, //CG(class_table) + zend_class_entry *parent_ce, //父类 + zend_bool compile_time) //是否编译时 +{ + zend_class_entry *ce; + zval *op1, *op2; + + if (compile_time) { + op1 = CT_CONSTANT_EX(op_array, opline->op1.constant); + op2 = CT_CONSTANT_EX(op_array, opline->op2.constant); + }else{ + ... + } + ... + //父子类关联 + zend_do_inheritance(ce, parent_ce); + + //注册到CG(class_table) + ... +} +``` +上面这个函数的处理与注册非继承类的`do_bind_class()`几乎完全相同,只是多了一个`zend_do_inheritance()`一步,此函数输入很直观,只一个类及父类。 +```c +//zend_inheritance.c #line:758 +ZEND_API void zend_do_inheritance(zend_class_entry *ce, zend_class_entry *parent_ce) +{ + zend_property_info *property_info; + zend_function *func; + zend_string *key; + zval *zv; + + //interface、trait、final类检查 + ... + ce->parent = parent_ce; + + zend_do_inherit_interfaces(ce, parent_ce); + + //下面就是继承属性、常量、方法 +} +``` +下面的操作我们根据一个示例逐个来看。 +```php +//示例 +class A { + const A1 = 1; + public $a1 = array(1); + private $a2 = 120; + + public function get() { + echo "A::get()"; + } +} +class B extends A { + const B1 = 2; + + public $b1 = "ddd"; + + public function get() { + echo "B::get()"; + } +} +``` + +#### 3.4.3.1 继承属性 +前面我们已经介绍过:属性按静态、非静态分别保存在两个数组中,各属性按照定义的先后顺序编号(offset),同时按照这个编号顺序存储排列,而这些编号信息通过`zend_property_info`结构保存,全部静态、非静态属性的`zend_property_info`保存在一个以属性名为key的HashTable中,所以检索属性时首先根据属性名找到此属性的`zend_property_info`,然后拿到其属性值的offset,再根据静态、非静态分别到`default_static_members_count`、`default_properties_table`数组中取出属性值。 + +当类存在继承关系时,操作方式是:__将属性从父类复制到子类__ 。子类会将父类的公共、受保护的属性值数组全部合并到子类中,然后将全部属性的`zend_property_info`哈希表也合并到子类中。 + +合并的步骤: + +__(1)合并default_properties_table:__ 首先申请一个父类+子类非静态属性大小的数组,然后先将父类非静态属性复制到新数组,然后再将子类的非静态数组接着父类属性的位置复制过去,子类的default_properties_table指向合并后的新数组,default_properties_count更新为新数组的大小,最后将子类旧的数组释放。示例合并后的情况如下图。 + +![](../img/zend_extends_merge_prop.png) + + + +#### 3.4.3.2 继承常量 + +#### 3.4.3.3 继承方法 + diff --git a/3/zend_prop.md b/3/zend_prop.md index e23c221..8c06370 100644 --- a/3/zend_prop.md +++ b/3/zend_prop.md @@ -1,6 +1,7 @@ ### 3.4.4 成员属性 -前面类、对象两节中已经对成员属性进行了很多介绍,包括成员属性的类型、静态/非静态属性的存储等等,这一节之所以又把成员属性单独列出来是因为PHP中成员属性还有一些前面未讲到的特性,这一节我们再详细的、总结性的介绍下。 +前面类、对象两节中已经对成员属性进行了很多介绍,包括成员属性的类型、静态/非静态属性的存储等等,这一节之所以又把成员属性单独列出来是因为PHP中成员属性还有一些前面未讲到的特性,如:父子类属性之间的存储、动态属性等,这一节我们再详细的、总结性的介绍下。 #### 3.4.4.1 静态属性 +静态属性只存在于类中,各对象之间共享,单一的类情况比较简单,全部静态属性都保存在`zend_class_entry.default_static_members_table`中 #### 3.4.4.2 非静态属性 diff --git a/img/zend_extends_merge_prop.png b/img/zend_extends_merge_prop.png new file mode 100644 index 0000000000000000000000000000000000000000..963ab0bfe5980a9bd9a903046e26d4a273748a04 GIT binary patch literal 35037 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 hQS$%CW%~s>kB9t4( Date: Mon, 27 Mar 2017 14:57:51 +0800 Subject: [PATCH 093/379] update --- img/{zend_extents.png => zend_extends.png} | Bin 1 file changed, 0 insertions(+), 0 deletions(-) rename img/{zend_extents.png => zend_extends.png} (100%) diff --git a/img/zend_extents.png b/img/zend_extends.png similarity index 100% rename from img/zend_extents.png rename to img/zend_extends.png From 3fb05fa2abf6fc3376a69e294b353c721483047f Mon Sep 17 00:00:00 2001 From: qinpeng Date: Mon, 27 Mar 2017 16:58:58 +0800 Subject: [PATCH 094/379] update --- 3/zend_extends.md | 45 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git a/3/zend_extends.md b/3/zend_extends.md index e596558..d5f1ca9 100644 --- a/3/zend_extends.md +++ b/3/zend_extends.md @@ -95,11 +95,54 @@ class B extends A { 合并的步骤: -__(1)合并default_properties_table:__ 首先申请一个父类+子类非静态属性大小的数组,然后先将父类非静态属性复制到新数组,然后再将子类的非静态数组接着父类属性的位置复制过去,子类的default_properties_table指向合并后的新数组,default_properties_count更新为新数组的大小,最后将子类旧的数组释放。示例合并后的情况如下图。 +__(1)合并非静态属性default_properties_table:__ 首先申请一个父类+子类非静态属性大小的数组,然后先将父类非静态属性复制到新数组,然后再将子类的非静态数组接着父类属性的位置复制过去,子类的default_properties_table指向合并后的新数组,default_properties_count更新为新数组的大小,最后将子类旧的数组释放。 +```c +if (parent_ce->default_properties_count) { + zval *src, *dst, *end; + ... + zval *table = pemalloc(sizeof(zval) * (ce->default_properties_count + parent_ce->default_properties_count), ...); + + ce->default_properties_table = table; + + //复制父类、子类default_properties_table + do { + ... + }while(dst != end); + + //更新default_properties_count为合并后的大小 + ce->default_properties_count += parent_ce->default_properties_count; +} +``` +示例合并后的情况如下图。 ![](../img/zend_extends_merge_prop.png) +__(2)合并静态属性default_static_members_table:__ 与非静态属性相同,新申请一个父类+子类静态属性大小的数组,依次将父类、子类静态属性复制到新数组,然后更新子类default_static_members_table指向新数组。 +__(3)更新子类属性offset:__ 因为合并后原子类属性整体向后移了,所以子类属性的编号offset需要加上前面父类属性的总大小。 +```c +ZEND_HASH_FOREACH_PTR(&ce->properties_info, property_info) { + if (property_info->ce == ce) { + if (property_info->flags & ZEND_ACC_STATIC) { + //静态属性offset为数组下标,直接加上父类default_static_members_count即可 + property_info->offset += parent_ce->default_static_members_count; + } else { + //非静态属性offset为内存偏移值,按zval大小递增 + property_info->offset += parent_ce->default_properties_count * sizeof(zval); + } + } +} ZEND_HASH_FOREACH_END(); +``` +__(4)合并properties_info哈希表:__ 这也是非常关键的一步,上面只是将父类的属性值合并到了子类,但是索引属性用的是properties_info哈希表,所以需要将父类的属性索引表与子类的索引表合并。在合并的过程中就牵扯到父子类属性的继承、覆盖问题了,各种情况具体处理如下: +* __父类属性不与子类冲突 且 父类属性是私有:__ 即父类属性为private,且子类中没有重名的,则将此属性插入子类properties_info,但是更新其flag为ZEND_ACC_SHADOW,这种属性将不能被子类使用; +* __父类属性不与子类冲突 且 父类属性是公有:__ 这种比较简单,子类可以继承使用,直接插入子类properties_info; +* __父类属性与子类冲突 且 父类属性为私有:__ 不继承父类的,以子类原属性为准,但是打上`ZEND_ACC_CHANGED`的flag,这种属性父子类隔离,互不干扰; +* __父类属性与子类冲突 且 父类属性是公有或受保护的:__ + * __父子类属性一个是静态一个是非静态:__ 编译错误; + * __父子类属性都是非静态:__ 用父类的offset,但是值用子类的,父子类共享; + * __父子类属性都是静态:__ 不继承父类属性,以子类原属性为准,父子类隔离,互不干扰; + +这个地方相对比较复杂,具体的合并策略在`do_inherit_property()`中,这里不再罗列代码。 #### 3.4.3.2 继承常量 From effd66e70504299a83e5278784f0b3a4917bc4ab Mon Sep 17 00:00:00 2001 From: qinpeng Date: Mon, 27 Mar 2017 18:54:43 +0800 Subject: [PATCH 095/379] update --- 3/zend_extends.md | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/3/zend_extends.md b/3/zend_extends.md index d5f1ca9..db7545a 100644 --- a/3/zend_extends.md +++ b/3/zend_extends.md @@ -145,6 +145,35 @@ __(4)合并properties_info哈希表:__ 这也是非常关键的一步,上面 这个地方相对比较复杂,具体的合并策略在`do_inherit_property()`中,这里不再罗列代码。 #### 3.4.3.2 继承常量 +常量的合并策略比较简单,如果父类与子类冲突时用子类的,不冲突时则将父类的常量合并到子类。 +```c +static void do_inherit_class_constant(zend_string *name, zval *zv, zend_class_entry *ce, zend_class_entry *parent_ce) +{ + //父类定义的常量在子类中没有定义 + if (!zend_hash_exists(&ce->constants_table, name)) { + ... + _zend_hash_append(&ce->constants_table, name, zv); + } +} +``` #### 3.4.3.3 继承方法 +```c +if (zend_hash_num_elements(&parent_ce->function_table)) { + //扩展子类的function_table哈希表大小 + zend_hash_extend(&ce->function_table, + zend_hash_num_elements(&ce->function_table) + + zend_hash_num_elements(&parent_ce->function_table), 0); + + //遍历父类function_table,检查是否可被子类继承 + ZEND_HASH_FOREACH_STR_KEY_PTR(&parent_ce->function_table, key, func) { + zend_function *new_func = do_inherit_method(key, func, ce); + + if (new_func) { + _zend_hash_append_ptr(&ce->function_table, key, new_func); + } + } ZEND_HASH_FOREACH_END(); +} +``` + From ee75ba0af591705c8b2fdcedf433a054fdfbdac5 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Tue, 28 Mar 2017 10:51:53 +0800 Subject: [PATCH 096/379] update --- 3/zend_extends.md | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/3/zend_extends.md b/3/zend_extends.md index db7545a..1f4d1fa 100644 --- a/3/zend_extends.md +++ b/3/zend_extends.md @@ -158,6 +158,9 @@ static void do_inherit_class_constant(zend_string *name, zval *zv, zend_class_en ``` #### 3.4.3.3 继承方法 +与属性一样,子类可以继承父类的公有、受保护的方法,方法的继承比较复杂,因为会有访问控制、抽象类、接口、Trait等多种限制条件。实现上与前面几种相同,即父类的function_table合并到子类的function_table中。 + +首先是将子类function_table扩大,以容纳父子类全部方法,然后遍历父类function_table,逐个判断是否可被子类继承,如果可被继承则插入到子类function_table中。 ```c if (zend_hash_num_elements(&parent_ce->function_table)) { //扩展子类的function_table哈希表大小 @@ -175,5 +178,44 @@ if (zend_hash_num_elements(&parent_ce->function_table)) { } ZEND_HASH_FOREACH_END(); } ``` +在合并的过程中需要对父类的方法进行一系列检查,最简单的情况就是父类中定义的方法在子类中不存在,这种情况比较简单,直接将父类的zend_function复制一份给子类。 +```c +static zend_function *do_inherit_method(zend_string *key, zend_function *parent, zend_class_entry *ce) +{ + zval *child = zend_hash_find(&ce->function_table, key); + if(child){ + //方法与子类冲突 + ... + } + //父子类方法不冲突,直接复制 + return zend_duplicate_function(parent, ce); +} +``` +当然这里不完全是复制:如果继承的父类是内部类则会硬拷贝一份zend_function结构(此结构的指针成员不复制);如果父类是用户自定义的类,且继承的方法没有静态变量则不会硬拷贝,而是增加zend_function的引用计数(zend_op_array.refcount)。 +```c +//func是父类成员方法,ce是子类 +static zend_function *zend_duplicate_function(zend_function *func, zend_class_entry *ce) +{ + zend_function *new_function; + + if (UNEXPECTED(func->type == ZEND_INTERNAL_FUNCTION)) { + //内部函数 + //如果子类也是内部类则会调用malloc分配内存(不会被回收),否则在zend内存池分配 + ... + }else{ + if (func->op_array.refcount) { + (*func->op_array.refcount)++; + } + if (EXPECTED(!func->op_array.static_variables)) { + return func; + } + + //硬拷贝 + new_function = zend_arena_alloc(&CG(arena), sizeof(zend_op_array)); + memcpy(new_function, func, sizeof(zend_op_array)); + } +} +``` +合并时另外一个比较复杂的情况是父类与子类中的方法冲突了,即父子类定义了同名方法。 From 42696d988b28064d60390cd9f1f5625e0b606ff9 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Wed, 29 Mar 2017 18:19:47 +0800 Subject: [PATCH 097/379] update --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d333204..e4b72da 100644 --- a/README.md +++ b/README.md @@ -42,7 +42,7 @@ * 第6章 扩展开发 ## 反馈 -[交流&扯淡](https://github.com/pangudashu/php7-internal/issues/3) +[交流&吐槽](https://github.com/pangudashu/php7-internal/issues/3) [错误反馈](https://github.com/pangudashu/php7-internal/issues/2) From 6702970d9f422045daa3399448f2109759b178b3 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Wed, 29 Mar 2017 20:28:37 +0800 Subject: [PATCH 098/379] add override --- 3/zend_extends.md | 73 ++++++++++++++++++++++++++++++++++++++++++++++- README.md | 14 ++++----- 2 files changed, 78 insertions(+), 9 deletions(-) diff --git a/3/zend_extends.md b/3/zend_extends.md index 1f4d1fa..11f5233 100644 --- a/3/zend_extends.md +++ b/3/zend_extends.md @@ -218,4 +218,75 @@ static zend_function *zend_duplicate_function(zend_function *func, zend_class_en } } ``` -合并时另外一个比较复杂的情况是父类与子类中的方法冲突了,即父子类定义了同名方法。 +合并时另外一个比较复杂的情况是父类与子类中的方法冲突了,即子类重写了父类的方法,这种情况需要对父子类以及要合并的方法进行一系列检查,这一步在`do_inheritance_check_on_method()`中完成,具体情况如下: + +__(1)抽象子类的抽象方法与抽象父类的抽象方法冲突:__ 无法重写,Fatal错误。 +```php +abstract class B extends A { + abstract function test(); +} +abstract class A +{ + abstract function test(); +} + +============================ +PHP Fatal error: Can't inherit abstract function A::test() (previously declared abstract in B) +``` +判断逻辑: +```c +if ((parent->common.scope->ce_flags & ZEND_ACC_INTERFACE) == 0 //父类非接口 + && parent->common.fn_flags & ZEND_ACC_ABSTRACT //父类方法为抽象方法 + && parent->common.scope != (child->common.prototype ? child->common.prototype->common.scope : child->common.scope) + && child->common.fn_flags & (ZEND_ACC_ABSTRACT|ZEND_ACC_IMPLEMENTED_ABSTRACT) //子类方法为抽象或实现了抽象方法 +) { + zend_error_noreturn(E_COMPILE_ERROR, "Can't inherit abstract function %s::%s() (previously declared abstract in %s)",...); +} +``` +__(2)父类方法为final:__ Fatal错误,final成员方法不得被重写。 +判断逻辑: +```c +if (UNEXPECTED(parent_flags & ZEND_ACC_FINAL)) { + zend_error_noreturn(E_COMPILE_ERROR, "Cannot override final method %s::%s()", ...); +} +``` +__(3)父子类方法静态属性不一致:__ 父类方法为非静态而子类的是静态(或相反),Fatal错误。 +```php +class A { + public function test(){} +} + +class B extends A { + static public function test(){} +} + +============================ +PHP Fatal error: Cannot make non static method A::test() static in class B +``` +判断逻辑: +```c +if (UNEXPECTED((child_flags & ZEND_ACC_STATIC) != (parent_flags & ZEND_ACC_STATIC))) { + zend_error_noreturn(E_COMPILE_ERROR,...); +} +``` + +__(4)抽象子类的抽象方法覆盖父类非抽象方法:__ Fatal错误。 +```php +class A { + public function test(){} +} + +abstract class B extends A { + abstract public function test(); +} + +============================ +PHP Fatal error: Cannot make non abstract method A::test() abstract in class B +``` +判断逻辑: +```c +if (UNEXPECTED((child_flags & ZEND_ACC_ABSTRACT) > (parent_flags & ZEND_ACC_ABSTRACT))) { + zend_error_noreturn(E_COMPILE_ERROR, "Cannot make non abstract method %s::%s() abstract in class %s",...); +} +``` +__(5)__ diff --git a/README.md b/README.md index e4b72da..b509e9e 100644 --- a/README.md +++ b/README.md @@ -24,26 +24,24 @@ * 3.4 面向对象实现 * [3.4.1 类](3/zend_class.md) * [3.4.2 对象](3/zend_object.md) - * 3.4.3 继承(3/zend_extends.md) - * 3.4.4 成员属性(3/zend_prop.md) + * [3.4.3 继承](3/zend_extends.md) + * 3.4.4 动态成员属性(3/zend_prop.md) * 3.4.5 魔术方法 * 3.4.6 抽象类和接口 * 3.5 运行时缓存(3/zend_runtime_cache.md) -* [第4章 PHP语法实现](4/php_language.md) +* [第4章 PHP基础语法实现](4/php_language.md) * 4.1 变量 * 4.2 运算符 * 4.3 选择结构 * 4.4 循环结构 * 4.5 跳转语句 - * 4.6 函数 * 第5章 内存管理 * [5.1 Zend内存池](5/zend_alloc.md) - * 5.2 垃圾回收(gc.md) + * 5.2 引用计数() + * 5.3 垃圾回收(gc.md) * 第6章 扩展开发 ## 反馈 -[交流&吐槽](https://github.com/pangudashu/php7-internal/issues/3) - -[错误反馈](https://github.com/pangudashu/php7-internal/issues/2) +[交流&吐槽](https://github.com/pangudashu/php7-internal/issues/3) [错误反馈](https://github.com/pangudashu/php7-internal/issues/2) From b42bc60df0df1f42735338874ba360acab5cfb3a Mon Sep 17 00:00:00 2001 From: qinpeng Date: Wed, 29 Mar 2017 20:55:54 +0800 Subject: [PATCH 099/379] update --- 3/zend_extends.md | 34 +++++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/3/zend_extends.md b/3/zend_extends.md index 11f5233..d937e00 100644 --- a/3/zend_extends.md +++ b/3/zend_extends.md @@ -219,6 +219,14 @@ static zend_function *zend_duplicate_function(zend_function *func, zend_class_en } ``` 合并时另外一个比较复杂的情况是父类与子类中的方法冲突了,即子类重写了父类的方法,这种情况需要对父子类以及要合并的方法进行一系列检查,这一步在`do_inheritance_check_on_method()`中完成,具体情况如下: +```c +static void do_inheritance_check_on_method(zend_function *child, zend_function *parent) +{ + uint32_t child_flags; + uint32_t parent_flags = parent->common.fn_flags; + ... +} +``` __(1)抽象子类的抽象方法与抽象父类的抽象方法冲突:__ 无法重写,Fatal错误。 ```php @@ -289,4 +297,28 @@ if (UNEXPECTED((child_flags & ZEND_ACC_ABSTRACT) > (parent_flags & ZEND_ACC_ABST zend_error_noreturn(E_COMPILE_ERROR, "Cannot make non abstract method %s::%s() abstract in class %s",...); } ``` -__(5)__ +__(5)子类方法限制父类方法访问权限:__ Fatal错误,不允许派生类限制父类方法的访问权限,如父类方法为public,而子类试图重写为protected/private。 +```php +class A { + public function test(){} +} + +class B extends A { + protected function test(){} +} + +============================ +PHP Fatal error: Access level to B::test() must be public (as in class A) +``` +判断逻辑: +```c +//ZEND_ACC_PPP_MASK = (ZEND_ACC_PUBLIC | ZEND_ACC_PROTECTED | ZEND_ACC_PRIVATE) +if (UNEXPECTED((child_flags & ZEND_ACC_PPP_MASK) > (parent_flags & ZEND_ACC_PPP_MASK))) { + zend_error_noreturn(E_COMPILE_ERROR, "Access level to %s::%s() must be %s (as in class %s)%s", ...); +} else if (((child_flags & ZEND_ACC_PPP_MASK) < (parent_flags & ZEND_ACC_PPP_MASK)) + && ((parent_flags & ZEND_ACC_PPP_MASK) & ZEND_ACC_PRIVATE)) { + child->common.fn_flags |= ZEND_ACC_CHANGED; +} +``` + + From 5cf59c80fe5fae0944054d669423141705465f54 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Thu, 30 Mar 2017 13:19:00 +0800 Subject: [PATCH 100/379] update --- 3/zend_compile_opcode.md | 8 ++++---- 3/zend_compile_parse.md | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/3/zend_compile_opcode.md b/3/zend_compile_opcode.md index 1dae502..f48e7da 100644 --- a/3/zend_compile_opcode.md +++ b/3/zend_compile_opcode.md @@ -1,8 +1,8 @@ ### 3.1.2 抽象语法树编译流程 -上一小节我们简单介绍了从PHP代码解析为抽象语法树的过程,这一节我们再介绍下从__抽象语法树->Opcodes__的过程。 +上一小节我们简单介绍了从PHP代码解析为抽象语法树的过程,这一节我们再介绍下从 __抽象语法树->Opcodes__ 的过程。 -语法解析过程的产物保存于CG(AST),接着zend引擎会把AST进一步编译为__zend_op_array__,它是编译阶段最终的产物,也是执行阶段的输入,后面我们介绍的东西基本都是围绕zend_op_array展开的,AST解析过程确定了当前脚本定义了哪些变量,并为这些变量__顺序编号__,这些值在使用时都是按照这个编号获取的,另外也将变量的初始化值、调用的函数/类/常量名称等值(称之为字面量)保存到zend_op_array.literals中,这些字面量也有一个唯一的编号,所以执行的过程实际就是根据各指令调用不同的C函数,然后根据变量、字面量、临时变量的编号对这些值进行处理加工。 +语法解析过程的产物保存于CG(AST),接着zend引擎会把AST进一步编译为 __zend_op_array__ ,它是编译阶段最终的产物,也是执行阶段的输入,后面我们介绍的东西基本都是围绕zend_op_array展开的,AST解析过程确定了当前脚本定义了哪些变量,并为这些变量 __顺序编号__ ,这些值在使用时都是按照这个编号获取的,另外也将变量的初始化值、调用的函数/类/常量名称等值(称之为字面量)保存到zend_op_array.literals中,这些字面量也有一个唯一的编号,所以执行的过程实际就是根据各指令调用不同的C函数,然后根据变量、字面量、临时变量的编号对这些值进行处理加工。 我们首先看下zend_op_array的结构,明确几个关键信息,然后再看下ast编译为zend_op_array的过程。 #### 3.1.2.1 zend_op_array数据结构 @@ -76,7 +76,7 @@ typedef union _znode_op { opcode各字段含义下面展开说明。 ##### 3.1.2.1.1 handler -handler为每条opcode对应的C语言编写的__处理过程__,所有opcode对应的处理过程定义在`zend_vm_def.h`中,值得注意的是这个文件并不是编译时用到的,因为opcode的__处理过程__有三种不同的提供形式:CALL、SWITCH、GOTO,默认方式为CALL,这个是什么意思呢? +handler为每条opcode对应的C语言编写的 __处理过程__ ,所有opcode对应的处理过程定义在`zend_vm_def.h`中,值得注意的是这个文件并不是编译时用到的,因为opcode的 __处理过程__ 有三种不同的提供形式:CALL、SWITCH、GOTO,默认方式为CALL,这个是什么意思呢? 每个opcode都代表了一些特定的处理操作,这个东西怎么提供呢?一种是把每种opcode负责的工作封装成一个function,然后执行器循环执行即可,这就是CALL模式的工作方式;另外一种是把所有opcode的处理方式通过C语言里面的label标签区分开,然后执行器执行的时候goto到相应的位置处理,这就是GOTO模式的工作方式;最后还有一种方式是把所有的处理方式写到一个switch下,然后通过case不同的opcode执行具体的操作,这就是SWITCH模式的工作方式。 @@ -332,7 +332,7 @@ ZEND_API zend_op_array *compile_file(zend_file_handle *file_handle, int type) ``` compile_file()操作中有几个保存原来值的操作,这是因为这个函数在PHP脚本执行中并不会只执行一次,主脚本执行时会第一次调用,而include、require也会调用,所以需要先保存当前值,然后执行完再还原回去。 -AST->zend_op_array编译是在__zend_compile_top_stmt()__中完成,这个函数是总入口,会被多次递归调用: +AST->zend_op_array编译是在 __zend_compile_top_stmt()__ 中完成,这个函数是总入口,会被多次递归调用: ```c //zend_compile.c void zend_compile_top_stmt(zend_ast *ast) diff --git a/3/zend_compile_parse.md b/3/zend_compile_parse.md index 538920e..3e620b5 100644 --- a/3/zend_compile_parse.md +++ b/3/zend_compile_parse.md @@ -1,9 +1,9 @@ ### 3.1.1 词法解析、语法解析 -这一节我们分析下PHP的解析阶段,即__PHP代码->抽象语法树(AST)__的过程。 +这一节我们分析下PHP的解析阶段,即 __PHP代码->抽象语法树(AST)__ 的过程。 PHP使用re2c、bison完成这个阶段的工作: -* __re2c__:词法分析器,将输入分割为一个个有意义的词块,称为token -* __bison__:语法分析器,确定词法分析器分割出的token是如何彼此关联的 +* __re2c:__ 词法分析器,将输入分割为一个个有意义的词块,称为token +* __bison:__ 语法分析器,确定词法分析器分割出的token是如何彼此关联的 例如: ```php From a812b332ec23404d83e59cbdc32eb614603b71e1 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Fri, 31 Mar 2017 19:54:53 +0800 Subject: [PATCH 101/379] finish extends --- 3/zend_extends.md | 76 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) diff --git a/3/zend_extends.md b/3/zend_extends.md index d937e00..0ca1685 100644 --- a/3/zend_extends.md +++ b/3/zend_extends.md @@ -243,6 +243,8 @@ PHP Fatal error: Can't inherit abstract function A::test() (previously declared ``` 判断逻辑: ```c +//do_inheritance_check_on_method(): + if ((parent->common.scope->ce_flags & ZEND_ACC_INTERFACE) == 0 //父类非接口 && parent->common.fn_flags & ZEND_ACC_ABSTRACT //父类方法为抽象方法 && parent->common.scope != (child->common.prototype ? child->common.prototype->common.scope : child->common.scope) @@ -254,6 +256,8 @@ if ((parent->common.scope->ce_flags & ZEND_ACC_INTERFACE) == 0 //父类非接口 __(2)父类方法为final:__ Fatal错误,final成员方法不得被重写。 判断逻辑: ```c +//do_inheritance_check_on_method(): + if (UNEXPECTED(parent_flags & ZEND_ACC_FINAL)) { zend_error_noreturn(E_COMPILE_ERROR, "Cannot override final method %s::%s()", ...); } @@ -273,6 +277,8 @@ PHP Fatal error: Cannot make non static method A::test() static in class B ``` 判断逻辑: ```c +//do_inheritance_check_on_method(): + if (UNEXPECTED((child_flags & ZEND_ACC_STATIC) != (parent_flags & ZEND_ACC_STATIC))) { zend_error_noreturn(E_COMPILE_ERROR,...); } @@ -293,6 +299,8 @@ PHP Fatal error: Cannot make non abstract method A::test() abstract in class B ``` 判断逻辑: ```c +//do_inheritance_check_on_method(): + if (UNEXPECTED((child_flags & ZEND_ACC_ABSTRACT) > (parent_flags & ZEND_ACC_ABSTRACT))) { zend_error_noreturn(E_COMPILE_ERROR, "Cannot make non abstract method %s::%s() abstract in class %s",...); } @@ -312,6 +320,8 @@ PHP Fatal error: Access level to B::test() must be public (as in class A) ``` 判断逻辑: ```c +//do_inheritance_check_on_method(): + //ZEND_ACC_PPP_MASK = (ZEND_ACC_PUBLIC | ZEND_ACC_PROTECTED | ZEND_ACC_PRIVATE) if (UNEXPECTED((child_flags & ZEND_ACC_PPP_MASK) > (parent_flags & ZEND_ACC_PPP_MASK))) { zend_error_noreturn(E_COMPILE_ERROR, "Access level to %s::%s() must be %s (as in class %s)%s", ...); @@ -320,5 +330,71 @@ if (UNEXPECTED((child_flags & ZEND_ACC_PPP_MASK) > (parent_flags & ZEND_ACC_PPP_ child->common.fn_flags |= ZEND_ACC_CHANGED; } ``` +__(6)剩余检查情况:__ 除了上面5中情形下无法重写方法,剩下还有一步对函数参数的检查,这个过程我们整体看一下。 +```c +//do_inheritance_check_on_method(): + +if (UNEXPECTED(!zend_do_perform_implementation_check(child, parent))) { + ... + zend_error(error_level, "Declaration of %s %s be compatible with %s", ZSTR_VAL(child_prototype), error_verb, ZSTR_VAL(method_prototype)); + zend_string_free(child_prototype); + zend_string_free(method_prototype); +} +``` +实际上`zend_do_perform_implementation_check()`这个函数是用来检查一个方法是否实现了某抽象方法的,继承的时候遵循的也是这个规则,所以这里可以将父类方法理解为抽象方法,只有子类方法实现了该"抽象方法"才能重写父类方法。 +```c +static zend_bool zend_do_perform_implementation_check(const zend_function *fe, const zend_function *proto) +{ + ... + //如果检查的方法是__construct且父类方法不是interface和abstract则子类__construct覆盖父类的 + if ((fe->common.fn_flags & ZEND_ACC_CTOR) + && ((proto->common.scope->ce_flags & ZEND_ACC_INTERFACE) == 0 + && (proto->common.fn_flags & ZEND_ACC_ABSTRACT) == 0)) { + return 1; + } + + //如果父类方法为私有方法则子类方法可以覆盖 + if (proto->common.fn_flags & ZEND_ACC_PRIVATE) { + return 1; + } + + //如果父类方法必传参数小于子类的或者父类的总参数大于子类的则不能覆盖 + //如: + // 父类 public function test($a, $b = 3){} + // 子类 public function test($a, $b){} + if (proto->common.required_num_args < fe->common.required_num_args + || proto->common.num_args > fe->common.num_args) { + return 0; + } + + //可变函数,暂未理解这里的可变函数指哪类,忽略 + ... + + //如果有定义的参数检查参数类型是否匹配,如果显式声明了参数类型则父子类方法必须匹配 + for (i = 0; i < num_args; i++) { + zend_arg_info *fe_arg_info = &fe->common.arg_info[i]; + if (!zend_do_perform_type_hint_check(fe, fe_arg_info, proto, proto_arg_info)) { + return 0; + } + + //是否引用也必须一致 + if (fe_arg_info->pass_by_reference != proto_arg_info->pass_by_reference) { + return 0; + } + } + + //如果父类方法声明了返回值类型则子类方法必须声明且类型一致,相反如果子类声明了而父类无要求则可以 + if (proto->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE) { + if (!(fe->common.fn_flags & ZEND_ACC_HAS_RETURN_TYPE)) { + return 0; + } + + if (!zend_do_perform_type_hint_check(fe, fe->common.arg_info - 1, proto, proto->common.arg_info - 1)) { + return 0; + } + } +} +``` +这个判断过程还是比较复杂的,有些地方很难理解为什么设计,想了解完整过程的可以自行翻下代码。 From c375d19936cad31057bf9b6757d4c9ff4903a7fc Mon Sep 17 00:00:00 2001 From: qinpeng Date: Fri, 31 Mar 2017 20:07:53 +0800 Subject: [PATCH 102/379] update --- 3/zend_extends.md | 2 ++ 3/zend_prop.md | 7 ++----- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/3/zend_extends.md b/3/zend_extends.md index 0ca1685..a98c6e3 100644 --- a/3/zend_extends.md +++ b/3/zend_extends.md @@ -144,6 +144,8 @@ __(4)合并properties_info哈希表:__ 这也是非常关键的一步,上面 这个地方相对比较复杂,具体的合并策略在`do_inherit_property()`中,这里不再罗列代码。 +所以,继承类实际上是把父类的属性、常量、方法合并到了子类里面,上一节介绍实例化时会将普通成员属性值复制到对象中去,这样在实例化时子类就与普通的类的操作没有任何差别了。 + #### 3.4.3.2 继承常量 常量的合并策略比较简单,如果父类与子类冲突时用子类的,不冲突时则将父类的常量合并到子类。 ```c diff --git a/3/zend_prop.md b/3/zend_prop.md index 8c06370..b498c00 100644 --- a/3/zend_prop.md +++ b/3/zend_prop.md @@ -1,7 +1,4 @@ -### 3.4.4 成员属性 -前面类、对象两节中已经对成员属性进行了很多介绍,包括成员属性的类型、静态/非静态属性的存储等等,这一节之所以又把成员属性单独列出来是因为PHP中成员属性还有一些前面未讲到的特性,如:父子类属性之间的存储、动态属性等,这一节我们再详细的、总结性的介绍下。 +### 3.4.4 动态成员属性 + -#### 3.4.4.1 静态属性 -静态属性只存在于类中,各对象之间共享,单一的类情况比较简单,全部静态属性都保存在`zend_class_entry.default_static_members_table`中 -#### 3.4.4.2 非静态属性 From 17290f7828e13d5a4da5111d1d709a7196cdd2a9 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Sat, 1 Apr 2017 18:12:06 +0800 Subject: [PATCH 103/379] update --- 3/zend_prop.md | 74 ++++++++++++++++++++++++++++++++++++++++++- img/zend_dy_prop.png | Bin 0 -> 17049 bytes 2 files changed, 73 insertions(+), 1 deletion(-) create mode 100644 img/zend_dy_prop.png diff --git a/3/zend_prop.md b/3/zend_prop.md index b498c00..f3d8204 100644 --- a/3/zend_prop.md +++ b/3/zend_prop.md @@ -1,4 +1,76 @@ -### 3.4.4 动态成员属性 +### 3.4.4 动态属性 +PHP中除了显示的在类中定义成员属性外,还可以动态的创建非静态成员属性,这种属性称之为动态属性,比如: +```php +class my_class { + public $id = 123; + public function test($name, $value){ + $this->$name = $value; + } +} + +$obj = new my_class; +$obj->test("prop_1", array(1,2,3)); + +print_r($obj); +``` +在`test()`方法中直接操作了没有定义的成员属性,这种动态属性 __首次定义__ 只能在类的成员方法中完成,无法在类之外定义,比如:`$obj->prop_2 = array(1,2,3);`,但是首次定义完之后就可以像普通成员属性一样使用了。上面的例子将输出: +``` +my_class Object +( + [id] => 123 + [prop_1] => Array + ( + [0] => 1 + [1] => 2 + [2] => 3 + ) +) +``` +前面类、对象两节曾介绍,非静态成员属性值在实例化时保存到了对象中,属性的操作按照编译时按顺序编好的序号操作,各对象对其非静态成员属性的操作互不干扰,那么动态属性是在运行时创建的,它是如何存储的呢? + +与普通非静态属性不同,动态创建的属性保存在`zend_object->properties`哈希表中,查找的时候首先按照普通属性在`zend_class_entry.properties_info`找,没有找到再去`zend_object->properties`继续查找。动态属性的创建过程(即:修改属性的操作): +```c +//zend_object->handlers->write_property: +ZEND_API void zend_std_write_property(zval *object, zval *member, zval *value, void **cache_slot) +{ + ... + zobj = Z_OBJ_P(object); + //先在zend_class_entry.properties_info查找此属性 + property_offset = zend_get_property_offset(zobj->ce, Z_STR_P(member), (zobj->ce->__set != NULL), cache_slot); + + if (EXPECTED(property_offset != ZEND_WRONG_PROPERTY_OFFSET)) { + if (EXPECTED(property_offset != ZEND_DYNAMIC_PROPERTY_OFFSET)) { + //普通属性,直接根据根据属性ofsset取出属性值 + } else if (EXPECTED(zobj->properties != NULL)) { //有动态属性 + ... + //从动态属性中查找 + if ((variable_ptr = zend_hash_find(zobj->properties, Z_STR_P(member))) != NULL) { +found: + zend_assign_to_variable(variable_ptr, value, IS_CV); + goto exit; + } + } + } + + if (zobj->ce->__set) { + //定义了__set()魔法函数 + }else if (EXPECTED(property_offset != ZEND_WRONG_PROPERTY_OFFSET)){ + if (EXPECTED(property_offset != ZEND_DYNAMIC_PROPERTY_OFFSET)) { + ... + } else { + //首次创建动态属性将在这里完成 + if (!zobj->properties) { + rebuild_object_properties(zobj); + } + //将动态属性插入properties + zend_hash_add_new(zobj->properties, Z_STR_P(member), value); + } + } +} +``` +上面就是成员属性的修改过程,普通属性根据其offset再从对象中取出属性值进行修改,而首次创建动态属性将通过`rebuild_object_properties()`初始化`zend_object->properties`哈希表,后面再创建动态属性直接插入此哈希表,`rebuild_object_properties()`过程并不仅仅是创建一个HashTable,还会将普通成员属性值插入到这个数组中,这里的插入并不是增加原zend_value的refcount,而是创建了一个IS_INDIRECT类型的zval,指向原属性值zval,具体结构如下图。 + +![](../img/zend_dy_prop.png) diff --git a/img/zend_dy_prop.png b/img/zend_dy_prop.png new file mode 100644 index 0000000000000000000000000000000000000000..ed72def4ef4431b96ca594e0ad8c0cf352f57c2e GIT binary patch literal 17049 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 Date: Sat, 1 Apr 2017 20:40:26 +0800 Subject: [PATCH 104/379] update --- 1/base_introduction.md | 13 ++++++------- 3/zend_prop.md | 22 ++++++++++++++++++++++ README.md | 2 +- 3 files changed, 29 insertions(+), 8 deletions(-) diff --git a/1/base_introduction.md b/1/base_introduction.md index b188b31..a1b12c2 100644 --- a/1/base_introduction.md +++ b/1/base_introduction.md @@ -1,14 +1,13 @@ -## 1.1 PHP的基本概念 - +## 1.1 基本概念 +PHP,即“PHP: Hypertext Preprocessor”,是一种被广泛应用的开源通用脚本语言,尤其适用于 Web 开发并可嵌入 HTML 中去。它的语法利用了 C、Java 和 Perl,易于学习。该语言的主要目标是允许 web 开发人员快速编写动态生成的 web 页面,但 PHP 的用途远不只于此。 ### 1.1.1 SAPI -PHP本身可以理解为是一个库函数,它有标准的输入、输出,而SAPI可以认为是PHP的一个使用者,它可以调用PHP内核提供的一些接口,所以严格意义上讲SAPI并不算PHP的一部分,最常用的SAPI就是cli、php-fpm这两个了,它们是再普通不过的C程序了,main函数通常也是定义在SAPI中,PHP就是一个纯碎的解析器。 +PHP本身可以理解为是一个库函数,它有标准的输入、输出,而SAPI可以认为是PHP的一个使用者,它可以调用PHP内核提供的一些接口,所以严格意义上讲SAPI并不算PHP内核的一部分,最常用的SAPI就是cli、php-fpm这两个了,它们是再普通不过的C程序了,main函数通常也是定义在SAPI中,而PHP就是一个纯碎的解析器。 -### 1.1.2 Zend引擎 -Zend是PHP语言实现的核心,比如语法分析、代码执行等等都是Zend引擎实现的,这是PHP最基础、最核心的部分,我们后面绝大部分的源码分析都是针对Zend的。 +### 1.1.2 PHP -### 1.1.3 PHP/Zend扩展 +### 1.1.3 Zend引擎 +Zend是PHP语言实现的核心,比如语法分析、代码执行等等都是Zend引擎实现的,这是PHP最基础、最核心的部分,我们后面绝大部分的源码分析都是针对Zend的。 -### 1.1.4 Opcode diff --git a/3/zend_prop.md b/3/zend_prop.md index f3d8204..7e88f89 100644 --- a/3/zend_prop.md +++ b/3/zend_prop.md @@ -73,4 +73,26 @@ found: ![](../img/zend_dy_prop.png) +成员属性的读取通过`zend_object->handlers->read_property`(默认zend_std_read_property())函数完成,动态属性的查找过程实际与`write_property`中相同: +```c +zval *zend_std_read_property(zval *object, zval *member, int type, void **cache_slot, zval *rv) +{ + ... + zobj = Z_OBJ_P(object); + + //首先查找zend_class_entry.properties_info,普通属性可以在这里找到 + property_offset = zend_get_property_offset(zobj->ce, Z_STR_P(member), (type == BP_VAR_IS) || (zobj->ce->__get != NULL), cache_slot); + if (EXPECTED(property_offset != ZEND_WRONG_PROPERTY_OFFSET)) { + if (EXPECTED(property_offset != ZEND_DYNAMIC_PROPERTY_OFFSET)) { + //普通属性 + retval = OBJ_PROP(zobj, property_offset); + } else if (EXPECTED(zobj->properties != NULL)) { + //动态属性从zend_object->properties中查找 + retval = zend_hash_find(zobj->properties, Z_STR_P(member)); + if (EXPECTED(retval)) goto exit; + } + } + ... +} +``` diff --git a/README.md b/README.md index b509e9e..59465ac 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ * [3.4.1 类](3/zend_class.md) * [3.4.2 对象](3/zend_object.md) * [3.4.3 继承](3/zend_extends.md) - * 3.4.4 动态成员属性(3/zend_prop.md) + * [3.4.4 动态属性](3/zend_prop.md) * 3.4.5 魔术方法 * 3.4.6 抽象类和接口 * 3.5 运行时缓存(3/zend_runtime_cache.md) From e0ae78c1abb116cdc94732d931b1edcd237fd1e7 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Sun, 2 Apr 2017 17:44:57 +0800 Subject: [PATCH 105/379] add runtime cache --- 3/zend_runtime_cache.md | 32 ++++++++++++++++++++++++++++++++ img/runtime_cache_1.png | Bin 0 -> 22958 bytes 2 files changed, 32 insertions(+) create mode 100644 3/zend_runtime_cache.md create mode 100644 img/runtime_cache_1.png diff --git a/3/zend_runtime_cache.md b/3/zend_runtime_cache.md new file mode 100644 index 0000000..ac120d0 --- /dev/null +++ b/3/zend_runtime_cache.md @@ -0,0 +1,32 @@ +## 3.5 运行时缓存 +在执行期间,PHP经常需要根据名称去不同的哈希表中查找常量、函数、类、成员方法、成员属性等,因此PHP提供了一种缓存机制用于缓存根据名称查找到的结果,以便再次执行同一opcode时直接复用上次缓存的值,无需再次查找,从而提高执行效率。举个例子具体说明下: +```php +class my_class { + public $id = 123; + + public function test() { + echo $this->id; + } +} + +$obj = new my_class; +$obj->test(); +$obj->test(); +``` +这个例子中我们定义了一个类,然后两次调用同一个成员方法,这个成员方法输出了一个成员属性,用到运行时缓存的地方在成员属性的查找,前面我们已经讲过成员属性的查找过程:"首先根据对象找到所属zend_class_entry,然后再根据属性名查找`zend_class_entry.properties_info`哈希表,得到`zend_property_info`,最后根据这个结构的offset定位属性值的存储位置",这个地方PHP会缓存两个东西:zend_class_entry、zend_property_info.offset,这样再次执行时直接根据操作数从缓存数组中取出这两个值使用,从而避免再次查找。 + +所以运行时缓存机制是在同一opcode执行多次的情况下才会生效,特别注意这里的同一opcode指的并不是opcode值相同,而是指内存里的同一份数据,比如:`echo $a; echo $a;`这种就不算,因为这是两条opcode。 + +此缓存机制主要针对的就是通过静态名称查找HashTable的情况,那么缓存是如何保存和索引的呢? + +运行时缓存是基于CONST操作数存储的,也就是说只有包含IS_CONST类型的操作数才有可能用到此机制,缓存的存储格式是一个数组,用于保存缓存的数据指针,而指针在数组中的起始存储位置则保存在CONST操作数对应的`zval.u2.cache_slot`中(前面讲过,CONST操作数对应值的zval保存在zend_op_array->literals数组中)。上面那个例子对应的缓存结构: + +![](../img/runtime_cache_1.png) + +* __(1)__ 第一次执行`echo $this->id;`时首先根据$this取出zend_class_entry,然后根据“id”查找zend_class_entry.properties_info找到属性zend_property_info,取出此结构的offset,第一次执行后将zend_class_entry及offset保存到了test()函数的zend_op_array->run_time_cache中,占用16字节,起始位置为0,这个值记录在“id”的zval.u2.cache_slot中; +* __(2)__ 之后再次执行`echo $this->id;`时直接根据opline从zend_op_literals中取出“id”的zval,得到缓存数据保存位置:0,然后去zend_op_array->run_time_cache取出缓存的zend_class_entry、offset。 + + + + + diff --git a/img/runtime_cache_1.png b/img/runtime_cache_1.png new file mode 100644 index 0000000000000000000000000000000000000000..1c40f7a9c52d311ce8f9fe34a58dd412198c8a55 GIT binary patch literal 22958 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 Nux8m>RG53j{sYVcz`6hc literal 0 HcmV?d00001 From 34cf9f17a5a7474c65e783c6d36a29f73878f839 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Sun, 2 Apr 2017 18:11:31 +0800 Subject: [PATCH 106/379] update --- 3/zend_runtime_cache.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/3/zend_runtime_cache.md b/3/zend_runtime_cache.md index ac120d0..f09ff1c 100644 --- a/3/zend_runtime_cache.md +++ b/3/zend_runtime_cache.md @@ -26,7 +26,20 @@ $obj->test(); * __(1)__ 第一次执行`echo $this->id;`时首先根据$this取出zend_class_entry,然后根据“id”查找zend_class_entry.properties_info找到属性zend_property_info,取出此结构的offset,第一次执行后将zend_class_entry及offset保存到了test()函数的zend_op_array->run_time_cache中,占用16字节,起始位置为0,这个值记录在“id”的zval.u2.cache_slot中; * __(2)__ 之后再次执行`echo $this->id;`时直接根据opline从zend_op_literals中取出“id”的zval,得到缓存数据保存位置:0,然后去zend_op_array->run_time_cache取出缓存的zend_class_entry、offset。 +这个例子缓存数据占用了16字节(2个sizeof(void*))大小的空间,而有的只需要8字节,取决于操作类型: +* 8字节:常量、函数、类 +* 16字节:成员属性、成员方法、类常量 +另外一个问题是这些操作数的缓存位置(zval.u2.cache_slot)是在什么阶段确定的呢?实际上这个值是在编译阶段确定的,通过zend_op_array.cache_size记录缓存可用起始位置,编译过程中如果发现当前操作适用缓存机制,则根据缓存数据的大小从cache_size开始分配8或16字节给那个操作数,cache_size向后移动对应大小,然后将起始位置保存于CONST操作数的zval.u2.cache_slot中,执行时直接根据这个值读写缓存。 +具体缓存的读写通过以下几个宏完成: +```c +//设置缓存 +CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1/2)), 缓存的数据指针); +//读取缓存 +CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1/2))); + +//EX_CONSTANT(opline->op1/2)是取当前IS_CONST操作数对应数据的zval +``` From 921664cb31291afe9f8cb354707196aa0e227709 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Sun, 2 Apr 2017 18:13:37 +0800 Subject: [PATCH 107/379] update --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 59465ac..d9675b5 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,7 @@ * [3.4.4 动态属性](3/zend_prop.md) * 3.4.5 魔术方法 * 3.4.6 抽象类和接口 - * 3.5 运行时缓存(3/zend_runtime_cache.md) + * [3.5 运行时缓存](3/zend_runtime_cache.md) * [第4章 PHP基础语法实现](4/php_language.md) * 4.1 变量 * 4.2 运算符 From be186a99e48d9ddce2b15fc7dd19019cfcbf288b Mon Sep 17 00:00:00 2001 From: qinpeng Date: Mon, 3 Apr 2017 13:44:16 +0800 Subject: [PATCH 108/379] update --- 3/zend_runtime_cache.md | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/3/zend_runtime_cache.md b/3/zend_runtime_cache.md index f09ff1c..0080b1f 100644 --- a/3/zend_runtime_cache.md +++ b/3/zend_runtime_cache.md @@ -1,5 +1,5 @@ ## 3.5 运行时缓存 -在执行期间,PHP经常需要根据名称去不同的哈希表中查找常量、函数、类、成员方法、成员属性等,因此PHP提供了一种缓存机制用于缓存根据名称查找到的结果,以便再次执行同一opcode时直接复用上次缓存的值,无需再次查找,从而提高执行效率。举个例子具体说明下: +在本节开始之前我们先分析一个例子: ```php class my_class { public $id = 123; @@ -12,14 +12,23 @@ class my_class { $obj = new my_class; $obj->test(); $obj->test(); +... ``` -这个例子中我们定义了一个类,然后两次调用同一个成员方法,这个成员方法输出了一个成员属性,用到运行时缓存的地方在成员属性的查找,前面我们已经讲过成员属性的查找过程:"首先根据对象找到所属zend_class_entry,然后再根据属性名查找`zend_class_entry.properties_info`哈希表,得到`zend_property_info`,最后根据这个结构的offset定位属性值的存储位置",这个地方PHP会缓存两个东西:zend_class_entry、zend_property_info.offset,这样再次执行时直接根据操作数从缓存数组中取出这两个值使用,从而避免再次查找。 +这个例子定义了一个类,然后多次调用同一个成员方法,这个成员方法功能很简单:输出一个成员属性,根据前面对成员属性的介绍可以知道其查找过程为:"首先根据对象找到所属zend_class_entry,然后再根据属性名查找`zend_class_entry.properties_info`哈希表,得到`zend_property_info`,最后根据属性结构的offset定位到属性值的存储位置",概括一下这个过程就是:zend_object->zend_class_entry->properties_info->属性值,那么问题来了:每次执行`my_class::test()`时难道上面的过程都要完整走一遍吗? + +我们再仔细看下这个过程,字面量"id"在"$this->id"此条语句中就是用来索引属性的,不管执行多少次它的任务始终是这个,那么有没有一种办法将"id"与查找到的zend_class_entry、zend_property_info.offset建立一种关联关系保存下来,这样再次执行时直接根据"id"拿到前面关联的这两个数据,从而避免多次重复相同的工作呢?这就是本节将要介绍的内容:运行时缓存。 + +在执行期间,PHP经常需要根据名称去不同的哈希表中查找常量、函数、类、成员方法、成员属性等,因此PHP提供了一种缓存机制用于缓存根据名称查找到的结果,以便再次执行同一opcode时直接复用上次缓存的值,无需重复查找,从而提高执行效率。 + +开始提到的那个例子中会缓存两个东西:zend_class_entry、zend_property_info.offset,此缓存可以认为是opcode操作的缓存,它只属于"$this->id"此语句的opcode:这样再次执行这条opcode时就直接取出上次缓存的两个值。 所以运行时缓存机制是在同一opcode执行多次的情况下才会生效,特别注意这里的同一opcode指的并不是opcode值相同,而是指内存里的同一份数据,比如:`echo $a; echo $a;`这种就不算,因为这是两条opcode。 -此缓存机制主要针对的就是通过静态名称查找HashTable的情况,那么缓存是如何保存和索引的呢? +那么缓存是如何保存和索引的呢?执行opcode时如何知道缓存的位置? -运行时缓存是基于CONST操作数存储的,也就是说只有包含IS_CONST类型的操作数才有可能用到此机制,缓存的存储格式是一个数组,用于保存缓存的数据指针,而指针在数组中的起始存储位置则保存在CONST操作数对应的`zval.u2.cache_slot`中(前面讲过,CONST操作数对应值的zval保存在zend_op_array->literals数组中)。上面那个例子对应的缓存结构: +实际上运行时缓存是基于所属opcode中CONST操作数存储的,也就是说只有包含IS_CONST类型的操作数才有可能用到此机制,其它类型都不会用到,这是因为只有CONST操作数是固定不变的,其它CV、VAR等类型值都不是固定的,既然其值是不固定的那么缓存的值也就不是固定的,所以不会针对CONST以外类型的opcode操作进行缓存,还是以开始那个例子为例,比如:`echo $this->$var;`这种,操作数类型是CV,其正常查找时的zend_property_info是随$var值而变的,所以给他们建立一种不可变的关联关系,而:`echo $this->id;`中"id"是固定写死的,它索引到zend_property_info始终是不变的。 + +缓存的存储格式是一个数组,用于保存缓存的数据指针,而指针在数组中的起始存储位置则保存在CONST操作数对应的`zval.u2.cache_slot`中(前面讲过,CONST操作数对应值的zval保存在zend_op_array->literals数组中)。上面那个例子对应的缓存结构: ![](../img/runtime_cache_1.png) @@ -31,7 +40,7 @@ $obj->test(); * 8字节:常量、函数、类 * 16字节:成员属性、成员方法、类常量 -另外一个问题是这些操作数的缓存位置(zval.u2.cache_slot)是在什么阶段确定的呢?实际上这个值是在编译阶段确定的,通过zend_op_array.cache_size记录缓存可用起始位置,编译过程中如果发现当前操作适用缓存机制,则根据缓存数据的大小从cache_size开始分配8或16字节给那个操作数,cache_size向后移动对应大小,然后将起始位置保存于CONST操作数的zval.u2.cache_slot中,执行时直接根据这个值读写缓存。 +另外一个问题是这些操作数的缓存位置(zval.u2.cache_slot)是在什么阶段确定的呢?实际上这个值是在编译阶段确定的,通过zend_op_array.cache_size记录缓存可用起始位置,编译过程中如果发现当前操作适用缓存机制,则根据缓存数据的大小从cache_size开始分配8或16字节给那个操作数,cache_size向后移动对应大小,然后将起始位置保存于CONST操作数的zval.u2.cache_slot中,执行时直接根据这个值确定缓存位置。 具体缓存的读写通过以下几个宏完成: ```c @@ -43,3 +52,4 @@ CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1/2))); //EX_CONSTANT(opline->op1/2)是取当前IS_CONST操作数对应数据的zval ``` + From f38cbb2bf31344622ca821d3afdd98ab47752622 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Mon, 3 Apr 2017 16:03:15 +0800 Subject: [PATCH 109/379] add HashTable --- 2/zend_ht.md | 175 ++++++++++++++++++++------------------------ README.md | 2 +- img/zend_hash_1.png | Bin 0 -> 46516 bytes 3 files changed, 82 insertions(+), 95 deletions(-) create mode 100644 img/zend_hash_1.png diff --git a/2/zend_ht.md b/2/zend_ht.md index adab6e8..335c700 100644 --- a/2/zend_ht.md +++ b/2/zend_ht.md @@ -1,25 +1,21 @@ -# PHP哈希表(数组)的内核实现 +## 2.2 数组 +数组是PHP中非常强大、灵活的一种数据类型,它的底层实现为散列表(HashTable,也称作:哈希表),除了我们熟悉的PHP用户空间的Array类型之外,内核中也随处用到散列表,比如函数、类、常量、已include文件的索引表、全局符号表等都用的HashTable存储。 -PHP7内部哈希表,即PHP强大array结构的内核实现。 +散列表是根据关键码值(Key value)而直接进行访问的数据结构,它的key - value之间存在一个映射函数,可以根据key通过映射函数直接索引到对应的value值,它不以关键字的比较为基本操作,采用直接寻址技术(就是说,它是直接通过key映射到内存地址上去的),从而加快查找速度,在理想情况下,无须任何比较就可以找到待查关键字,查找的期望时间为O(1)。 -哈希表是PHP内部非常重要的数据结构,除了PHP用户空间的Array,内核也随处用到,比如函数、类、常量、已include文件的索引表、全局符号表等等都用到了哈希表。 +### 2.2.1 数组结构 +存放记录的数组称做散列表,这个数组用来存储value,而value具体在数组中的存储位置由映射函数根据key计算确定,映射函数可以采用取模的方式,key可以通过一些譬如“times 33”的算法得到一个整形值,然后与数组总大小取模得到在散列表中的存储位置。这是一个普通散列表的实现,PHP散列表的实现整体也是这个思路,只是有几个特殊的地方,下面就是PHP中HashTable的数据结构: -关于哈希结构PHP7+与PHP5+的区别可以翻下[[nikic]](http://nikic.github.io/2014/12/22/PHPs-new-hashtable-implementation.html)早些时候写的一篇文章,这里不作讨论。 - -(文中图画的的结构并不是php中的,而是根据php哈希的设计自己实现的一个,代码在:https://github.com/pangudashu/anywork/tree/master/hashtable) - -### 数据结构 ```c -//zend_types.h - +//Bucket:散列表中存储的元素 typedef struct _Bucket { - zval val; - zend_ulong h; /* hash value (or numeric index) */ - zend_string *key; /* string key or NULL for numerics */ + zval val; //存储的具体value,这里嵌入了一个zval,而不是一个指针 + zend_ulong h; //key根据times 33计算得到的哈希值,或者是数值索引编号 + zend_string *key; //存储元素的key } Bucket; +//HashTable结构 typedef struct _zend_array HashTable; - struct _zend_array { zend_refcounted_h gc; union { @@ -32,33 +28,41 @@ struct _zend_array { } v; uint32_t flags; } u; - uint32_t nTableMask; //哈希值计算掩码,等于nTableSize的负值(nTableMask = ~nTableSize + 1) - Bucket *arData; //存储元素数组,指向第一个Bucket - uint32_t nNumUsed; //已用Bucket数 - uint32_t nNumOfElements; //哈希表已有元素数 - uint32_t nTableSize; //哈希表总大小,为2的n次方 + uint32_t nTableMask; //哈希值计算掩码,等于nTableSize的负值(nTableMask = -nTableSize) + Bucket *arData; //存储元素数组,指向第一个Bucket + uint32_t nNumUsed; //已用Bucket数 + uint32_t nNumOfElements; //哈希表有效元素数 + uint32_t nTableSize; //哈希表总大小,为2的n次方 uint32_t nInternalPointer; zend_long nNextFreeElement; //下一个可用的数值索引,如:arr[] = 1;arr["a"] = 2;arr[] = 3; 则nNextFreeElement = 2; dtor_func_t pDestructor; }; ``` +HashTable中有两个非常相近的值:`nNumUsed`、`nNumOfElements`,`nNumOfElements`表示哈希表已有元素数,那这个值不跟`nNumUsed`一样吗?为什么要定义两个呢?实际上它们有不同的含义,当将一个元素从哈希表删除时并不会将对应的Bucket移除,而是将Bucket存储的zval标示为`IS_UNDEF`,只有扩容时发现nNumOfElements与nNumUsed相差达到一定数量(这个数量是:`ht->nNumUsed - ht->nNumOfElements > (ht->nNumOfElements >> 5)`)时才会将已删除的元素全部移除,重新构建哈希表。所以`nNumUsed`>=`nNumOfElements`。 -![HashTable](https://raw.githubusercontent.com/pangudashu/anywork/master/_img/ht.jpg) +HashTable中另外一个非常重要的值`arData`,这个值指向存储元素数组的第一个Bucket,插入元素时按顺序 __依次插入__ 数组,比如第一个元素在arData[0]、第二个在arData[1]...arData[nNumUsed]。PHP数组的有序性正是通过`arData`保证的,这是第一个与普通散列表实现不同的地方。 -HashTable中有两个非常相近的值:`nNumUsed`、`nNumOfElements`,`nNumOfElements`表示哈希表已有元素数,那这个值不跟`nNumUsed`一样吗?为什么要定义两个呢?实际上它们有不同的含义,当将一个元素从哈希表删除时并不会将对应的Bucket移除,而是将Bucket存储的zval标示为`IS_UNDEF`,只有扩容时发现nNumOfElements与nNumUsed相差达到一定数量(这个数量是:`ht->nNumUsed - ht->nNumOfElements > (ht->nNumOfElements >> 5)`)时才会将已删除的元素全部移除,重新构建哈希表。所以`nNumUsed`>=`nNumOfElements`。 +既然arData并不是按key映射的散列表,那么映射函数是如何将key与arData中的value建立映射关系的呢? -HashTable中另外一个非常重要的值`arData`,这个值指向存储元素数组的第一个Bucket,插入元素时按顺序依次插入数组,比如第一个元素在arData[0]、第二个在arData[1]...arData[nNumUsed]。PHP数组的有序性正是通过`arData`保证的。 +实际上这个散列表也在`arData`中,比较特别的是散列表在ht->arData内存之前,分配内存时这个散列表与Bucket数组一起分配,arData向后移动到了Bucket数组的起始位置,并不是申请内存的起始位置,这样散列表可以由arData指针向前移动访问到,即arData[-1]、arData[-2]、arData[-3]......散列表的结构是`uint32_t`,它保存的是value在Bucket数组中的位置。 -哈希表实现的关键是有一个数组存储哈希值与Bucket的映射,但是HashTable中并没有这样一个索引数组。 +所以,整体来看HashTable主要依赖arData实现元素的存储、索引。插入一个元素时先将元素按先后顺序插入Bucket数组,位置是idx,再根据key的哈希值映射到散列表中的某个位置nIndex,将idx存入这个位置;查找时先在散列表中映射到nIndex,得到value在Bucket数组的位置idx,再从Bucket数组中取出元素。 -实际上这个索引数组包含在`arData`中,索引数组与Bucket列表一起分配,arData指向了Bucket列表的起始位置,而索引数组可以通过arData指针向前移动访问到,即arData[-1]、arData[-2]、arData[-3]......索引数组的结构是`uint32_t`,它存储的是Bucket元素在arData中的位置。 +比如: +```php +$arr["a"] = 1; +$arr["b"] = 2; +$arr["c"] = 3; +$arr["d"] = 4; -所以,整体来看HashTable主要依赖arData实现元素的存储、索引。插入一个元素时先将元素插入Bucket数组,位置是idx,再根据key的哈希值与nTableMask计算出索引数组的位置,将idx存入这个位置;查找时先根据key的哈希值与nTableMask计算出索引数组的位置,获得元素在Bucket数组的位置idx,再从Bucket数组中取出元素。 +unset($arr["c"]); +``` +对应的HashTable如下图所示。 -### 索引数组 -索引数组类型是`uint32_t[]`,存储的值为元素在Bucket数组中的位置 +![](../img/zend_hash_1.png) -索引位置(nIndex)是如何得到的?我们一般根据哈希值与数组大小取模得到,即`key->h % ht->nTableSize`,但是PHP是这么计算的: +### 2.2.2 映射函数 +映射函数(即:散列函数)是散列表的关键部分,它将key与value建立映射关系,一般映射函数可以根据key的哈希值与Bucket数组大小取模得到,即`key->h % ht->nTableSize`,但是PHP却不是这么做的: ```c nIndex = key->h | ht->nTableMask; ``` @@ -72,24 +76,14 @@ nIndex = key->h | ht->nTableMask; 11111111 11111111 11111111 11000000 -64 11111111 11111111 11111111 10000000 -128 ``` -### 哈希碰撞 -哈希碰撞是指不同的key可能计算得到相同的哈希值(数值索引的哈希值直接就是数值本身),但是这些值又需要插入同一个哈希表。一般解决方法是将Bucket串成链表,查找时遍历链表比较key。 - -PHP的实现也是类似,只是指向冲突元素的指针并没有直接存在Bucket中,而是存在嵌入的`zval`中,zval的结构: +### 2.2.3 哈希碰撞 +哈希碰撞是指不同的key可能计算得到相同的哈希值(数值索引的哈希值直接就是数值本身),但是这些值又需要插入同一个散列表。一般解决方法是将Bucket串成链表,查找时遍历链表比较key。 +PHP的实现也是如此,只是将链表的指针指向转化为了数值指向,即:指向冲突元素的指针并没有直接存在Bucket中,而是保存到了value的`zval`中: ```c struct _zval_struct { zend_value value; /* value */ - union { - struct { - ZEND_ENDIAN_LOHI_4( - zend_uchar type, /* active type */ - zend_uchar type_flags, - zend_uchar const_flags, - zend_uchar reserved) /* call info for EX(This) */ - } v; - uint32_t type_info; - } u1; + ... union { uint32_t var_flags; uint32_t next; /* hash collision chain */ @@ -101,9 +95,7 @@ struct _zval_struct { } u2; }; ``` - -`zval.u2.next`存的就是冲突元素在Bucket数组中的位置,所以查找过程类似: - +当出现冲突时将原value的位置保存到新value的`zval.u2.next`中,然后将新插入的value的位置更新到散列表,也就是后面冲突的value始终插入header。所以查找过程类似: ```c zend_ulong h = zend_string_hash_val(key); uint32_t idx = ht->arHash[h & ht->nTableMask]; @@ -112,45 +104,49 @@ while (idx != INVALID_IDX) { if (b->h == h && zend_string_equals(b->key, key)) { return b; } - idx = Z_NEXT(b->val); // b->val.u2.next + idx = Z_NEXT(b->val); //移到下一个冲突的value } return NULL; ``` -### 插入、查找、删除 +### 2.2.4 插入、查找、删除 这几个基本操作比较简单,不再赘述,定位到元素所在Bucket位置后的操作类似单链表的插入、删除、查找。 -### 扩容 -哈希表的大小为2^n,插入时如果容量不够则首先检查已删除元素所占比例,如果达到阈值(ht->nNumUsed - ht->nNumOfElements > (ht->nNumOfElements >> 5),则将已删除元素移除,重建索引,如果未到阈值则进行扩容操作,扩大为当前大小的2倍,将当前Bucket数组复制到新的空间,然后重建索引。 +### 2.2.5 扩容 +散列表可存储的value数是固定的,当空间不够用时就要进行扩容了。 + +PHP散列表的大小为2^n,插入时如果容量不够则首先检查已删除元素所占比例,如果达到阈值(ht->nNumUsed - ht->nNumOfElements > (ht->nNumOfElements >> 5),则将已删除元素移除,重建索引,如果未到阈值则进行扩容操作,扩大为当前大小的2倍,将当前Bucket数组复制到新的空间,然后重建索引。 ```c //zend_hash.c static void ZEND_FASTCALL zend_hash_do_resize(HashTable *ht) { - IS_CONSISTENT(ht); - HT_ASSERT(GC_REFCOUNT(ht) == 1); - - if (ht->nNumUsed > ht->nNumOfElements + (ht->nNumOfElements >> 5)) { //只有到一定阈值才进行rehash操作 - HANDLE_BLOCK_INTERRUPTIONS(); + if (ht->nNumUsed > ht->nNumOfElements + (ht->nNumOfElements >> 5)) { + //只有到一定阈值才进行rehash操作 zend_hash_rehash(ht); //重建索引数组 - HANDLE_UNBLOCK_INTERRUPTIONS(); - } else if (ht->nTableSize < HT_MAX_SIZE) { //扩大为两倍 + } else if (ht->nTableSize < HT_MAX_SIZE) { + //扩容 void *new_data, *old_data = HT_GET_DATA_ADDR(ht); + //扩大为2倍,加法要比乘法快,小的优化点无处不在... uint32_t nSize = ht->nTableSize + ht->nTableSize; Bucket *old_buckets = ht->arData; - HANDLE_BLOCK_INTERRUPTIONS(); - new_data = pemalloc(HT_SIZE_EX(nSize, -nSize), ht->u.flags & HASH_FLAG_PERSISTENT); //新分配arData空间,大小为:(sizeof(Bucket) + sizeof(uint32_t)) * nSize + //新分配arData空间,大小为:(sizeof(Bucket) + sizeof(uint32_t)) * nSize + new_data = pemalloc(HT_SIZE_EX(nSize, -nSize), ...); ht->nTableSize = nSize; - ht->nTableMask = -ht->nTableSize; //nTableSize负值 - HT_SET_DATA_ADDR(ht, new_data); //将arData指针偏移到Bucket数组起始位置 - memcpy(ht->arData, old_buckets, sizeof(Bucket) * ht->nNumUsed); //将旧的Bucket数组拷到新空间 - pefree(old_data, ht->u.flags & HASH_FLAG_PERSISTENT); //释放旧空间 - zend_hash_rehash(ht); //重建索引数组 - HANDLE_UNBLOCK_INTERRUPTIONS(); - } else { - zend_error_noreturn(E_ERROR, "Possible integer overflow in memory allocation (%zu * %zu + %zu)", ht->nTableSize * 2, sizeof(Bucket) + sizeof(uint32_t), sizeof(Bucket)); + ht->nTableMask = -ht->nTableSize; + //将arData指针偏移到Bucket数组起始位置 + HT_SET_DATA_ADDR(ht, new_data); + //将旧的Bucket数组拷到新空间 + memcpy(ht->arData, old_buckets, sizeof(Bucket) * ht->nNumUsed); + //释放旧空间 + pefree(old_data, ht->u.flags & HASH_FLAG_PERSISTENT); + + //重建索引数组:散列表 + zend_hash_rehash(ht); + ... } + ... } #define HT_SET_DATA_ADDR(ht, ptr) do { \ @@ -158,20 +154,15 @@ static void ZEND_FASTCALL zend_hash_do_resize(HashTable *ht) } while (0) ``` -### 重建索引 -当删除元素达到一定数量或扩容后都需要进行索引数组的重建,因为元素所在Bucket位置移动了或哈希数组nTableSize变化了导致原哈希索引变化,已删除的元素将重新可以分配。 - -![rehash](https://raw.githubusercontent.com/pangudashu/anywork/master/_img/rehash.jpg) - +### 2.2.6 重建散列表 +当删除元素达到一定数量或扩容后都需要重建散列表,因为value在Bucket位置移动了或哈希数组nTableSize变化了导致key与value的映射关系改变,重建过程实际就是遍历Bucket数组中的value,然后重新计算映射值更新到散列表,除了更新散列表之外,这里还有一个重要的处理:移除已删除的value,开始的时候我们说过,删除value时只是将value的type表为了IS_UNDEF,并没有实际从Bucket数组中删除,如果这些value一直存在那么将浪费很多空间,所以这里会把它们移除,操作的方式也比较简单:将后面未删除的value依次前移,具体过程如下: ```c //zend_hash.c ZEND_API int ZEND_FASTCALL zend_hash_rehash(HashTable *ht) { Bucket *p; uint32_t nIndex, i; - ... - i = 0; p = ht->arData; if (ht->nNumUsed == ht->nNumOfElements) { //没有已删除的直接遍历Bucket数组重新插入索引数组即可 @@ -183,29 +174,26 @@ ZEND_API int ZEND_FASTCALL zend_hash_rehash(HashTable *ht) } while (++i < ht->nNumUsed); } else { do { - if (UNEXPECTED(Z_TYPE(p->val) == IS_UNDEF)) {//有已删除元素需要将其移到后面,压实Bucket数组 - + if (UNEXPECTED(Z_TYPE(p->val) == IS_UNDEF)) { + //有已删除元素则将后面的value依次前移,压实Bucket数组 ...... - - while (++i < ht->nNumUsed) { - p++; - if (EXPECTED(Z_TYPE_INFO(p->val) != IS_UNDEF)) { - ZVAL_COPY_VALUE(&q->val, &p->val); - q->h = p->h; - nIndex = q->h | ht->nTableMask; - q->key = p->key; - Z_NEXT(q->val) = HT_HASH(ht, nIndex); - HT_HASH(ht, nIndex) = HT_IDX_TO_HASH(j); - if (UNEXPECTED(ht->nInternalPointer == i)) { - ht->nInternalPointer = j; - } - q++; - j++; + while (++i < ht->nNumUsed) { + p++; + if (EXPECTED(Z_TYPE_INFO(p->val) != IS_UNDEF)) { + ZVAL_COPY_VALUE(&q->val, &p->val); + q->h = p->h; + nIndex = q->h | ht->nTableMask; + q->key = p->key; + Z_NEXT(q->val) = HT_HASH(ht, nIndex); + HT_HASH(ht, nIndex) = HT_IDX_TO_HASH(j); + if (UNEXPECTED(ht->nInternalPointer == i)) { + ht->nInternalPointer = j; } + q++; + j++; } - + } ...... - ht->nNumUsed = j; break; } @@ -216,7 +204,6 @@ ZEND_API int ZEND_FASTCALL zend_hash_rehash(HashTable *ht) p++; }while(++i < ht->nNumUsed); } - } ``` - +除了上面这些操作,PHP中关于HashTable的还有很多,这里不再介绍。 diff --git a/README.md b/README.md index d9675b5..123a0f5 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ * [1.2 PHP框架执行流程](1/base_process.md) * 第2章 变量 * [2.1 变量的内部实现](2/zval.md) - * 2.2 数组(2/zend_ht.md) + * [2.2 数组](2/zend_ht.md) * 2.3 常量(2/var_common.md) * 第3章 Zend虚拟机 * [3.1 PHP代码的编译](3/zend_compile.md) diff --git a/img/zend_hash_1.png b/img/zend_hash_1.png new file mode 100644 index 0000000000000000000000000000000000000000..b042b8166f4ef087c48a32c129823f30ba67ced2 GIT binary patch literal 46516 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 literal 0 HcmV?d00001 From 3282c1514acd2a29d000107cb2f2136c589c02a6 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Mon, 3 Apr 2017 16:08:14 +0800 Subject: [PATCH 110/379] update --- img/zend_hash_1.png | Bin 46516 -> 46672 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/img/zend_hash_1.png b/img/zend_hash_1.png index b042b8166f4ef087c48a32c129823f30ba67ced2..2081ea8b08818ba11dc43a6811899b7bf713e656 100644 GIT binary patch literal 46672 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

&qc4Va@IKr^GBZcO-Y0~uTG$D2Ah%Od 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 From 1d22c868313a476da9a54f0968078273d2563a9c Mon Sep 17 00:00:00 2001 From: qinpeng Date: Mon, 3 Apr 2017 23:05:05 +0800 Subject: [PATCH 111/379] add static var --- 2/static_var.md | 24 ++++++++++++++++++++++++ README.md | 4 +++- 2 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 2/static_var.md diff --git a/2/static_var.md b/2/static_var.md new file mode 100644 index 0000000..bb2496d --- /dev/null +++ b/2/static_var.md @@ -0,0 +1,24 @@ +## 2.3 静态变量 +PHP中局部变量分配在zend_execute_data结构上,每次执行zend_op_array都会生成一个新的zend_execute_data,局部变量在执行之初分配,然后在执行结束时释放,这是局部变量的生命周期,而局部变量中有一种特殊的类型:静态变量,它们不会在函数执行完后释放,当程序执行离开函数域时静态变量的值被保留下来,下次执行时仍然可以使用之前的值。 + +PHP中的静态变量通过`static`关键词创建: +```php +function my_func(){ + static $count = 4; + $count++; + echo $count,"\n"; +} +my_func(); +my_func(); +my_func(); + +=========================== +5 +6 +7 +``` +静态变量既然不会随执行的结束而释放,那么很容易想到它的保存位置:`zend_op_array->static_variables`,这是一个哈希表,所以PHP中的静态变量与普通局部变量不同,它们没有分配在执行空间zend_execute_data上,而是以哈希表的形式保存在zend_op_array中。 + +静态变量只会初始化一次,注意:它的初始化发生在编译阶段而不是执行阶段。 + +//:ZEND_FETCH_W、ZEND_ASSIGN_REF,`zend_assign_to_variable_reference()` diff --git a/README.md b/README.md index 123a0f5..7847043 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,9 @@ * 第2章 变量 * [2.1 变量的内部实现](2/zval.md) * [2.2 数组](2/zend_ht.md) - * 2.3 常量(2/var_common.md) + * 2.3 静态变量 + * 2.4 全局变量 + * 2.5 常量 * 第3章 Zend虚拟机 * [3.1 PHP代码的编译](3/zend_compile.md) * [3.1.1 词法解析、语法解析](3/zend_compile_parse.md) From f19fae7a3e1403c025a92310709d348c4b1e694c Mon Sep 17 00:00:00 2001 From: qinpeng Date: Tue, 4 Apr 2017 16:06:58 +0800 Subject: [PATCH 112/379] finish static var --- 2/static_var.md | 79 +++++++++++++++++++++++++++++++++++++--- README.md | 2 +- img/zend_static_ref.png | Bin 0 -> 20371 bytes 3 files changed, 75 insertions(+), 6 deletions(-) create mode 100644 img/zend_static_ref.png diff --git a/2/static_var.md b/2/static_var.md index bb2496d..d382cb4 100644 --- a/2/static_var.md +++ b/2/static_var.md @@ -10,15 +10,84 @@ function my_func(){ } my_func(); my_func(); -my_func(); - =========================== 5 6 -7 ``` +### 2.3.1 静态变量的存储 静态变量既然不会随执行的结束而释放,那么很容易想到它的保存位置:`zend_op_array->static_variables`,这是一个哈希表,所以PHP中的静态变量与普通局部变量不同,它们没有分配在执行空间zend_execute_data上,而是以哈希表的形式保存在zend_op_array中。 -静态变量只会初始化一次,注意:它的初始化发生在编译阶段而不是执行阶段。 +> 静态变量只会初始化一次,注意:它的初始化发生在编译阶段而不是执行阶段,上面这个例子中:`static $count = 4;`是在编译阶段发现定义了一个静态变量,然后插进了zend_op_array->static_variables中,并不是执行的时候把static_variables中的值修改为4,所以上面执行的时候会输出5、6,再次执行并没有重置静态变量的值。 +> +> 这个特性也意味着静态变量初始的值不能是变量,比如:`static $count = $xxx;`这样定义将会报错。 + +### 2.3.2 静态变量的访问 +局部变量通过编译时确定的编号进行读写操作,而静态变量通过哈希表保存,这就使得其不能像普通变量那样有一个固定的编号,有一种可能是通过变量名索引的,那么究竟是否如此呢?我们分析下其编译过程。 + +静态变量编译的语法规则: +```c +statement: + ... + | T_STATIC static_var_list ';' { $$ = $2; } + ... +; + +static_var_list: + static_var_list ',' static_var { $$ = zend_ast_list_add($1, $3); } + | static_var { $$ = zend_ast_create_list(1, ZEND_AST_STMT_LIST, $1); } +; + +static_var: + T_VARIABLE { $$ = zend_ast_create(ZEND_AST_STATIC, $1, NULL); } + | T_VARIABLE '=' expr { $$ = zend_ast_create(ZEND_AST_STATIC, $1, $3); } +; +``` +语法解析后生成了一个`ZEND_AST_STATIC`语法树节点,接着再看下这个节点编译为opcode的过程:zend_compile_static_var。 +```c +void zend_compile_static_var(zend_ast *ast) +{ + zend_ast *var_ast = ast->child[0]; + zend_ast *value_ast = ast->child[1]; + zval value_zv; + + if (value_ast) { + //定义了初始值 + zend_const_expr_to_zval(&value_zv, value_ast); + } else { + //无初始值 + ZVAL_NULL(&value_zv); + } + + zend_compile_static_var_common(var_ast, &value_zv, 1); +} +``` +这里首先对初始化值进行编译,最终得到一个固定值,然后调用:`zend_compile_static_var_common()`处理,首先判断当前编译的`zend_op_array->static_variables`是否已创建,未创建则分配一个HashTable,接着将定义的静态变量插入: +```c +//zend_compile_static_var_common(): +if (!CG(active_op_array)->static_variables) { + ALLOC_HASHTABLE(CG(active_op_array)->static_variables); + zend_hash_init(CG(active_op_array)->static_variables, 8, NULL, ZVAL_PTR_DTOR, 0); +} +//插入静态变量 +zend_hash_update(CG(active_op_array)->static_variables, Z_STR(var_node.u.constant), value); +``` +插入静态变量哈希表后并没有完成,接下来还有一个重要操作: +```c +//生成一条ZEND_FETCH_W的opcode +opline = zend_emit_op(&result, by_ref ? ZEND_FETCH_W : ZEND_FETCH_R, &var_node, NULL); +opline->extended_value = ZEND_FETCH_STATIC; + +if (by_ref) { + zend_ast *fetch_ast = zend_ast_create(ZEND_AST_VAR, var_ast); + //生成一条ZEND_ASSIGN_REF的opcode + zend_emit_assign_ref_znode(fetch_ast, &result); +} +``` +后面生成了两条opcode: +* __ZEND_FETCH_W:__ 这条opcode对应的操作是创建一个IS_INDIRECT类型的zval,指向static_variables中对应静态变量的zval +* __ZEND_ASSIGN_REF:__ 它的操作是引用赋值,即将一个引用赋值给CV变量 + +通过上面两条opcode可以确定静态变量的读写过程:首先根据变量名在static_variables中取出对应的zval,然后将它修改为引用类型并赋值给局部变量,也就是说`static $count = 4;`包含了两个操作,严格的将`$count`并不是真正的静态变量,它只是一个指向静态变量的局部变量,执行时实际操作是:`$count = & static_variables["count"];`。上面例子$count与static_variables["count"]间的关系如图所示。 + +![](../img/zend_static_ref.png) -//:ZEND_FETCH_W、ZEND_ASSIGN_REF,`zend_assign_to_variable_reference()` diff --git a/README.md b/README.md index 7847043..22a8525 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ * 第2章 变量 * [2.1 变量的内部实现](2/zval.md) * [2.2 数组](2/zend_ht.md) - * 2.3 静态变量 + * [2.3 静态变量](2/static_var) * 2.4 全局变量 * 2.5 常量 * 第3章 Zend虚拟机 diff --git a/img/zend_static_ref.png b/img/zend_static_ref.png new file mode 100644 index 0000000000000000000000000000000000000000..f4e0313353b8a75457d37e997f7dcd8924c5791e GIT binary patch literal 20371 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 LsF2Tt(kuQ3SFlZi literal 0 HcmV?d00001 From e07cc1b6fe78e61924fa9c9eba8609e5659ccc2b Mon Sep 17 00:00:00 2001 From: qinpeng Date: Tue, 4 Apr 2017 16:08:04 +0800 Subject: [PATCH 113/379] update --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 22a8525..09c5aff 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ * 第2章 变量 * [2.1 变量的内部实现](2/zval.md) * [2.2 数组](2/zend_ht.md) - * [2.3 静态变量](2/static_var) + * [2.3 静态变量](2/static_var.md) * 2.4 全局变量 * 2.5 常量 * 第3章 Zend虚拟机 From 1392166190ec71e1af746de606e8fe3396926cdc Mon Sep 17 00:00:00 2001 From: qinpeng Date: Tue, 4 Apr 2017 17:13:46 +0800 Subject: [PATCH 114/379] add global var --- 2/global_var.md | 61 ++++++++++++++++++++++++++++++++++++++++ img/zend_global_var.png | Bin 0 -> 9219 bytes 2 files changed, 61 insertions(+) create mode 100644 2/global_var.md create mode 100644 img/zend_global_var.png diff --git a/2/global_var.md b/2/global_var.md new file mode 100644 index 0000000..c2ecdb2 --- /dev/null +++ b/2/global_var.md @@ -0,0 +1,61 @@ +## 2.4 全局变量 +PHP中在函数、类之外直接定义的变量可以在函数、类成员方法中通过global关键词引入使用,这些变量称为全局变量。 + +这些直接在PHP中定义的变量(包括include、require文件中的)相对于函数、类方法而言它们是全局变量,但是对自身执行域zend_execute_data而言它们是普通的局部变量,自身执行时它们与普通变量的读写方式完全相同。 + +```php +function test() { + global $id; + $id++; +} + +$id = 1; +test(); +echo $id; +``` +### 2.4.1 全局变量初始化 +全局变量在整个请求执行期间始终存在,它们保存在`EG(symbol_table)`中,也就是全局变量符号表,与静态变量的存储一样,这也是一个哈希表,主脚本(或include、require)在`zend_execute_ex`执行开始之前会把当前作用域下的所有局部变量添加到`EG(symbol_table)`中,这一步操作后面介绍zend执行过程时还会讲到,这里先简单提下: +```c +ZEND_API void zend_execute(zend_op_array *op_array, zval *return_value) +{ + ... + i_init_execute_data(execute_data, op_array, return_value); + zend_execute_ex(execute_data); + ... +} +``` +`i_init_execute_data()`这个函数中会把局部变量插入到EG(symbol_table): +```c +ZEND_API void zend_attach_symbol_table(zend_execute_data *execute_data) +{ + zend_op_array *op_array = &execute_data->func->op_array; + HashTable *ht = execute_data->symbol_table; + + if (!EXPECTED(op_array->last_var)) { + return; + } + + zend_string **str = op_array->vars; + zend_string **end = str + op_array->last_var; + //局部变量数组起始位置 + zval *var = EX_VAR_NUM(0); + + do{ + zval *zv = zend_hash_find(ht, *str); + //插入全局变量符号表 + zv = zend_hash_add_new(ht, *str, var); + //哈希表中value指向局部变量的zval + ZVAL_INDIRECT(zv, var); + ... + }while(str != end); +} +``` +从上面的过程可以很直观的看到,在执行前遍历局部变量,然后插入EG(symbol_table),EG(symbol_table)中的value直接指向局部变量的zval,示例经过这一步的处理之后(此时局部变量只是分配了zval,但还未初始化,所以是IS_UNDEF): + +![](../img/zend_global_var.png) + +### 2.4.2 全局变量的访问 + +### 2.4.3 超全局变量 + +### 2.4.4 销毁 diff --git a/img/zend_global_var.png b/img/zend_global_var.png new file mode 100644 index 0000000000000000000000000000000000000000..1f43548de8e228f195f2819331635848036d551a GIT binary patch literal 9219 zcma)ibzBu~*X{rcA_&smTN*?J>5$wYAt_1;0#X7>w@U1XZt0Q+0j0ZZ)1A`Y-F0rB z_jk@;@A-b;5@Gi2nLF3I)^)8Jzt>8#j~3^d3&}~nRCh|)o_5tzdsD@==jc+` zd>HhVS)(%H&xcp|k=#-7a5|llha8Res zC5fb@%7(9@CVD=2#-~klYnD&7!@IKX>gR=^+@At_Z*TZmk~4`q)GqO{tqLnq4zU+T0?t| z-=O#JFrQ-g7*=p8TpB#ZPDLK;N$t7fH4aVt=QQ+o+IUX6__MV>_BAO?WjR0JsYcAY zpW2vjxD3!ZX!@eRQd|9{se4(oF}b?P<}3x~9+x4-H~CyO0{qS@8q{&n

`4b$>yJ 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 V$+$m Date: Tue, 4 Apr 2017 17:32:26 +0800 Subject: [PATCH 115/379] update --- 2/global_var.md | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/2/global_var.md b/2/global_var.md index c2ecdb2..14309b2 100644 --- a/2/global_var.md +++ b/2/global_var.md @@ -1,5 +1,5 @@ ## 2.4 全局变量 -PHP中在函数、类之外直接定义的变量可以在函数、类成员方法中通过global关键词引入使用,这些变量称为全局变量。 +PHP中在函数、类之外直接定义的变量可以在函数、类成员方法中通过global关键词引入使用,这些变量称为:全局变量。 这些直接在PHP中定义的变量(包括include、require文件中的)相对于函数、类方法而言它们是全局变量,但是对自身执行域zend_execute_data而言它们是普通的局部变量,自身执行时它们与普通变量的读写方式完全相同。 @@ -55,7 +55,17 @@ ZEND_API void zend_attach_symbol_table(zend_execute_data *execute_data) ![](../img/zend_global_var.png) ### 2.4.2 全局变量的访问 +与静态变量的访问一样,全局变量也是将原来的值转换为引用,然后在global导入的作用域内创建一个局部变量指向该引用: +```php +global $id; // 相当于:$id = & EG(symbol_table)["id"]; +``` +具体的操作过程不再细讲,与静态变量的处理过程一致,这时示例中局部变量与全局变量的引用情况如下图。 + +![](../img/zend_global_ref.png) ### 2.4.3 超全局变量 +全部变量除了通过global引入外还有一类特殊的类型,它们不需要使用global引入而可以直接使用,这些全局变量称为:超全局变量。 + +超全局变量实际是PHP内核定义的一些全局变量:$GLOBALS、$_SERVER、$_REQUEST、$_POST、$_GET、$_FILES、$_ENV、$_COOKIE、$_SESSION、argv、argc。 ### 2.4.4 销毁 From 14e2a08f10131168e7be97526d9da2766023a14a Mon Sep 17 00:00:00 2001 From: qinpeng Date: Tue, 4 Apr 2017 17:32:56 +0800 Subject: [PATCH 116/379] add pic --- img/zend_global_ref.png | Bin 0 -> 21330 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 img/zend_global_ref.png diff --git a/img/zend_global_ref.png b/img/zend_global_ref.png new file mode 100644 index 0000000000000000000000000000000000000000..b299fc2b8093800c98a4abcab9b1e9e901492737 GIT binary patch literal 21330 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 DW>W)L literal 0 HcmV?d00001 From 44dcbf8a9113e990932a31f57ad1c2b83669a2b6 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Tue, 4 Apr 2017 17:54:39 +0800 Subject: [PATCH 117/379] finish global --- 2/global_var.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/2/global_var.md b/2/global_var.md index 14309b2..a6e90fc 100644 --- a/2/global_var.md +++ b/2/global_var.md @@ -69,3 +69,21 @@ global $id; // 相当于:$id = & EG(symbol_table)["id"]; 超全局变量实际是PHP内核定义的一些全局变量:$GLOBALS、$_SERVER、$_REQUEST、$_POST、$_GET、$_FILES、$_ENV、$_COOKIE、$_SESSION、argv、argc。 ### 2.4.4 销毁 +局部变量如果没有手动销毁,那么在函数执行结束时会将它们销毁,而全局变量则是在整个请求结束时才会销毁,即使是我们直接在PHP脚本中定义在函数外的那些变量。 +```c +void shutdown_destructors(void) +{ + if (CG(unclean_shutdown)) { + EG(symbol_table).pDestructor = zend_unclean_zval_ptr_dtor; + } + zend_try { + uint32_t symbols; + do { + symbols = zend_hash_num_elements(&EG(symbol_table)); + //销毁 + zend_hash_reverse_apply(&EG(symbol_table), (apply_func_t) zval_call_destructor); + } while (symbols != zend_hash_num_elements(&EG(symbol_table))); + } + ... +} +``` From 0bab99afbefd588959a4de406abd331268d4f634 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Tue, 4 Apr 2017 17:55:28 +0800 Subject: [PATCH 118/379] add dir --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 09c5aff..617cb9c 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ * [2.1 变量的内部实现](2/zval.md) * [2.2 数组](2/zend_ht.md) * [2.3 静态变量](2/static_var.md) - * 2.4 全局变量 + * [2.4 全局变量](2/global_var.md) * 2.5 常量 * 第3章 Zend虚拟机 * [3.1 PHP代码的编译](3/zend_compile.md) From 936d18f5b2f02201eea907e19a03b74814547846 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Tue, 4 Apr 2017 21:32:07 +0800 Subject: [PATCH 119/379] finish constant --- 2/zend_constant.md | 47 ++++++++++++++++++++++++++++++++++++++++++++++ README.md | 2 +- 2 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 2/zend_constant.md diff --git a/2/zend_constant.md b/2/zend_constant.md new file mode 100644 index 0000000..fad305c --- /dev/null +++ b/2/zend_constant.md @@ -0,0 +1,47 @@ +## 2.5 常量 +常量是一个简单值的标识符(名字)。如同其名称所暗示的,在脚本执行期间该值不能改变。常量默认为大小写敏感。通常常量标识符总是大写的。 + +常量名和其它任何 PHP 标签遵循同样的命名规则。合法的常量名以字母或下划线开始,后面跟着任何字母,数字或下划线。 + +PHP中的常量通过`define()`函数定义: +```php +define('CONST_VAR_1', 1234); +``` +### 2.5.1 常量的存储 +在内核中常量存储在`EG(zend_constant)`哈希表中,访问时也是根据常量名直接到哈希表中查找,其实现比较简单。 + +常量的数据结构: +```c +typedef struct _zend_constant { + zval value; //常量值 + zend_string *name; //常量名 + int flags; //常量标识位 + int module_number; //所属扩展、模块 +} zend_constant; +``` +常量的几个属性都比较直观,这里只介绍下flags,它的值可以是以下三个中任意组合: +```c +#define CONST_CS (1<<0) //大小写敏感 +#define CONST_PERSISTENT (1<<1) //持久化的 +#define CONST_CT_SUBST (1<<2) //允许编译时替换 +``` +介绍下三种flag代表的含义: +* __CONST_CS:__ 大小写敏感,默认是开启的,用户通过define()定义的始终是区分大小写的,通过扩展定义的可以自由选择 +* __CONST_PERSISTENT:__ 持久化的,只有通过扩展、内核定义的才支持,这种常量不会在request结束时清理掉 +* __CONST_CT_SUBST:__ 允许编译时替换,编译时如果发现有地方在读取常量的值,那么编译器会尝试直接替换为常量值,而不是在执行时再去读取,目前这个flag只有TRUE、FALSE、NULL三个常量在使用 + +### 2.5.2 常量的销毁 +非持久化常量在request请求结束时销毁,具体销毁操作在:`php_request_shutdown()->zend_deactivate()->shutdown_executor()->clean_non_persistent_constants()`。 +```c +void clean_non_persistent_constants(void) +{ + if (EG(full_tables_cleanup)) { + zend_hash_apply(EG(zend_constants), clean_non_persistent_constant_full); + } else { + zend_hash_reverse_apply(EG(zend_constants), clean_non_persistent_constant); + } +} +``` +然后从哈希表末尾开始向前遍历EG(zend_constants),将非持久化常量删除,直到碰到第一个持久化常量时,停止遍历,正常情况下所有通过扩展定义的常量一定是在PHP中通过define定义之前,当然也并非绝对,这里只是说在所有常量均是在MINT阶段定义的情况。 + +持久化常量是在`php_module_shutdown()`阶段销毁的,具体过程与上面类似。 diff --git a/README.md b/README.md index 617cb9c..bd1e2f5 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ * [2.2 数组](2/zend_ht.md) * [2.3 静态变量](2/static_var.md) * [2.4 全局变量](2/global_var.md) - * 2.5 常量 + * [2.5 常量](2/zend_constant.md) * 第3章 Zend虚拟机 * [3.1 PHP代码的编译](3/zend_compile.md) * [3.1.1 词法解析、语法解析](3/zend_compile_parse.md) From 4d4227d850a302541a44ad7fe4654c8a12fcfe6c Mon Sep 17 00:00:00 2001 From: qinpeng Date: Wed, 5 Apr 2017 12:03:19 +0800 Subject: [PATCH 120/379] add magic method --- 3/zend_magic_method.md | 28 ++++++++++++++++++++++++++++ img/magic_function.png | Bin 0 -> 24321 bytes 2 files changed, 28 insertions(+) create mode 100644 3/zend_magic_method.md create mode 100644 img/magic_function.png diff --git a/3/zend_magic_method.md b/3/zend_magic_method.md new file mode 100644 index 0000000..5fe6d30 --- /dev/null +++ b/3/zend_magic_method.md @@ -0,0 +1,28 @@ +### 3.4.5 魔术方法 +PHP在类的成员方法中预留了一些特殊的方法,它们会在一些特殊的时机被调用(比如创建对象之初、访问成员属性时...),这类方法称为:魔术方法,包括:__construct()、__destruct()、__call()、__callStatic()、__get()、__set()、__isset()、__unset()、__sleep()、__wakeup()、__toString()、__invoke()、 __set_state()、 __clone() 和 __debugInfo()。 + +魔术方法实际是PHP提供的一些特殊操作时的钩子函数,与普通成员方法无异,它们只是与一些操作的口头约定,并没有什么字段标识它们,比如我们定义了一个函数:my_function(),我们希望在这个函数处理对象时首先调用其成员方法my_magic(),那么my_magic()也可以认为是一个魔术方法。 + +魔术方法与普通成员方法一样保存在`zend_class_entry.function_table`中,另外针对一些内核常用到的成员方法在zend_class_entry中还有一些单独的指针指向具体的成员方法: +```c +struct _zend_class_entry { + ... + union _zend_function *constructor; + union _zend_function *destructor; + union _zend_function *clone; + union _zend_function *__get; + union _zend_function *__set; + union _zend_function *__unset; + union _zend_function *__isset; + union _zend_function *__call; + union _zend_function *__callstatic; + union _zend_function *__tostring; + union _zend_function *__debugInfo; + ... +} +``` +在编译成员方法时如果发现与这些魔术方法名称一致,则除了插入`zend_class_entry.function_table`哈希表以外,还会设置zend_class_entry中对应的指针。 + +![](../img/magic_function.png) + + diff --git a/img/magic_function.png b/img/magic_function.png new file mode 100644 index 0000000000000000000000000000000000000000..a1da121fd7a2b009cabdcc204d5ad5ac4b8245f9 GIT binary patch literal 24321 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 ZG;H0*P Date: Wed, 5 Apr 2017 12:53:38 +0800 Subject: [PATCH 121/379] udpate --- 3/zend_magic_method.md | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/3/zend_magic_method.md b/3/zend_magic_method.md index 5fe6d30..8d0d284 100644 --- a/3/zend_magic_method.md +++ b/3/zend_magic_method.md @@ -25,4 +25,34 @@ struct _zend_class_entry { ![](../img/magic_function.png) +具体在编译成员方法时设置:zend_begin_method_decl()。 +```c +void zend_begin_method_decl(zend_op_array *op_array, zend_string *name, zend_bool has_body) +{ + ... + //插入类的function_table中 + if (zend_hash_add_ptr(&ce->function_table, lcname, op_array) == NULL) { + zend_error_noreturn(..); + } + + if (!in_trait && zend_string_equals_ci(lcname, ce->name)) { + if (!ce->constructor) { + ce->constructor = (zend_function *) op_array; + } + } else if (zend_string_equals_literal(lcname, ZEND_CONSTRUCTOR_FUNC_NAME)) { + ce->constructor = (zend_function *) op_array; + } else if (zend_string_equals_literal(lcname, ZEND_DESTRUCTOR_FUNC_NAME)) { + ce->destructor = (zend_function *) op_array; + } else if (zend_string_equals_literal(lcname, ZEND_CLONE_FUNC_NAME)) { + ce->clone = (zend_function *) op_array; + } else if (zend_string_equals_literal(lcname, ZEND_CALL_FUNC_NAME)) { + ce->__call = (zend_function *) op_array; + } else if (zend_string_equals_literal(lcname, ZEND_CALLSTATIC_FUNC_NAME)) { + ce->__callstatic = (zend_function *) op_array; + } else if (...){ + ... + } + ... +} +``` From 4830a63a91832c7c07be75ae563570d7c654c003 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Wed, 5 Apr 2017 13:13:18 +0800 Subject: [PATCH 122/379] update --- 3/zend_magic_method.md | 56 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 55 insertions(+), 1 deletion(-) diff --git a/3/zend_magic_method.md b/3/zend_magic_method.md index 8d0d284..7ccc595 100644 --- a/3/zend_magic_method.md +++ b/3/zend_magic_method.md @@ -1,5 +1,5 @@ ### 3.4.5 魔术方法 -PHP在类的成员方法中预留了一些特殊的方法,它们会在一些特殊的时机被调用(比如创建对象之初、访问成员属性时...),这类方法称为:魔术方法,包括:__construct()、__destruct()、__call()、__callStatic()、__get()、__set()、__isset()、__unset()、__sleep()、__wakeup()、__toString()、__invoke()、 __set_state()、 __clone() 和 __debugInfo()。 +PHP在类的成员方法中预留了一些特殊的方法,它们会在一些特殊的时机被调用(比如创建对象之初、访问成员属性时...),这类方法称为:魔术方法,包括:__construct()、__destruct()、__call()、__callStatic()、__get()、__set()、__isset()、__unset()、__sleep()、__wakeup()、__toString()、__invoke()、 __set_state()、 __clone() 和 __debugInfo(),关于这些方法的用法这里不作说明,不清楚的可以翻下官方文档。 魔术方法实际是PHP提供的一些特殊操作时的钩子函数,与普通成员方法无异,它们只是与一些操作的口头约定,并没有什么字段标识它们,比如我们定义了一个函数:my_function(),我们希望在这个函数处理对象时首先调用其成员方法my_magic(),那么my_magic()也可以认为是一个魔术方法。 @@ -55,4 +55,58 @@ void zend_begin_method_decl(zend_op_array *op_array, zend_string *name, zend_boo ... } ``` +除了这几个其它魔术方法都没有单独的指针指向,比如:__sleep()、__wakeup(),这两个主要是serialize()、unserialize()序列化、反序列化时调用的,它们是在这俩函数中写死的,我们简单看下serialize()的实现,这个函数是通过扩展提供的: +```c +//file: ext/standard/var.c +PHP_FUNCTION(serialize) +{ + zval *struc; + php_serialize_data_t var_hash; + smart_str buf = {0}; + + if (zend_parse_parameters(ZEND_NUM_ARGS(), "z", &struc) == FAILURE) { + return; + } + + php_var_serialize(&buf, struc, &var_hash); + ... +} +``` +最终由`php_var_serialize_intern()`处理,这个函数会根据不同的类型选择不同的处理方式: +```c +static void php_var_serialize_intern(smart_str *buf, zval *struc, php_serialize_data_t var_hash) +{ + ... + switch (Z_TYPE_P(struc)) { + case IS_FALSE: + ... + case IS_TRUE: + ... + case IS_NULL: + ... + case IS_LONG: + ... + } +} +``` +其中类型是对象时将先检查`zend_class_function.function_table`中是否定义了`__sleep()`,如果有的话则调用: +```c +if (ce != PHP_IC_ENTRY && zend_hash_str_exists(&ce->function_table, "__sleep", sizeof("__sleep")-1)) { + ZVAL_STRINGL(&fname, "__sleep", sizeof("__sleep") - 1); + //调用用户自定义的__sleep()方法 + res = call_user_function_ex(CG(function_table), struc, &fname, &retval, 0, 0, 1, NULL); + if (res == SUCCESS) { + if (Z_TYPE(retval) != IS_UNDEF) { + if (HASH_OF(&retval)) { + php_var_serialize_class(buf, struc, &retval, var_hash); + } else { + smart_str_appendl(buf,"N;", 2); + } + zval_ptr_dtor(&retval); + } + return; + } +} +``` +其它魔术方法与__sleep()类似,都是在一些特殊操作中固定调用的。 From 9acc0916c58984fc1b2e0fe05066182555069799 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Wed, 5 Apr 2017 13:17:02 +0800 Subject: [PATCH 123/379] update --- 3/zend_magic_method.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/3/zend_magic_method.md b/3/zend_magic_method.md index 7ccc595..928330a 100644 --- a/3/zend_magic_method.md +++ b/3/zend_magic_method.md @@ -108,5 +108,7 @@ if (ce != PHP_IC_ENTRY && zend_hash_str_exists(&ce->function_table, "__sleep", s return; } } +//后面会走到IS_ARRAY分支继续序列化处理 +... ``` 其它魔术方法与__sleep()类似,都是在一些特殊操作中固定调用的。 From b56ab9839f41948217d9c27b4c18d88f1edc3b7a Mon Sep 17 00:00:00 2001 From: qinpeng Date: Wed, 5 Apr 2017 13:18:46 +0800 Subject: [PATCH 124/379] update --- 3/zend_magic_method.md | 2 ++ README.md | 3 ++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/3/zend_magic_method.md b/3/zend_magic_method.md index 928330a..62b114d 100644 --- a/3/zend_magic_method.md +++ b/3/zend_magic_method.md @@ -91,6 +91,8 @@ static void php_var_serialize_intern(smart_str *buf, zval *struc, php_serialize_ ``` 其中类型是对象时将先检查`zend_class_function.function_table`中是否定义了`__sleep()`,如果有的话则调用: ```c +//case IS_OBJEST: +... if (ce != PHP_IC_ENTRY && zend_hash_str_exists(&ce->function_table, "__sleep", sizeof("__sleep")-1)) { ZVAL_STRINGL(&fname, "__sleep", sizeof("__sleep") - 1); //调用用户自定义的__sleep()方法 diff --git a/README.md b/README.md index bd1e2f5..9d33a14 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,7 @@ * [3.4.2 对象](3/zend_object.md) * [3.4.3 继承](3/zend_extends.md) * [3.4.4 动态属性](3/zend_prop.md) - * 3.4.5 魔术方法 + * [3.4.5 魔术方法](3/zend_magic_method.md) * 3.4.6 抽象类和接口 * [3.5 运行时缓存](3/zend_runtime_cache.md) * [第4章 PHP基础语法实现](4/php_language.md) @@ -42,6 +42,7 @@ * 5.2 引用计数() * 5.3 垃圾回收(gc.md) * 第6章 扩展开发 + * 6.1 扩展的构成 ## 反馈 [交流&吐槽](https://github.com/pangudashu/php7-internal/issues/3) [错误反馈](https://github.com/pangudashu/php7-internal/issues/2) From 7dafc629c327506408aec9979f18f3075b8cc165 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Sat, 8 Apr 2017 21:52:03 +0800 Subject: [PATCH 125/379] update --- 1/base_introduction.md | 31 +++++++++++++++++++++++++------ 1 file changed, 25 insertions(+), 6 deletions(-) diff --git a/1/base_introduction.md b/1/base_introduction.md index a1b12c2..7c8c417 100644 --- a/1/base_introduction.md +++ b/1/base_introduction.md @@ -1,13 +1,32 @@ -## 1.1 基本概念 -PHP,即“PHP: Hypertext Preprocessor”,是一种被广泛应用的开源通用脚本语言,尤其适用于 Web 开发并可嵌入 HTML 中去。它的语法利用了 C、Java 和 Perl,易于学习。该语言的主要目标是允许 web 开发人员快速编写动态生成的 web 页面,但 PHP 的用途远不只于此。 +## 1.1 PHP简介 + +### 1.1.1 PHP的历史发展 +PHP是一种非常流行的高级脚本语言,尤其适合Web开发,快速、灵活和实用是PHP最重要的特点。PHP自1995年由Lerdorf创建以来,在全球得到了非常广泛的应用。 + +在1995年早期以Personal Home Page Tools (PHP Tools) 开始对外发表第一个版本,Lerdorf写了一些介绍此程序的文档,并且发布了PHP1.0。在这早期的版本中,提供了访客留言本、访客计数器等简单的功能,之后越来越多的网站开始使用PHP,并且强烈要求增加一些特性,在新的成员加入开发行列之后,Rasmus Lerdorf 在1995年6月8日将 PHP/FI 公开发布,希望可以通过社群来加速程序开发与寻找错误。这个发布的版本命名为 PHP 2,已经有今日 PHP 的一些雏型,像是类似 Perl 的变量命名方式、表单处理功能、以及嵌入到 HTML 中执行的能力。程序语法上也类似 Perl,有较多的限制,不过更简单、更有弹性。PHP/FI加入了对MySQL的支持,从此建立了PHP在动态网页开发上的地位。到了1996年底,有15000个网站使用 PHP/FI。 + +在1997年,任职于 Technion IIT 公司的两个以色列程序设计师:Zeev Suraski 和 Andi Gutmans,重写了PHP的解析器,成为PHP3的基础,而 PHP 也在这个时候改称为PHP:Hypertext Preprocessor,1998年6月正式发布 PHP 3。Zeev Suraski 和 Andi Gutmans 在 PHP 3 发布后开始改写 PHP 的核心,这个在1999年发布的解析器称为 Zend Engine,他们也在以色列的 Ramat Gan 成立了 Zend Technologies 来管理 PHP 的开发。 + +在2000年5月22日,以Zend Engine 1.0为基础的PHP 4正式发布,2004年7月13日则发布了PHP 5,PHP 5则使用了第二代的Zend Engine。PHP包含了许多新特色:完全实现面向对象、引入PDO、以及许多性能方面的改进。目前PHP5.X仍然是应用非常广泛的一个版本。 + +### 1.1.2 PHP特点 +PHP 独特的语法混合了 C、Java、Perl 以及 PHP 自创新的语法,丰富的语法支持、同时支持面向对象、面向过程,相比C、Java等语言具有语法简洁、使用灵活、开发效率高、容易学习等特点。 + +* 开源免费:PHP社群有大量活跃的开发者贡献代码 +* 快捷:程序开发快,运行快,技术本身学习快,实用性强 +* 效率高:PHP消耗相当少的系统资源,自动gc机制 +* 类库资源:有大量可用类库供开发者使用 +* 扩展性:允许用户使用C/C++扩展PHP +* 跨平台:可以在unix、windows、max os等系统上面使用PHP + +## 1.2 PHP7特性 + +## 1.3 PHP内核的组成 ### 1.1.1 SAPI PHP本身可以理解为是一个库函数,它有标准的输入、输出,而SAPI可以认为是PHP的一个使用者,它可以调用PHP内核提供的一些接口,所以严格意义上讲SAPI并不算PHP内核的一部分,最常用的SAPI就是cli、php-fpm这两个了,它们是再普通不过的C程序了,main函数通常也是定义在SAPI中,而PHP就是一个纯碎的解析器。 -### 1.1.2 PHP - ### 1.1.3 Zend引擎 Zend是PHP语言实现的核心,比如语法分析、代码执行等等都是Zend引擎实现的,这是PHP最基础、最核心的部分,我们后面绝大部分的源码分析都是针对Zend的。 - - +## 1.4 PHP执行的几个阶段 From c5fd47be5dfc3a5749f417ac37e3441608de05d5 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Sun, 9 Apr 2017 15:35:26 +0800 Subject: [PATCH 126/379] update --- 6/ts.md | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 6/ts.md diff --git a/6/ts.md b/6/ts.md new file mode 100644 index 0000000..e6d26c2 --- /dev/null +++ b/6/ts.md @@ -0,0 +1,9 @@ +## 6.1 介绍 + +### 6.1.1 什么是线程安全 +在C语言中声明在任何函数之外的变量为全局变量,全局变量为各线程共享,不同的线程引用同一地址空间,如果一个线程修改了全局变量就会影响所有的线程。所以线程安全是指多线程环境下如何安全的获取公共资源。 + +PHP的SAPI多数是单线程环境,比如cli、fpm、cgi,每个进程只启动一个主线程,这种模式下是不存在线程安全问题的,但是也有多线程的环境,比如Apache,或用户自己嵌入PHP实现的环境,这种情况下就需要考虑线程安全的问题了,因为PHP中有很多全局变量,比如最常见的:EG、CG,如果多个线程共享同一个变量将会冲突,所以PHP为多线程的应用模型提供了一个安全机制:Zend线程安全(Zend Thread Safe)。 + +### 6.1.2 线程安全实现方式 + From 878b9e65712f7408c5e9824fd973db8b022b641a Mon Sep 17 00:00:00 2001 From: qinpeng Date: Sun, 9 Apr 2017 16:46:38 +0800 Subject: [PATCH 127/379] add tsrm --- 6/ts.md | 37 +++++++++++++++++++++++++++++++++---- {6 => 7}/execute_timeout.md | 0 README.md | 7 +++++-- 3 files changed, 38 insertions(+), 6 deletions(-) rename {6 => 7}/execute_timeout.md (100%) diff --git a/6/ts.md b/6/ts.md index e6d26c2..a0177dc 100644 --- a/6/ts.md +++ b/6/ts.md @@ -1,9 +1,38 @@ ## 6.1 介绍 - -### 6.1.1 什么是线程安全 在C语言中声明在任何函数之外的变量为全局变量,全局变量为各线程共享,不同的线程引用同一地址空间,如果一个线程修改了全局变量就会影响所有的线程。所以线程安全是指多线程环境下如何安全的获取公共资源。 -PHP的SAPI多数是单线程环境,比如cli、fpm、cgi,每个进程只启动一个主线程,这种模式下是不存在线程安全问题的,但是也有多线程的环境,比如Apache,或用户自己嵌入PHP实现的环境,这种情况下就需要考虑线程安全的问题了,因为PHP中有很多全局变量,比如最常见的:EG、CG,如果多个线程共享同一个变量将会冲突,所以PHP为多线程的应用模型提供了一个安全机制:Zend线程安全(Zend Thread Safe)。 +PHP的SAPI多数是单线程环境,比如cli、fpm、cgi,每个进程只启动一个主线程,这种模式下是不存在线程安全问题的,但是也有多线程的环境,比如Apache,或用户自己嵌入PHP实现的环境,这种情况下就需要考虑线程安全的问题了,因为PHP中有很多全局变量,比如最常见的:EG、CG,如果多个线程共享同一个变量将会冲突,所以PHP为多线程的应用模型提供了一个安全机制:Zend线程安全(Zend Thread Safe, ZTS)。 + +## 6.2 线程安全资源管理器 +PHP中专门为解决线程安全的问题抽象出了一个线程安全资源管理器(Thread Safe Resource Mananger, TSRM),实现原理比较简单:各线程不再共享同一份全局变量,而是各复制一份,使用数据时各线程各取自己的副本,互不干扰。 + +### 6.2.1 基本实现 +TSRM核心思想就是为不同的线程分配独立的内存空间,如果一个资源会被多线程使用,那么首先需要预先向TSRM注册资源,然后TSRM为这个资源分配一个唯一的编号,并把这种资源的大小、初始化函数等保存到一个`tsrm_resource_type`结构中,各线程只能通过TSRM分配的那个编号访问这个资源;然后当线程拿着这个编号获取资源时TSRM如果发现是第一次请求,则会根据注册时的资源大小分配一块内存,然后调用初始化函数进行初始化,并把这块资源保存下来供这个线程后续使用。 + +TSRM中通过两个结构分别保存资源信息以及具体的资源:tsrm_resource_type、tsrm_tls_entry,前者是用来记录资源大小、初始化函数等信息的,具体分配资源内存时会用到,而后者用来保存各线程所拥有的全部资源: +```c +struct _tsrm_tls_entry { + void **storage; //资源数组 + int count; //拥有的资源数:storage数组大小 + THREAD_T thread_id; //所属线程id + tsrm_tls_entry *next; +}; + +typedef struct { + size_t size; //资源的大小 + ts_allocate_ctor ctor; //初始化函数 + ts_allocate_dtor dtor; + int done; +} tsrm_resource_type; +``` +每个线程拥有一个`tsrm_tls_entry`结构,当前线程的所有资源保存在storage数组中,下标就是各资源的id。 + +另外所有线程的`tsrm_tls_entry`结构通过一个数组保存:tsrm_tls_table,这是个全局变量,所以操作这个变量时需要加锁。这个值在TSRM初始化时按照预设置的线程数分配,每个线程的tsrm_tls_entry结构在这个数组中的位置是根据线程id与预设置的线程数(tsrm_tls_table_size)取模得到的,也就是说有可能多个线程保存在tsrm_tls_table同一位置,所以tsrm_tls_entry是个链表,查找资源时首先根据:`线程id % tsrm_tls_table_size`得到一个tsrm_tls_entry,然后开始遍历链表比较thread_id确定是否是当前线程的。 + +比如tsrm_tls_table_size=2,则thread 2、thread 4将保存在tsrm_tls_table[0]中,如果只有CG、EG两个资源,则存储结构如下图: + +![](../img/tsrm_tls_table.png) + +### 6.2.2 Native-TLS -### 6.1.2 线程安全实现方式 diff --git a/6/execute_timeout.md b/7/execute_timeout.md similarity index 100% rename from 6/execute_timeout.md rename to 7/execute_timeout.md diff --git a/README.md b/README.md index 9d33a14..577e1a1 100644 --- a/README.md +++ b/README.md @@ -41,8 +41,11 @@ * [5.1 Zend内存池](5/zend_alloc.md) * 5.2 引用计数() * 5.3 垃圾回收(gc.md) -* 第6章 扩展开发 - * 6.1 扩展的构成 +* 第6章 线程安全 + * 6.1 什么是线程安全 + * 6.2 线程安全资源管理器 +* 第7章 扩展开发 + * 7.1 扩展的构成 ## 反馈 [交流&吐槽](https://github.com/pangudashu/php7-internal/issues/3) [错误反馈](https://github.com/pangudashu/php7-internal/issues/2) From 246e564f21b9f293d7b15c46f053826e83ad5d9e Mon Sep 17 00:00:00 2001 From: qinpeng Date: Sun, 9 Apr 2017 16:47:33 +0800 Subject: [PATCH 128/379] add img --- img/tsrm_tls_table.png | Bin 0 -> 30653 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 img/tsrm_tls_table.png diff --git a/img/tsrm_tls_table.png b/img/tsrm_tls_table.png new file mode 100644 index 0000000000000000000000000000000000000000..552e9db936f142741e98b609eaaddca52269d77a GIT binary patch literal 30653 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 Date: Mon, 10 Apr 2017 14:00:36 +0800 Subject: [PATCH 129/379] add tsrm --- 6/ts.md | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/6/ts.md b/6/ts.md index a0177dc..f131dbb 100644 --- a/6/ts.md +++ b/6/ts.md @@ -29,6 +29,26 @@ typedef struct { 另外所有线程的`tsrm_tls_entry`结构通过一个数组保存:tsrm_tls_table,这是个全局变量,所以操作这个变量时需要加锁。这个值在TSRM初始化时按照预设置的线程数分配,每个线程的tsrm_tls_entry结构在这个数组中的位置是根据线程id与预设置的线程数(tsrm_tls_table_size)取模得到的,也就是说有可能多个线程保存在tsrm_tls_table同一位置,所以tsrm_tls_entry是个链表,查找资源时首先根据:`线程id % tsrm_tls_table_size`得到一个tsrm_tls_entry,然后开始遍历链表比较thread_id确定是否是当前线程的。 +下面具体看下TSRM初始化的过程(以pthread为例): +```c +TSRM_API int tsrm_startup(int expected_threads, int expected_resources, int debug_level, char *debug_filename) +{ + pthread_key_create( &tls_key, 0 ); + + //分配tsrm_tls_table + tsrm_tls_table_size = expected_threads; + tsrm_tls_table = (tsrm_tls_entry **) calloc(tsrm_tls_table_size, sizeof(tsrm_tls_entry *)); + ... + id_count=0; + + //分配资源类型数组:resource_types_table + resource_types_table_size = expected_resources; + resource_types_table = (tsrm_resource_type *) calloc(resource_types_table_size, sizeof(tsrm_resource_type)); + ... + //创建锁 + tsmm_mutex = tsrm_mutex_alloc(); +} +``` 比如tsrm_tls_table_size=2,则thread 2、thread 4将保存在tsrm_tls_table[0]中,如果只有CG、EG两个资源,则存储结构如下图: ![](../img/tsrm_tls_table.png) From 8b2bcf9fc5a2bba3078aac92d1c356882d931d6a Mon Sep 17 00:00:00 2001 From: qinpeng Date: Mon, 10 Apr 2017 19:30:05 +0800 Subject: [PATCH 130/379] update --- 6/ts.md | 104 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 104 insertions(+) diff --git a/6/ts.md b/6/ts.md index f131dbb..8b2e2f5 100644 --- a/6/ts.md +++ b/6/ts.md @@ -39,6 +39,7 @@ TSRM_API int tsrm_startup(int expected_threads, int expected_resources, int debu tsrm_tls_table_size = expected_threads; tsrm_tls_table = (tsrm_tls_entry **) calloc(tsrm_tls_table_size, sizeof(tsrm_tls_entry *)); ... + //初始化资源的递增id,注册资源时就是用的这个值 id_count=0; //分配资源类型数组:resource_types_table @@ -49,6 +50,109 @@ TSRM_API int tsrm_startup(int expected_threads, int expected_resources, int debu tsmm_mutex = tsrm_mutex_alloc(); } ``` +这个步骤在sapi启动时执行,主要工作就是分配tsrm_tls_table、resource_types_table内存以及创建线程互斥锁。 + +初始化完成各模块会各自进行资源注册,注册后TSRM会给注册的资源分配唯一id,接下来我们以EG为例具体看下其注册、分配资源以及各线程获取的过程。 + +```c +#ifdef ZTS +ZEND_API int executor_globals_id; +#endif + +int zend_startup(zend_utility_functions *utility_functions, char **extensions) +{ + ... +#ifdef ZTS + ts_allocate_id(&executor_globals_id, sizeof(zend_executor_globals), (ts_allocate_ctor) executor_globals_ctor, (ts_allocate_dtor) executor_globals_dtor); + + executor_globals = ts_resource(executor_globals_id); + ... +#endif +} +``` +这里有两步操作: + +__step (1)__ 首先是资源注册:`ts_allocate_id()`,参数有4个,第一个就是定义的资源id指针,注册之后会把分配的id写到这里,第二个是资源类型的大小,EG资源的结构是`zend_executor_globals`,所以这个值就是sizeof(zend_executor_globals),后面两个分别是资源的初始化函数以及销毁函数,因为TSRM并不关心资源的具体类型,分配资源时它只按照size大小分配内存,然后回调各资源自己定义的ctor进行初始化。 +```c +TSRM_API ts_rsrc_id ts_allocate_id(ts_rsrc_id *rsrc_id, size_t size, ts_allocate_ctor ctor, ts_allocate_dtor dtor) +{ + //加锁,保证各线程串行调用此函数 + tsrm_mutex_lock(tsmm_mutex); + + //分配id,即id_count当前值,然后把id_count加1 + *rsrc_id = TSRM_SHUFFLE_RSRC_ID(id_count++); + + //检查resource_types_table数组当前大小是否已满 + if (resource_types_table_size < id_count) { + //需要对resource_types_table扩容 + resource_types_table = (tsrm_resource_type *) realloc(resource_types_table, sizeof(tsrm_resource_type)*id_count); + ... + //把数组大小修改新的大小 + resource_types_table_size = id_count; + } + + //将新注册的资源插入resource_types_table数组,下标就是分配的资源id + resource_types_table[TSRM_UNSHUFFLE_RSRC_ID(*rsrc_id)].size = size; + resource_types_table[TSRM_UNSHUFFLE_RSRC_ID(*rsrc_id)].ctor = ctor; + resource_types_table[TSRM_UNSHUFFLE_RSRC_ID(*rsrc_id)].dtor = dtor; + resource_types_table[TSRM_UNSHUFFLE_RSRC_ID(*rsrc_id)].done = 0; + ... +} +``` + +到这里并没有结束,所有的资源并不是统一时机注册的,所以注册一个新资源时可能有线程已经分配先前注册的资源了,因此需要对各线程的storage数组进行扩容,否则storage将没有空间容纳新的资源。扩容的过程比较简单:遍历各线程的tsrm_tls_entry,检查storage当时是否有空闲空间,有的话跳过,没有的话则扩展。 +```c +for (i=0; icount < id_count) { + int j; + + //将storage扩容 + p->storage = (void *) realloc(p->storage, sizeof(void *)*id_count); + //分配并初始化新注册的资源,实际这里只会执行一次,不清楚为什么用循环 + //另外这里不分配内存也可以,可以放到使用时再去分配 + for (j=p->count; jstorage[j] = (void *) malloc(resource_types_table[j].size); + if (resource_types_table[j].ctor) { + //回调初始化函数进行初始化 + resource_types_table[j].ctor(p->storage[j]); + } + } + p->count = id_count; + } + p = p->next; + } +} +``` +最后将锁释放,完成注册。 + +__step (2)__ 完成资源注册后接下来就可以根据资源id安全的操作这个资源了,通过`ts_resource()`获取资源的值,比如EG: +```c +zend_executor_globals *executor_globals; + +executor_globals = ts_resource(executor_globals_id); +``` +这样获取的`executor_globals`值就是各线程分离的了,对它的操作将不会再影响其它线程。根据资源id获取当前线程资源的过程:首先是根据线程id哈希得到当前线程的tsrm_tls_entry在tsrm_tls_table哪个槽中,然后开始遍历比较id,直到找到当前线程的tsrm_tls_entry,这个查找过程是需要加锁的,最后根据资源id从storage中对应位置取出资源的地址,这个时候如果发现当前线程还没有创建此资源则会从resource_types_table根据资源id取出资源注册时的大小、初始化函数,然后分配内存、调用初始化函数进行初始化并插入所属线程的storage中。 +```c +TSRM_API void *ts_resource_ex(ts_rsrc_id id, THREAD_T *th_id) +{ + THREAD_T thread_id; + int hash_value; + tsrm_tls_entry *thread_resources; + + if (!th_id) { + thread_resources = tsrm_tls_get(); + + }else{ + thread_id = *th_id; + } +} +``` + + 比如tsrm_tls_table_size=2,则thread 2、thread 4将保存在tsrm_tls_table[0]中,如果只有CG、EG两个资源,则存储结构如下图: ![](../img/tsrm_tls_table.png) From 602221f93f68b8c02562aafd96094ffa535483c3 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Mon, 10 Apr 2017 20:02:49 +0800 Subject: [PATCH 131/379] update --- 6/ts.md | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 69 insertions(+), 2 deletions(-) diff --git a/6/ts.md b/6/ts.md index 8b2e2f5..d7729a5 100644 --- a/6/ts.md +++ b/6/ts.md @@ -4,7 +4,7 @@ PHP的SAPI多数是单线程环境,比如cli、fpm、cgi,每个进程只启动一个主线程,这种模式下是不存在线程安全问题的,但是也有多线程的环境,比如Apache,或用户自己嵌入PHP实现的环境,这种情况下就需要考虑线程安全的问题了,因为PHP中有很多全局变量,比如最常见的:EG、CG,如果多个线程共享同一个变量将会冲突,所以PHP为多线程的应用模型提供了一个安全机制:Zend线程安全(Zend Thread Safe, ZTS)。 ## 6.2 线程安全资源管理器 -PHP中专门为解决线程安全的问题抽象出了一个线程安全资源管理器(Thread Safe Resource Mananger, TSRM),实现原理比较简单:各线程不再共享同一份全局变量,而是各复制一份,使用数据时各线程各取自己的副本,互不干扰。 +PHP中专门为解决线程安全的问题抽象出了一个线程安全资源管理器(Thread Safe Resource Mananger, TSRM),实现原理比较简单:既然共用资源这么困难那么就干脆不共用,各线程不再共享同一份全局变量,而是各复制一份,使用数据时各线程各取自己的副本,互不干扰。 ### 6.2.1 基本实现 TSRM核心思想就是为不同的线程分配独立的内存空间,如果一个资源会被多线程使用,那么首先需要预先向TSRM注册资源,然后TSRM为这个资源分配一个唯一的编号,并把这种资源的大小、初始化函数等保存到一个`tsrm_resource_type`结构中,各线程只能通过TSRM分配的那个编号访问这个资源;然后当线程拿着这个编号获取资源时TSRM如果发现是第一次请求,则会根据注册时的资源大小分配一块内存,然后调用初始化函数进行初始化,并把这块资源保存下来供这个线程后续使用。 @@ -143,14 +143,81 @@ TSRM_API void *ts_resource_ex(ts_rsrc_id id, THREAD_T *th_id) int hash_value; tsrm_tls_entry *thread_resources; + //step 1:获取线程id if (!th_id) { + //获取当前线程通过specific data保存的tsrm_tls_entry,暂时忽略 thread_resources = tsrm_tls_get(); - + if(thread_resources){ + //找到线程的tsrm_tls_entry了 + TSRM_SAFE_RETURN_RSRC(thread_resources->storage, id, thread_resources->count); //直接返回 + } + //pthread_self(),当前线程id + thread_id = tsrm_thread_id(); }else{ thread_id = *th_id; } + + //step 2:查找线程tsrm_tls_entry + tsrm_mutex_lock(tsmm_mutex); //加锁 + + //实际就是thread_id % tsrm_tls_table_size + hash_value = THREAD_HASH_OF(thread_id, tsrm_tls_table_size); + //链表头部 + thread_resources = tsrm_tls_table[hash_value]; + if (!thread_resources) { + //当前线程第一次使用资源还未分配:先分配tsrm_tls_entry + allocate_new_resource(&tsrm_tls_table[hash_value], thread_id); + //分配完再次调用,这时候将走到下面的分支 + return ts_resource_ex(id, &thread_id); + }else{ + //遍历查找当前线程的tsrm_tls_entry + do { + //找到了 + if (thread_resources->thread_id == thread_id) { + break; + } + if (thread_resources->next) { + thread_resources = thread_resources->next; + } else { + //遍历到最后也没找到,与上面的一致,先分配再查找 + allocate_new_resource(&thread_resources->next, thread_id); + return ts_resource_ex(id, &thread_id); + } + } while (thread_resources); + } + //解锁 + tsrm_mutex_unlock(tsmm_mutex); + + //step 3:返回资源 + TSRM_SAFE_RETURN_RSRC(thread_resources->storage, id, thread_resources->count); +} +``` +首先是获取线程id,如果没有传的话就是当前线程,然后在tsrm_tls_table中查找当前线程的tsrm_tls_entry,不存在则表示当前线程第一次使用资源,则需要调用`allocate_new_resource()`为当前线程分配tsrm_tls_entry,并插入tsrm_tls_table,这个过程还会为当前已注册的所有资源分配内存: +```c +static void allocate_new_resource(tsrm_tls_entry **thread_resources_ptr, THREAD_T thread_id) +{ + (*thread_resources_ptr) = (tsrm_tls_entry *) malloc(sizeof(tsrm_tls_entry)); + (*thread_resources_ptr)->storage = NULL; + //根据已注册资源数分配storage数组大小,注意这里并不是分配为各资源分配空间 + if (id_count > 0) { + (*thread_resources_ptr)->storage = (void **) malloc(sizeof(void *)*id_count); + } + (*thread_resources_ptr)->count = id_count; + (*thread_resources_ptr)->thread_id = thread_id; + + //将当前线程的tsrm_tls_entry保存到线程本地存储(Thread Local Storage, TLS) + tsrm_tls_set(*thread_resources_ptr); + + //为全部资源分配空间 + for (i=0; istorage[i] = (void *) malloc(resource_types_table[i].size); + ... + } + ... } ``` +> 线程本地存储(Thread Local Storage): 比如tsrm_tls_table_size=2,则thread 2、thread 4将保存在tsrm_tls_table[0]中,如果只有CG、EG两个资源,则存储结构如下图: From 546bc6f15a51deaf3f007e89b59cfafd2cf44ecb Mon Sep 17 00:00:00 2001 From: qinpeng Date: Mon, 10 Apr 2017 20:06:01 +0800 Subject: [PATCH 132/379] update --- 6/ts.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/6/ts.md b/6/ts.md index d7729a5..bbbe8ae 100644 --- a/6/ts.md +++ b/6/ts.md @@ -217,7 +217,7 @@ static void allocate_new_resource(tsrm_tls_entry **thread_resources_ptr, THREAD_ ... } ``` -> 线程本地存储(Thread Local Storage): +> __线程本地存储(Thread Local Storage, TLS):__ 我们知道在一个进程中,所有线程是共享同一个地址空间的。所以,如果一个变量是全局的或者是静态的,那么所有线程访问的是同一份,如果某一个线程对其进行了修改,也就会影响到其他所有的线程。不过我们可能并不希望这样,所以更多的推荐用基于堆栈的自动变量或函数参数来访问数据,因为基于堆栈的变量总是和特定的线程相联系的。 比如tsrm_tls_table_size=2,则thread 2、thread 4将保存在tsrm_tls_table[0]中,如果只有CG、EG两个资源,则存储结构如下图: From 40b41bcd4884cebabf81db98122ff67762af350a Mon Sep 17 00:00:00 2001 From: qinpeng Date: Tue, 11 Apr 2017 18:18:13 +0800 Subject: [PATCH 133/379] update --- 6/ts.md | 24 ++++++++++++------------ img/tsrm_tls_a.png | Bin 0 -> 38989 bytes 2 files changed, 12 insertions(+), 12 deletions(-) create mode 100644 img/tsrm_tls_a.png diff --git a/6/ts.md b/6/ts.md index bbbe8ae..147c108 100644 --- a/6/ts.md +++ b/6/ts.md @@ -29,7 +29,8 @@ typedef struct { 另外所有线程的`tsrm_tls_entry`结构通过一个数组保存:tsrm_tls_table,这是个全局变量,所以操作这个变量时需要加锁。这个值在TSRM初始化时按照预设置的线程数分配,每个线程的tsrm_tls_entry结构在这个数组中的位置是根据线程id与预设置的线程数(tsrm_tls_table_size)取模得到的,也就是说有可能多个线程保存在tsrm_tls_table同一位置,所以tsrm_tls_entry是个链表,查找资源时首先根据:`线程id % tsrm_tls_table_size`得到一个tsrm_tls_entry,然后开始遍历链表比较thread_id确定是否是当前线程的。 -下面具体看下TSRM初始化的过程(以pthread为例): +#### 6.2.1.1 初始化 +在使用TSRM之前需要主动开启,一般这个步骤在sapi启动时执行,主要工作就是分配tsrm_tls_table、resource_types_table内存以及创建线程互斥锁,下面具体看下TSRM初始化的过程(以pthread为例): ```c TSRM_API int tsrm_startup(int expected_threads, int expected_resources, int debug_level, char *debug_filename) { @@ -50,10 +51,8 @@ TSRM_API int tsrm_startup(int expected_threads, int expected_resources, int debu tsmm_mutex = tsrm_mutex_alloc(); } ``` -这个步骤在sapi启动时执行,主要工作就是分配tsrm_tls_table、resource_types_table内存以及创建线程互斥锁。 - -初始化完成各模块会各自进行资源注册,注册后TSRM会给注册的资源分配唯一id,接下来我们以EG为例具体看下其注册、分配资源以及各线程获取的过程。 - +#### 6.2.1.2 资源注册 +初始化完成各模块就可以各自进行资源注册了,注册后TSRM会给注册的资源分配唯一id,之后对此资源的操作只能依据此id,接下来我们以EG为例具体看下其注册过程。 ```c #ifdef ZTS ZEND_API int executor_globals_id; @@ -70,9 +69,7 @@ int zend_startup(zend_utility_functions *utility_functions, char **extensions) #endif } ``` -这里有两步操作: - -__step (1)__ 首先是资源注册:`ts_allocate_id()`,参数有4个,第一个就是定义的资源id指针,注册之后会把分配的id写到这里,第二个是资源类型的大小,EG资源的结构是`zend_executor_globals`,所以这个值就是sizeof(zend_executor_globals),后面两个分别是资源的初始化函数以及销毁函数,因为TSRM并不关心资源的具体类型,分配资源时它只按照size大小分配内存,然后回调各资源自己定义的ctor进行初始化。 +资源注册调用`ts_allocate_id()`完成,此函数有4个参数有,第一个就是定义的资源id指针,注册之后会把分配的id写到这里,第二个是资源类型的大小,EG资源的结构是`zend_executor_globals`,所以这个值就是sizeof(zend_executor_globals),后面两个分别是资源的初始化函数以及销毁函数,因为TSRM并不关心资源的具体类型,分配资源时它只按照size大小分配内存,然后回调各资源自己定义的ctor进行初始化。 ```c TSRM_API ts_rsrc_id ts_allocate_id(ts_rsrc_id *rsrc_id, size_t size, ts_allocate_ctor ctor, ts_allocate_dtor dtor) { @@ -99,7 +96,6 @@ TSRM_API ts_rsrc_id ts_allocate_id(ts_rsrc_id *rsrc_id, size_t size, ts_allocate ... } ``` - 到这里并没有结束,所有的资源并不是统一时机注册的,所以注册一个新资源时可能有线程已经分配先前注册的资源了,因此需要对各线程的storage数组进行扩容,否则storage将没有空间容纳新的资源。扩容的过程比较简单:遍历各线程的tsrm_tls_entry,检查storage当时是否有空闲空间,有的话跳过,没有的话则扩展。 ```c for (i=0; i __线程本地存储(Thread Local Storage, TLS):__ 我们知道在一个进程中,所有线程是共享同一个地址空间的。所以,如果一个变量是全局的或者是静态的,那么所有线程访问的是同一份,如果某一个线程对其进行了修改,也就会影响到其他所有的线程。不过我们可能并不希望这样,所以更多的推荐用基于堆栈的自动变量或函数参数来访问数据,因为基于堆栈的变量总是和特定的线程相联系的。 +这里还用到了一个多线程中经常用到的一个东西:线程本地存储(Thread Local Storage, TLS),在创建完当前线程的tsrm_tls_entry后会把这个值保存到当前线程的TLS中(即:tsrm_tls_set(*thread_resources_ptr)操作),这样在`ts_resource()`中就可以通过`tsrm_tls_get()`直接取到了,节省加锁检索的时间。 + +> __线程本地存储(Thread Local Storage, TLS):__ 我们知道在一个进程中,所有线程是共享同一个地址空间的。所以,如果一个变量是全局的或者是静态的,那么所有线程访问的是同一份,如果某一个线程对其进行了修改,也就会影响到其他所有的线程。不过我们可能并不希望这样,所以更多的推荐用基于堆栈的自动变量或函数参数来访问数据,因为基于堆栈的变量总是和特定的线程相联系的。TLS在各平台下实现方式不同,主要分为两类:静态TLS、动态TLS,pthread中pthread_setspecific()、pthread_getspecific()的实现就可以认为是动态TLS的实现。 +比如tsrm_tls_table_size初始化时设置为了2,当前有2个thread:thread 1、thread 2,假如注册了CG、EG两个资源,则存储结构如下图: -比如tsrm_tls_table_size=2,则thread 2、thread 4将保存在tsrm_tls_table[0]中,如果只有CG、EG两个资源,则存储结构如下图: +![](../img/tsrm_table_a.png) ![](../img/tsrm_tls_table.png) diff --git a/img/tsrm_tls_a.png b/img/tsrm_tls_a.png new file mode 100644 index 0000000000000000000000000000000000000000..d6af083c9a2ab5c99beea50feb1dff4e3ddd4cd0 GIT binary patch literal 38989 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%0A>5eLx`+Mz&b#R%i#36@oHkl34Z--MnyCFEhe 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 bYcRKA9UypzVpdFrz)M^G_>nBtGgtl}OE_cw literal 0 HcmV?d00001 From 4716902a715fef1384e8e542d01b9b9efb466748 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Tue, 11 Apr 2017 18:19:24 +0800 Subject: [PATCH 134/379] update --- 6/ts.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/6/ts.md b/6/ts.md index 147c108..67ea91c 100644 --- a/6/ts.md +++ b/6/ts.md @@ -220,9 +220,7 @@ static void allocate_new_resource(tsrm_tls_entry **thread_resources_ptr, THREAD_ 比如tsrm_tls_table_size初始化时设置为了2,当前有2个thread:thread 1、thread 2,假如注册了CG、EG两个资源,则存储结构如下图: -![](../img/tsrm_table_a.png) - -![](../img/tsrm_tls_table.png) +![](../img/tsrm_tls_a.png) ### 6.2.2 Native-TLS From 57a15aca28737659967f11d749245651626cba8c Mon Sep 17 00:00:00 2001 From: qinpeng Date: Wed, 12 Apr 2017 17:41:53 +0800 Subject: [PATCH 135/379] update --- 6/ts.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/6/ts.md b/6/ts.md index 67ea91c..c19550a 100644 --- a/6/ts.md +++ b/6/ts.md @@ -223,5 +223,23 @@ static void allocate_new_resource(tsrm_tls_entry **thread_resources_ptr, THREAD_ ![](../img/tsrm_tls_a.png) ### 6.2.2 Native-TLS +上一节我们介绍了资源的注册以及根据资源id获取资源的方法,那么PHP内核每次使用对应的资源时难道都需要调用`ts_resource()`吗?如果是这样的话那么多次在使用EG时实际都会调一次这个方法,相当于我们需要调用一个函数来获取一个变量,这在性能上是不可接受的,那么有什么办法解决呢? + +`ts_resource()`最核心的操作就是根据线程id获取各线程对应的storage数组,这也是最耗时的部分,至于接下来根据资源id从storage数组读取资源就是普通的内存读取了,这并不影响性能,所以解决上面那个问题的关键就在于 __尽可能的减少线程storage的检索__ 。这一节我们来分析下PHP是如果解决这个问题的,在介绍PHP7实现方式之前我们先看下PHP5.x的处理方式。 + +PHP5的解决方式非常简单,我们还是以EG为例,EG在内核中随处可见,不是要减少对各线程storage的检索次数吗,那么我就只要检索过一次就把已获取的storage指针传给接下来调用的函数用,其它函数再一级级往下传,这样一来各函数如果发现storage通过参数传进来了就直接用,无需再检索了,也就是通过层层传递的方式减少解决这个问题的。这样以来岂不是每个函数都得带这么一个参数?调用别的函数也得把这个值带上?是的。即使这个函数自己不用它也得需要这个值,因为有可能调用别的函数的时候其它函数会用。 + +如果你对PHP5有所了解的话一定经常看到这两个宏:TSRMLS_DC、TSRMLS_CC,这两个宏就是用来传递storage指针的,TSRMLS_DC用在定义函数的参数中,实际上它就是一个普通的参数定义,TSRMLS_CC用在调用函数时,它就是一个普通的变量值,我们看下它的展开结果: +```c +#define TSRMLS_DC , void ***tsrm_ls +#define TSRMLS_CC , tsrm_ls +``` +它的用法是第一个检索到storage的函数把它的指针传递给了下面的函数,参数是tsrm_ls,后面的函数直接根据接收的参数使用获取再传给其它函数。现在我们再看下EG宏展开的结果: +```c +# define EG(v) TSRMG(executor_globals_id, zend_executor_globals *, v) + +#define TSRMG(id, type, element) (((type) (*((void ***) tsrm_ls))[TSRM_UNSHUFFLE_RSRC_ID(id)])->element) +``` +比如:`EG(function_table) => (((zend_executor_globals *) (*((void ***) tsrm_ls))[executor_globals_id])->function_table)`,这样我们在传了tsrm_ls的函数中就可能读取内存使用了。 From dcb0c7e0a8a503408c70bbcf9f2ca70fbd1dc402 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Wed, 12 Apr 2017 17:53:50 +0800 Subject: [PATCH 136/379] udpate --- 6/ts.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/6/ts.md b/6/ts.md index c19550a..8ed69db 100644 --- a/6/ts.md +++ b/6/ts.md @@ -234,12 +234,15 @@ PHP5的解决方式非常简单,我们还是以EG为例,EG在内核中随处 #define TSRMLS_DC , void ***tsrm_ls #define TSRMLS_CC , tsrm_ls ``` -它的用法是第一个检索到storage的函数把它的指针传递给了下面的函数,参数是tsrm_ls,后面的函数直接根据接收的参数使用获取再传给其它函数。现在我们再看下EG宏展开的结果: +它的用法是第一个检索到storage的函数把它的指针传递给了下面的函数,参数是tsrm_ls,后面的函数直接根据接收的参数使用获取再传给其它函数,当然也可以不传,那样的话就得重新调用ts_resource()获取了。现在我们再看下EG宏展开的结果: ```c # define EG(v) TSRMG(executor_globals_id, zend_executor_globals *, v) #define TSRMG(id, type, element) (((type) (*((void ***) tsrm_ls))[TSRM_UNSHUFFLE_RSRC_ID(id)])->element) ``` -比如:`EG(function_table) => (((zend_executor_globals *) (*((void ***) tsrm_ls))[executor_globals_id])->function_table)`,这样我们在传了tsrm_ls的函数中就可能读取内存使用了。 +比如:`EG(function_table) => (((zend_executor_globals *) (*((void ***) tsrm_ls))[executor_globals_id-1])->function_table)`,这样我们在传了tsrm_ls的函数中就可能读取内存使用了。 + +PHP5的这种处理方式简单但是很不优雅,不管你用不用TSRM都不得不在函数中加上那两个宏,而且很容易遗漏。后来Anatol Belski在PHP的rfc提交了一种新的处理方式:[https://wiki.php.net/rfc/native-tls](https://wiki.php.net/rfc/native-tls),新的处理方式最终在PHP7版本得以实现,接下来我们就看下PHP7的实现方式。 + From db3de73419bb8257761fee905cd92f5f1eb7f77e Mon Sep 17 00:00:00 2001 From: qinpeng Date: Thu, 13 Apr 2017 19:07:58 +0800 Subject: [PATCH 137/379] finish tsrm --- 6/ts.md | 53 ++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 52 insertions(+), 1 deletion(-) diff --git a/6/ts.md b/6/ts.md index 8ed69db..e40b51f 100644 --- a/6/ts.md +++ b/6/ts.md @@ -242,7 +242,58 @@ PHP5的解决方式非常简单,我们还是以EG为例,EG在内核中随处 ``` 比如:`EG(function_table) => (((zend_executor_globals *) (*((void ***) tsrm_ls))[executor_globals_id-1])->function_table)`,这样我们在传了tsrm_ls的函数中就可能读取内存使用了。 -PHP5的这种处理方式简单但是很不优雅,不管你用不用TSRM都不得不在函数中加上那两个宏,而且很容易遗漏。后来Anatol Belski在PHP的rfc提交了一种新的处理方式:[https://wiki.php.net/rfc/native-tls](https://wiki.php.net/rfc/native-tls),新的处理方式最终在PHP7版本得以实现,接下来我们就看下PHP7的实现方式。 +PHP5的这种处理方式简单但是很不优雅,不管你用不用TSRM都不得不在函数中加上那两个宏,而且很容易遗漏。后来Anatol Belski在PHP的rfc提交了一种新的处理方式:[https://wiki.php.net/rfc/native-tls](https://wiki.php.net/rfc/native-tls),新的处理方式最终在PHP7版本得以实现,通过静态TLS将各线程的storage保存在全局变量中,各函数中使用时直接读取即可。 +linux下这种全局变量通过加上`__thread`定义,这样各线程更新这个变量就不会冲突了,实际这是gcc提供的,详细的内容这里不再展开,有兴趣的可以再查下详细的资料。举个例子: +```c +#include +#include +#include +#include + +__thread int num = 0; + +void* worker(void* arg){ + while(1){ + printf("thread:%d\n", num); + sleep(1); + } +} + +int main(void) +{ + pthread_t tid; + int ret; + + if ((ret = pthread_create(&tid, NULL, worker, NULL)) != 0){ + return 1; + } + + while(1){ + num = 4; + printf("main:%d\n", num); + sleep(1); + } + + return 0; +} +``` +这个例子有两个线程,其中主线程修改了全局变量num,但是并没有影响另外一个线程。 + +PHP7中用于缓存各线程storage的全局变量定义在`Zend/zend.c`: +```c +#ifdef ZTS +//这些都是全局变量 +ZEND_API int compiler_globals_id; +ZEND_API int executor_globals_id; +static HashTable *global_function_table = NULL; +static HashTable *global_class_table = NULL; +static HashTable *global_constants_table = NULL; +static HashTable *global_auto_globals_table = NULL; +static HashTable *global_persistent_list = NULL; +ZEND_TSRMLS_CACHE_DEFINE() //展开后: __thread void *_tsrm_ls_cache = NULL; +//_tsrm_ls_cache就是各线程storage的地址 +#endif +``` From e3130d06399f17696b5c0dc49260192ba73978da Mon Sep 17 00:00:00 2001 From: qinpeng Date: Thu, 13 Apr 2017 19:10:21 +0800 Subject: [PATCH 138/379] udpate --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 577e1a1..79e2ee5 100644 --- a/README.md +++ b/README.md @@ -30,6 +30,7 @@ * [3.4.4 动态属性](3/zend_prop.md) * [3.4.5 魔术方法](3/zend_magic_method.md) * 3.4.6 抽象类和接口 + * 3.4.7 类的自动加载 * [3.5 运行时缓存](3/zend_runtime_cache.md) * [第4章 PHP基础语法实现](4/php_language.md) * 4.1 变量 @@ -42,8 +43,8 @@ * 5.2 引用计数() * 5.3 垃圾回收(gc.md) * 第6章 线程安全 - * 6.1 什么是线程安全 - * 6.2 线程安全资源管理器 + * [6.1 什么是线程安全](6/ts.md) + * [6.2 线程安全资源管理器](6/ts.md) * 第7章 扩展开发 * 7.1 扩展的构成 From 29b02eafc1bace8f5c691f89dd0d911f8052171c Mon Sep 17 00:00:00 2001 From: qinpeng Date: Thu, 13 Apr 2017 19:19:39 +0800 Subject: [PATCH 139/379] update --- README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 79e2ee5..bcf11b5 100644 --- a/README.md +++ b/README.md @@ -4,8 +4,10 @@ ## 目录: * 第1章 PHP基本架构 - * 1.1 基本概念(1/base_introduction.md) - * [1.2 PHP框架执行流程](1/base_process.md) + * 1.1 PHP简介 + * 1.2 PHP7的改进 + * 1.3 PHP内核的组成 + * 1.4 PHP执行的几个阶段 * 第2章 变量 * [2.1 变量的内部实现](2/zval.md) * [2.2 数组](2/zend_ht.md) From 0f1f9a42b97866039beff551d4ed03f548b689a3 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Thu, 13 Apr 2017 19:22:24 +0800 Subject: [PATCH 140/379] update --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index bcf11b5..d3b8b46 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ * 1.1 PHP简介 * 1.2 PHP7的改进 * 1.3 PHP内核的组成 - * 1.4 PHP执行的几个阶段 + * [1.4 PHP执行的几个阶段](1/base_process.md) * 第2章 变量 * [2.1 变量的内部实现](2/zval.md) * [2.2 数组](2/zend_ht.md) From 63b72e6345102e969106bdb3cbdb89382c6e9592 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Thu, 13 Apr 2017 19:25:28 +0800 Subject: [PATCH 141/379] update --- 1/base_process.md | 103 ---------------------------------------------- 1 file changed, 103 deletions(-) diff --git a/1/base_process.md b/1/base_process.md index aa84487..ea829c2 100644 --- a/1/base_process.md +++ b/1/base_process.md @@ -13,107 +13,4 @@ PHP的生命周期: ### 1.2.5 模块关闭阶段 -## 扩展加载过程 - -PHP扩展的结构`zend_module_entry`: -```c -//zend_modules.h -struct _zend_module_entry { - unsigned short size; - unsigned int zend_api; - unsigned char zend_debug; - unsigned char zts; - const struct _zend_ini_entry *ini_entry; - const struct _zend_module_dep *deps; - const char *name; //扩展名称,不能重复 - const struct _zend_function_entry *functions; //扩展提供的内部函数列表 - int (*module_startup_func)(INIT_FUNC_ARGS); //扩展初始化回调函数,PHP_MINIT_FUNCTION或ZEND_MINIT_FUNCTION定义的函数 - int (*module_shutdown_func)(SHUTDOWN_FUNC_ARGS); //扩展关闭时回调函数 - int (*request_startup_func)(INIT_FUNC_ARGS); //请求开始前回调函数 - int (*request_shutdown_func)(SHUTDOWN_FUNC_ARGS); //请求结束时回调函数 - void (*info_func)(ZEND_MODULE_INFO_FUNC_ARGS); //php_info展示的扩展信息处理函数 - const char *version; //版本 - size_t globals_size; -#ifdef ZTS - ts_rsrc_id* globals_id_ptr; -#else - void* globals_ptr; -#endif - void (*globals_ctor)(void *global); - void (*globals_dtor)(void *global); - int (*post_deactivate_func)(void); - int module_started; - unsigned char type; - void *handle; - int module_number; - const char *build_id; -}; -``` -`zend_module_entry`是一个扩展唯一的标识,从这个结构我们可以猜测一个PHP扩展主要都由哪些部分构成: -* __扩展名称__:name,这个是必须的,每个扩展需要有个名字 -* __两个阶段的四个hook钩子函数__:module_startup_func、module_shutdown_func、request_startup_func、request_shutdown_func,这些函数分别通过:PHP_MINIT_FUNCTION、PHP_MSHUTDOWN_FUNCTION、PHP_RINIT_FUNCTION、PHP_RSHUTDOWN_FUNCTION几个宏定义,这几个函数不是必须的,可以设为null -* __函数数组__:functions,这个是指扩展中定义的PHP内部函数,是个数组,内部函数通过宏`PHP_FUNCTION`定义,这个也不是必须的可以设为null - -总的来看一个扩展主要就包括上面三个部分,其中`zend_module_entry`是最重要的一个结构,我们需要定义一个这样的全局变量: -```c -zend_module_entry {mudule_name}_module_entry = { - ... -} -``` -而且这个变量的名称格式必须是:__{mudule_name}_module_entry__。 - -扩展可以在编译PHP时一起编译,也可以后期编译然后动态加载,下面看下动态扩展的加载过程: - -首先调用`php_ini_register_extensions`: -```c -//main/php_ini.c -void php_ini_register_extensions(void) -{ - zend_llist_apply(&extension_lists.engine, php_load_zend_extension_cb); - zend_llist_apply(&extension_lists.functions, php_load_php_extension_cb); - - zend_llist_destroy(&extension_lists.engine); - zend_llist_destroy(&extension_lists.functions); -} -``` -`extension_lists`记录的是根据`php.ini`中定义的`extension=xxx.so`取到的全部扩展名称,然后遍历这个数组依次调用`php_load_php_extension_cb`加载扩展(php_load_zend_extension_cb是zend扩展加载时的方法): -```c -static void php_load_php_extension_cb(void *arg) -{ -#ifdef HAVE_LIBDL - php_load_extension(*((char **) arg), MODULE_PERSISTENT, 0); -#endif -} -``` -`php_load_extension`: -```c -//ext/standard/dl.c #90 -PHPAPI int php_load_extension(char *filename, int type, int start_now) -{ - ... - - zend_module_entry *module_entry; - zend_module_entry *(*get_module)(void); - ... - - handle = DL_LOAD(libpath); //调用dlopen打开指定的动态连接库文件:xx.so - ... - - get_module = (zend_module_entry *(*)(void)) DL_FETCH_SYMBOL(handle, "get_module"); //调用dlsym获取get_module的函数指针 - ... - - module_entry = get_module(); - ... -} -``` -上面的过程就是普通的动态链接库的用法了:通过`dlopen`打开库文件,通过`dlsym`获取指定函数、变量,最终得到的`module_entry`就是我们在扩展中定义的`zend_module_entry`结构,拿到这个结构接下来的过程就比较简单了,主要就是检查版本是否匹配可用、调用`zend_register_module_ex`将扩展加到`module_registry`(全部扩展的哈希表)、注册扩展提供的函数、调用扩展初始化回调函数。 - -还有一个地方值得注意的是调用dlsym获取get_module的函数指针的过程,这说明每个扩展中都需要定义一个__get_module()__函数,这个函数返回了我们定义的`zend_module_entry`结构指针,实际我们可以根据`ZEND_GET_MODULE(module_name)`这个宏完成这个函数的定义: -```c -//zend_API.h -#define ZEND_GET_MODULE(name) \ - BEGIN_EXTERN_C()\ - ZEND_DLEXPORT zend_module_entry *get_module(void) { return &name##_module_entry; //这个就是我们定义的扩展结构的全局变量 }\ - END_EXTERN_C() -``` From dd8865eb862ace08792acfdab20abaa1bc3e117c Mon Sep 17 00:00:00 2001 From: qinpeng Date: Thu, 13 Apr 2017 19:26:25 +0800 Subject: [PATCH 142/379] udpate --- 1/base_introduction.md | 3 +++ README.md | 1 + 2 files changed, 4 insertions(+) diff --git a/1/base_introduction.md b/1/base_introduction.md index 7c8c417..c2d564f 100644 --- a/1/base_introduction.md +++ b/1/base_introduction.md @@ -20,6 +20,9 @@ PHP 独特的语法混合了 C、Java、Perl 以及 PHP 自创新的语法,丰 * 跨平台:可以在unix、windows、max os等系统上面使用PHP ## 1.2 PHP7特性 +PHP7在内核方面做了很多优化,大大提高了PHP的性能,比如zval结构以及引用计数的改变节省了内存的使用。接下来我们简单看下PHP7都有哪些比较大的改进。 + + ## 1.3 PHP内核的组成 diff --git a/README.md b/README.md index d3b8b46..94e2244 100644 --- a/README.md +++ b/README.md @@ -49,6 +49,7 @@ * [6.2 线程安全资源管理器](6/ts.md) * 第7章 扩展开发 * 7.1 扩展的构成 + * [7.2 扩展加载过程](7/extension_start.md) ## 反馈 [交流&吐槽](https://github.com/pangudashu/php7-internal/issues/3) [错误反馈](https://github.com/pangudashu/php7-internal/issues/2) From 647758ee5a4f604d0aa43b07341eae8a62bad496 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Thu, 13 Apr 2017 19:26:57 +0800 Subject: [PATCH 143/379] udpate --- 7/extension_start.md | 104 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 7/extension_start.md diff --git a/7/extension_start.md b/7/extension_start.md new file mode 100644 index 0000000..97cc198 --- /dev/null +++ b/7/extension_start.md @@ -0,0 +1,104 @@ +## 7.2 扩展加载过程 + +PHP扩展的结构`zend_module_entry`: +```c +//zend_modules.h +struct _zend_module_entry { + unsigned short size; + unsigned int zend_api; + unsigned char zend_debug; + unsigned char zts; + const struct _zend_ini_entry *ini_entry; + const struct _zend_module_dep *deps; + const char *name; //扩展名称,不能重复 + const struct _zend_function_entry *functions; //扩展提供的内部函数列表 + int (*module_startup_func)(INIT_FUNC_ARGS); //扩展初始化回调函数,PHP_MINIT_FUNCTION或ZEND_MINIT_FUNCTION定义的函数 + int (*module_shutdown_func)(SHUTDOWN_FUNC_ARGS); //扩展关闭时回调函数 + int (*request_startup_func)(INIT_FUNC_ARGS); //请求开始前回调函数 + int (*request_shutdown_func)(SHUTDOWN_FUNC_ARGS); //请求结束时回调函数 + void (*info_func)(ZEND_MODULE_INFO_FUNC_ARGS); //php_info展示的扩展信息处理函数 + const char *version; //版本 + size_t globals_size; +#ifdef ZTS + ts_rsrc_id* globals_id_ptr; +#else + void* globals_ptr; +#endif + void (*globals_ctor)(void *global); + void (*globals_dtor)(void *global); + int (*post_deactivate_func)(void); + int module_started; + unsigned char type; + void *handle; + int module_number; + const char *build_id; +}; +``` +`zend_module_entry`是一个扩展唯一的标识,从这个结构我们可以猜测一个PHP扩展主要都由哪些部分构成: +* __扩展名称__:name,这个是必须的,每个扩展需要有个名字 +* __两个阶段的四个hook钩子函数__:module_startup_func、module_shutdown_func、request_startup_func、request_shutdown_func,这些函数分别通过:PHP_MINIT_FUNCTION、PHP_MSHUTDOWN_FUNCTION、PHP_RINIT_FUNCTION、PHP_RSHUTDOWN_FUNCTION几个宏定义,这几个函数不是必须的,可以设为null +* __函数数组__:functions,这个是指扩展中定义的PHP内部函数,是个数组,内部函数通过宏`PHP_FUNCTION`定义,这个也不是必须的可以设为null + +总的来看一个扩展主要就包括上面三个部分,其中`zend_module_entry`是最重要的一个结构,我们需要定义一个这样的全局变量: +```c +zend_module_entry {mudule_name}_module_entry = { + ... +} +``` +而且这个变量的名称格式必须是:__{mudule_name}_module_entry__。 + +扩展可以在编译PHP时一起编译,也可以后期编译然后动态加载,下面看下动态扩展的加载过程: + +首先调用`php_ini_register_extensions`: +```c +//main/php_ini.c +void php_ini_register_extensions(void) +{ + zend_llist_apply(&extension_lists.engine, php_load_zend_extension_cb); + zend_llist_apply(&extension_lists.functions, php_load_php_extension_cb); + + zend_llist_destroy(&extension_lists.engine); + zend_llist_destroy(&extension_lists.functions); +} +``` +`extension_lists`记录的是根据`php.ini`中定义的`extension=xxx.so`取到的全部扩展名称,然后遍历这个数组依次调用`php_load_php_extension_cb`加载扩展(php_load_zend_extension_cb是zend扩展加载时的方法): +```c +static void php_load_php_extension_cb(void *arg) +{ +#ifdef HAVE_LIBDL + php_load_extension(*((char **) arg), MODULE_PERSISTENT, 0); +#endif +} +``` +`php_load_extension`: +```c +//ext/standard/dl.c #90 +PHPAPI int php_load_extension(char *filename, int type, int start_now) +{ + ... + + zend_module_entry *module_entry; + zend_module_entry *(*get_module)(void); + ... + + handle = DL_LOAD(libpath); //调用dlopen打开指定的动态连接库文件:xx.so + ... + + get_module = (zend_module_entry *(*)(void)) DL_FETCH_SYMBOL(handle, "get_module"); //调用dlsym获取get_module的函数指针 + ... + + module_entry = get_module(); + ... +} +``` +上面的过程就是普通的动态链接库的用法了:通过`dlopen`打开库文件,通过`dlsym`获取指定函数、变量,最终得到的`module_entry`就是我们在扩展中定义的`zend_module_entry`结构,拿到这个结构接下来的过程就比较简单了,主要就是检查版本是否匹配可用、调用`zend_register_module_ex`将扩展加到`module_registry`(全部扩展的哈希表)、注册扩展提供的函数、调用扩展初始化回调函数。 + +还有一个地方值得注意的是调用dlsym获取get_module的函数指针的过程,这说明每个扩展中都需要定义一个__get_module()__函数,这个函数返回了我们定义的`zend_module_entry`结构指针,实际我们可以根据`ZEND_GET_MODULE(module_name)`这个宏完成这个函数的定义: +```c +//zend_API.h +#define ZEND_GET_MODULE(name) \ + BEGIN_EXTERN_C()\ + ZEND_DLEXPORT zend_module_entry *get_module(void) { return &name##_module_entry; //这个就是我们定义的扩展结构的全局变量 }\ + END_EXTERN_C() +``` + From cbd5c4ab02af341297934ccf9c6eebab734e24c8 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Thu, 13 Apr 2017 19:54:53 +0800 Subject: [PATCH 144/379] add autoload --- 3/zend_autoload.md | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 3/zend_autoload.md diff --git a/3/zend_autoload.md b/3/zend_autoload.md new file mode 100644 index 0000000..096ca1e --- /dev/null +++ b/3/zend_autoload.md @@ -0,0 +1,7 @@ +### 3.4.7 类的自动加载 +在实际使用中,通常会把一个类定义在一个文件中,然后使用时include加载进来,这样就带来一个问题:在每个文件的头部都需要包含一个长长的include列表,而且当文件名称修改时也需要把每个引用的地方都改一遍,另外前面我们也介绍过,原则上父类需要在子类定义之前定义,当存在大量类时很难得到保证,因此PHP提供了一种类的自动加载机制,当使用未被定义的类时自动调用类加载器将类加载进来,从而实现类加载的统一化。 + +PHP中提供了两种方式实现自动加载:__autoload()、spl_autoload_register()。 + + + From 343fd5623c0a24e9e27301740ff5e87fb8391a92 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Fri, 14 Apr 2017 15:18:19 +0800 Subject: [PATCH 145/379] update --- 3/zend_autoload.md | 52 ++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 50 insertions(+), 2 deletions(-) diff --git a/3/zend_autoload.md b/3/zend_autoload.md index 096ca1e..9ae543a 100644 --- a/3/zend_autoload.md +++ b/3/zend_autoload.md @@ -1,7 +1,55 @@ ### 3.4.7 类的自动加载 -在实际使用中,通常会把一个类定义在一个文件中,然后使用时include加载进来,这样就带来一个问题:在每个文件的头部都需要包含一个长长的include列表,而且当文件名称修改时也需要把每个引用的地方都改一遍,另外前面我们也介绍过,原则上父类需要在子类定义之前定义,当存在大量类时很难得到保证,因此PHP提供了一种类的自动加载机制,当使用未被定义的类时自动调用类加载器将类加载进来,从而实现类加载的统一化。 +在实际使用中,通常会把一个类定义在一个文件中,然后使用时include加载进来,这样就带来一个问题:在每个文件的头部都需要包含一个长长的include列表,而且当文件名称修改时也需要把每个引用的地方都改一遍,另外前面我们也介绍过,原则上父类需要在子类定义之前定义,当存在大量类时很难得到保证,因此PHP提供了一种类的自动加载机制,当使用未被定义的类时自动调用类加载器将类加载进来,方便类的同一管理。 -PHP中提供了两种方式实现自动加载:__autoload()、spl_autoload_register()。 +PHP中提供了两种方式实现自动加载:`__autoload()`、`spl_autoload_register()`,两种方式差别不大,我们先介绍下他们的用法再分析PHP中的实现原理。 +__(1)__autoload():__ + +用户自定义一个`__autoload()`函数即可,参数是类名,当实例化一个类是如果没有找到这个类则会调用此函数,所以我们就可以在这个函数中进行类的加载,比如: +```php +//文件1:my_class.php +", $class_name, "\n"; +} + +function autoload_two($class_name){ + echo "autoload_two->", $class_name, "\n"; +} + +spl_autoload_register("autoload_one"); +spl_autoload_register("autoload_two"); + +$obj = new my_class(); +var_dump($obj); +``` +这个例子执行时就会将autoload_one()、autoload_two()都调一遍,假如第一个函数就成功注册了my_class类则不会再调后面的加载器。 + +___ From 3c67ff6dc514a101c24667ec3e72d8b31f708932 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Fri, 14 Apr 2017 15:47:33 +0800 Subject: [PATCH 146/379] update --- 3/zend_autoload.md | 48 +++++++++++++++++++++++++++++++++++++++------- README.md | 2 +- 2 files changed, 42 insertions(+), 8 deletions(-) diff --git a/3/zend_autoload.md b/3/zend_autoload.md index 9ae543a..5bcb266 100644 --- a/3/zend_autoload.md +++ b/3/zend_autoload.md @@ -1,11 +1,13 @@ ### 3.4.7 类的自动加载 在实际使用中,通常会把一个类定义在一个文件中,然后使用时include加载进来,这样就带来一个问题:在每个文件的头部都需要包含一个长长的include列表,而且当文件名称修改时也需要把每个引用的地方都改一遍,另外前面我们也介绍过,原则上父类需要在子类定义之前定义,当存在大量类时很难得到保证,因此PHP提供了一种类的自动加载机制,当使用未被定义的类时自动调用类加载器将类加载进来,方便类的同一管理。 -PHP中提供了两种方式实现自动加载:`__autoload()`、`spl_autoload_register()`,两种方式差别不大,我们先介绍下他们的用法再分析PHP中的实现原理。 +在内核实现上类的自动加载实际就是定义了一个钩子函数,实例化类时如果在EG(class_table)中没有找到对应的类则会调用这个钩子函数,调用完以后再重新查找一次。这个钩子函数保存在EG(autoload_func)中。 -__(1)__autoload():__ +PHP中提供了两种方式实现自动加载:`__autoload()`、`spl_autoload_register()`。 -用户自定义一个`__autoload()`函数即可,参数是类名,当实例化一个类是如果没有找到这个类则会调用此函数,所以我们就可以在这个函数中进行类的加载,比如: +***(1)__autoload():*** + +这种方式比较简单,用户自定义一个`__autoload()`函数即可,参数是类名,当实例化一个类是如果没有找到这个类则会查找用户是否定义了`__autoload()`函数,如果定义了则调用此函数,比如: ```php //文件1:my_class.php Date: Fri, 14 Apr 2017 15:53:01 +0800 Subject: [PATCH 147/379] update --- 3/zend_runtime_cache.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3/zend_runtime_cache.md b/3/zend_runtime_cache.md index 0080b1f..4a5dca0 100644 --- a/3/zend_runtime_cache.md +++ b/3/zend_runtime_cache.md @@ -45,7 +45,7 @@ $obj->test(); 具体缓存的读写通过以下几个宏完成: ```c //设置缓存 -CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1/2)), 缓存的数据指针); +CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1/2)), ptr); //ptr: 缓存的数据指针 //读取缓存 CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1/2))); From e7475daf97998a782fc6c12c352e332dbdde68bc Mon Sep 17 00:00:00 2001 From: qinpeng Date: Fri, 14 Apr 2017 16:10:54 +0800 Subject: [PATCH 148/379] update --- 3/zend_runtime_cache.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/3/zend_runtime_cache.md b/3/zend_runtime_cache.md index 4a5dca0..897797c 100644 --- a/3/zend_runtime_cache.md +++ b/3/zend_runtime_cache.md @@ -52,4 +52,8 @@ CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1/2))); //EX_CONSTANT(opline->op1/2)是取当前IS_CONST操作数对应数据的zval ``` - +展开后: +```c +((void**)((char*)execute_data->run_time_cache + (num)))[0] +``` +`execute_data->run_time_cache`缓存的`zend_op_array->run_time_cache`。 From 003c17c4be0edd1e828b14f04ad450408d748d4c Mon Sep 17 00:00:00 2001 From: qinpeng Date: Mon, 17 Apr 2017 09:55:13 +0800 Subject: [PATCH 149/379] update --- 2/zval.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2/zval.md b/2/zval.md index c507595..07c71ff 100644 --- a/2/zval.md +++ b/2/zval.md @@ -31,7 +31,7 @@ struct _zval_struct { zend_value value; //变量实际的value union { struct { - ZEND_ENDIAN_LOHI_4( //忽略这个宏,直接分析下面的结构 + ZEND_ENDIAN_LOHI_4( //这个是为了兼容大小字节序,小字节序就是下面的顺序,大字节序则下面4个顺序翻转 zend_uchar type, //变量类型 zend_uchar type_flags, //类型掩码,不同的类型会有不同的几种属性,内存管理会用到 zend_uchar const_flags, From f808c561a6446c59e20dc7af0640d93bb0659c1a Mon Sep 17 00:00:00 2001 From: qinpeng Date: Thu, 20 Apr 2017 20:48:31 +0800 Subject: [PATCH 150/379] update --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 17a98b8..b046851 100644 --- a/README.md +++ b/README.md @@ -42,7 +42,7 @@ * 4.5 跳转语句 * 第5章 内存管理 * [5.1 Zend内存池](5/zend_alloc.md) - * 5.2 引用计数() + * 5.2 引用计数 * 5.3 垃圾回收(gc.md) * 第6章 线程安全 * [6.1 什么是线程安全](6/ts.md) From 048d329f4aafed6915ab32bc85f5e26b126ea3c8 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Fri, 21 Apr 2017 14:37:19 +0800 Subject: [PATCH 151/379] add gc.md --- 5/gc.md | 38 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 36 insertions(+), 2 deletions(-) diff --git a/5/gc.md b/5/gc.md index d5362fe..6fcbd7d 100644 --- a/5/gc.md +++ b/5/gc.md @@ -1,5 +1,39 @@ -# 垃圾回收 +## 5.3 垃圾回收 +前面已经介绍过PHP变量的内存管理,即引用计数机制,当变量赋值、传递时并不会直接硬拷贝,而是增加value的引用数,unset、return等释放变量时再减掉引用数,减掉后如果发现refcount变为0则直接释放value,这是变量的基本gc过程,PHP正是通过这个机制实现的自动垃圾回收,但是有一种情况是这个机制无法解决的,从而因变量无法回收导致内存始终得不到释放,这种情况就是循环引用,简单的描述就是变量的内部成员引用了变量自身,比如数组中的某个元素指向了数组,这样数组的引用计数中就有一个来自自身成员,试图释放数组时因为其refcount仍然大于0而得不到释放,而实际上已经没有任何外部引用了,这种变量不可能再被使用,所以PHP引入了另外一个机制用来处理变量循环引用的问题。 -PHP中针对array、object两种类型而引入的垃圾回收机制。 +下面看一个数组循环引用的例子: +```php +$a = [1]; +$a[] = &$a; +unset($a); +``` +`unset($a)`之前引用关系: + +![gc_1](../img/gc_1.png) + +注意这里$a的类型在`&`操作后已经转为引用,`unset($a)`之后: + +![gc_2](../img/gc_2.png) + +可以看到,`unset($a)`之后由于数组中有子元素指向`$a`,所以`refcount = 1`,此时是无法通过正常的gc机制回收的,但是$a已经已经没有任何外部引用了,所以这种变量就是垃圾,垃圾回收器要处理的就是这种情况。 + +目前垃圾只会出现在array、object两种类型中,数组的情况上面已经介绍了,object的情况则是成员属性引用对象本身导致的,其它类型不会出现这种变量中的成员引用变量自身的情况,所以垃圾回收只会处理这两种类型的变量。当销毁一个变量时,如果发现减掉refcount后仍然大于0,且类型是IS_ARRAY、IS_OBJECT则将此value放入gc可能垃圾双向链表中,等这个链表达到一定数量后启动检查程序将所有变量检查一遍,如果确定是垃圾则销毁释放。 + +标识变量是否需要回收也是通过`u1.type_flag`区分的: +```c +#define IS_TYPE_COLLECTABLE +``` +```c +| type | collectable | ++----------------+-------------+ +|simple types | | +|string | | +|interned string | | +|array | Y | +|immutable array | | +|object | Y | +|resource | | +|reference | | +``` From 89743059cc600e6e71ccbe33b8a98914ed0fe67e Mon Sep 17 00:00:00 2001 From: qinpeng Date: Fri, 21 Apr 2017 16:14:15 +0800 Subject: [PATCH 152/379] update --- 5/gc.md | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 54 insertions(+), 3 deletions(-) diff --git a/5/gc.md b/5/gc.md index 6fcbd7d..0c3bfac 100644 --- a/5/gc.md +++ b/5/gc.md @@ -1,4 +1,6 @@ ## 5.3 垃圾回收 + +### 5.3.1 介绍 前面已经介绍过PHP变量的内存管理,即引用计数机制,当变量赋值、传递时并不会直接硬拷贝,而是增加value的引用数,unset、return等释放变量时再减掉引用数,减掉后如果发现refcount变为0则直接释放value,这是变量的基本gc过程,PHP正是通过这个机制实现的自动垃圾回收,但是有一种情况是这个机制无法解决的,从而因变量无法回收导致内存始终得不到释放,这种情况就是循环引用,简单的描述就是变量的内部成员引用了变量自身,比如数组中的某个元素指向了数组,这样数组的引用计数中就有一个来自自身成员,试图释放数组时因为其refcount仍然大于0而得不到释放,而实际上已经没有任何外部引用了,这种变量不可能再被使用,所以PHP引入了另外一个机制用来处理变量循环引用的问题。 下面看一个数组循环引用的例子: @@ -16,11 +18,16 @@ unset($a); ![gc_2](../img/gc_2.png) -可以看到,`unset($a)`之后由于数组中有子元素指向`$a`,所以`refcount = 1`,此时是无法通过正常的gc机制回收的,但是$a已经已经没有任何外部引用了,所以这种变量就是垃圾,垃圾回收器要处理的就是这种情况。 -目前垃圾只会出现在array、object两种类型中,数组的情况上面已经介绍了,object的情况则是成员属性引用对象本身导致的,其它类型不会出现这种变量中的成员引用变量自身的情况,所以垃圾回收只会处理这两种类型的变量。当销毁一个变量时,如果发现减掉refcount后仍然大于0,且类型是IS_ARRAY、IS_OBJECT则将此value放入gc可能垃圾双向链表中,等这个链表达到一定数量后启动检查程序将所有变量检查一遍,如果确定是垃圾则销毁释放。 +可以看到,`unset($a)`之后由于数组中有子元素指向`$a`,所以`refcount = 1`,此时是无法通过正常的gc机制回收的,但是$a已经已经没有任何外部引用了,所以这种变量就是垃圾,垃圾回收器要处理的就是这种情况,这里明确两个准则: + +>> 1) 如果一个变量value的refcount减少到0, 那么此value可以被释放掉,不属于垃圾 + +>> 2) 如果一个变量value的refcount减少之后大于0,那么此zval还不能被释放,此zval可能成为一个垃圾 + +针对第一个情况GC不会处理,只有第二种情况GC才会将变量收集起来。另外变量是否加入垃圾检查buffer并不是根据zval的类型判断的,而是与前面介绍的是否用到引用计数一样通过`zval.u1.type_flag`记录的,只有包含`IS_TYPE_COLLECTABLE`的变量才会被GC收集。 -标识变量是否需要回收也是通过`u1.type_flag`区分的: +目前垃圾只会出现在array、object两种类型中,数组的情况上面已经介绍了,object的情况则是成员属性引用对象本身导致的,其它类型不会出现这种变量中的成员引用变量自身的情况,所以垃圾回收只会处理这两种类型的变量。 ```c #define IS_TYPE_COLLECTABLE ``` @@ -36,4 +43,48 @@ unset($a); |resource | | |reference | | ``` +### 5.3.2 回收过程 +如果当变量的refcount减少后大于0,PHP并不会立即进行对这个变量进行垃圾鉴定,而是放入一个缓冲buffer中,等这个buffer满了以后(10000个值)再统一进行处理,加入buffer的是变量zend_value的`zend_refcounted_h`: +```c +typedef struct _zend_refcounted_h { + uint32_t refcount; //记录zend_value的引用数 + union { + struct { + zend_uchar type, //zend_value的类型,与zval.u1.type一致 + zend_uchar flags, + uint16_t gc_info //GC信息,垃圾回收的过程会用到 + } v; + uint32_t type_info; + } u; +} zend_refcounted_h; +``` + +一个变量只能加入一次buffer,为了防止重复加入,变量加入后会把`zend_refcounted_h.gc_info`置为`GC_PURPLE`,即标为紫色,下次refcount减少时如果发现已经加入过了则不再重复插入。垃圾缓存区是一个双向链表,等到缓存区满了以后则启动垃圾检查过程:遍历缓存区,再对当前变量的所有成员进行遍历,然后把成员的refcount减1(如果成员还包含子成员则也进行递归遍历,其实就是深度优先的遍历),最后再检查当前变量的引用,如果减为了0则为垃圾。这个算法的原理很简单,垃圾是由于成员引用自身导致的,那么就对所有的成员减一遍引用,结果如果发现变量本身refcount变为了0则就表明其引用全部来自自身成员。具体的过程如下: + +(1) 从buffer链表的root开始遍历,把当前value标为灰色(zend_refcounted_h.gc_info置为GC_GREY),然后对当前value的成员进行深度优先遍历,把成员value的refcount减1,并且也标为灰色; + +(2) 再次遍历buffer链表,检查当前value引用是否为0,为0则表示确实是垃圾,把它标为白色(GC_WHITE),如果不为0则排除了引用全部来自自身成员的可能,表示还有外部的引用,并不是垃圾,同时因为步骤(1)对成员进行了refcount减1操作,则需要还原回去,再对所有成员进行深度遍历,把成员refcount加1,同时标为黑色; + +(3) + +垃圾收集器的全局数据结构: +```c +typedef struct _zend_gc_globals { + zend_bool gc_enabled; //是否启用gc + zend_bool gc_active; //是否在垃圾检查过程中 + zend_bool gc_full; //缓存区是否已满 + + gc_root_buffer *buf; //启动时分配的用于保存可能垃圾的缓存区 + gc_root_buffer roots; //指向buf中最新加入的一个可能垃圾 + gc_root_buffer *unused;//指向buf中没有使用的buffer + gc_root_buffer *first_unused; //指向buf中第一个没有使用的buffer + gc_root_buffer *last_unused; //指向buf中最后一个可用buffer + + gc_root_buffer to_free; //待释放的垃圾 + gc_root_buffer *next_to_free; + + uint32_t gc_runs; //统计gc运行次数 + uint32_t collected; //统计已回收的垃圾数 +} zend_gc_globals; +``` From e5f2fde5845cf70a835ef563bef811374f05f3a8 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Fri, 21 Apr 2017 17:54:21 +0800 Subject: [PATCH 153/379] update --- 5/zend_alloc.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/5/zend_alloc.md b/5/zend_alloc.md index 5627921..5fe35aa 100644 --- a/5/zend_alloc.md +++ b/5/zend_alloc.md @@ -181,7 +181,7 @@ typedef zend_ulong zend_mm_bitset; /* 4-byte or 8-byte integer */ typedef zend_mm_bitset zend_mm_page_map[ZEND_MM_PAGE_MAP_LEN]; /* 64B */ ``` -`heap->free_map`实际就是:__zend_ulong free_map[16 or 8]__,以__free_map[8]__为例,数组中的8个数字分别表示:0-63、64-127、128-191、192-255、256-319、320-383、384-447、448-511 page的分配与否,比如当前chunk的page 0、page 2已经分配,则:`free_map[0] = 5`: +`heap->free_map`实际就是:__zend_ulong free_map[16 or 8]__,以 __free_map[8]__ 为例,数组中的8个数字分别表示:0-63、64-127、128-191、192-255、256-319、320-383、384-447、448-511 page的分配与否,比如当前chunk的page 0、page 2已经分配,则:`free_map[0] = 5`: ``` //5: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000101 From d091253b79b0520cbf8dffccde17b5f2df0c0b30 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Mon, 24 Apr 2017 16:46:47 +0800 Subject: [PATCH 154/379] update --- 5/gc.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/5/gc.md b/5/gc.md index 0c3bfac..018e432 100644 --- a/5/gc.md +++ b/5/gc.md @@ -61,11 +61,11 @@ typedef struct _zend_refcounted_h { 一个变量只能加入一次buffer,为了防止重复加入,变量加入后会把`zend_refcounted_h.gc_info`置为`GC_PURPLE`,即标为紫色,下次refcount减少时如果发现已经加入过了则不再重复插入。垃圾缓存区是一个双向链表,等到缓存区满了以后则启动垃圾检查过程:遍历缓存区,再对当前变量的所有成员进行遍历,然后把成员的refcount减1(如果成员还包含子成员则也进行递归遍历,其实就是深度优先的遍历),最后再检查当前变量的引用,如果减为了0则为垃圾。这个算法的原理很简单,垃圾是由于成员引用自身导致的,那么就对所有的成员减一遍引用,结果如果发现变量本身refcount变为了0则就表明其引用全部来自自身成员。具体的过程如下: -(1) 从buffer链表的root开始遍历,把当前value标为灰色(zend_refcounted_h.gc_info置为GC_GREY),然后对当前value的成员进行深度优先遍历,把成员value的refcount减1,并且也标为灰色; +(1) 从buffer链表的roots开始遍历,把当前value标为灰色(zend_refcounted_h.gc_info置为GC_GREY),然后对当前value的成员进行深度优先遍历,把成员value的refcount减1,并且也标为灰色; -(2) 再次遍历buffer链表,检查当前value引用是否为0,为0则表示确实是垃圾,把它标为白色(GC_WHITE),如果不为0则排除了引用全部来自自身成员的可能,表示还有外部的引用,并不是垃圾,同时因为步骤(1)对成员进行了refcount减1操作,则需要还原回去,再对所有成员进行深度遍历,把成员refcount加1,同时标为黑色; +(2) 重复遍历buffer链表,检查当前value引用是否为0,为0则表示确实是垃圾,把它标为白色(GC_WHITE),如果不为0则排除了引用全部来自自身成员的可能,表示还有外部的引用,并不是垃圾,这时候因为步骤(1)对成员进行了refcount减1操作,需要再还原回去,对所有成员进行深度遍历,把成员refcount加1,同时标为黑色; -(3) +(3) 再次遍历buffer链表,将非GC_WHITE的节点从roots链表中删除,最终roots链表中全部为真正的垃圾,最后将这些垃圾清除。 垃圾收集器的全局数据结构: ```c From e4a4a75aae24057bc0e49189e81efa6f3cf03367 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Mon, 24 Apr 2017 17:12:16 +0800 Subject: [PATCH 155/379] update --- 5/gc.md | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/5/gc.md b/5/gc.md index 018e432..4ddb530 100644 --- a/5/gc.md +++ b/5/gc.md @@ -1,6 +1,6 @@ ## 5.3 垃圾回收 -### 5.3.1 介绍 +### 5.3.1 垃圾的产生 前面已经介绍过PHP变量的内存管理,即引用计数机制,当变量赋值、传递时并不会直接硬拷贝,而是增加value的引用数,unset、return等释放变量时再减掉引用数,减掉后如果发现refcount变为0则直接释放value,这是变量的基本gc过程,PHP正是通过这个机制实现的自动垃圾回收,但是有一种情况是这个机制无法解决的,从而因变量无法回收导致内存始终得不到释放,这种情况就是循环引用,简单的描述就是变量的内部成员引用了变量自身,比如数组中的某个元素指向了数组,这样数组的引用计数中就有一个来自自身成员,试图释放数组时因为其refcount仍然大于0而得不到释放,而实际上已经没有任何外部引用了,这种变量不可能再被使用,所以PHP引入了另外一个机制用来处理变量循环引用的问题。 下面看一个数组循环引用的例子: @@ -67,6 +67,8 @@ typedef struct _zend_refcounted_h { (3) 再次遍历buffer链表,将非GC_WHITE的节点从roots链表中删除,最终roots链表中全部为真正的垃圾,最后将这些垃圾清除。 +接下来我们简单看下垃圾回收的内部实现。 + 垃圾收集器的全局数据结构: ```c typedef struct _zend_gc_globals { @@ -78,7 +80,7 @@ typedef struct _zend_gc_globals { gc_root_buffer roots; //指向buf中最新加入的一个可能垃圾 gc_root_buffer *unused;//指向buf中没有使用的buffer gc_root_buffer *first_unused; //指向buf中第一个没有使用的buffer - gc_root_buffer *last_unused; //指向buf中最后一个可用buffer + gc_root_buffer *last_unused; //指向buf尾部 gc_root_buffer to_free; //待释放的垃圾 gc_root_buffer *next_to_free; @@ -86,5 +88,20 @@ typedef struct _zend_gc_globals { uint32_t gc_runs; //统计gc运行次数 uint32_t collected; //统计已回收的垃圾数 } zend_gc_globals; + +typedef struct _gc_root_buffer { + zend_refcounted *ref; //每个zend_value的gc信息 + struct _gc_root_buffer *next; + struct _gc_root_buffer *prev; + uint32_t refcount; +} gc_root_buffer; ``` +`zend_gc_globals`是垃圾回收过程中主要用到的一个结构,用来保存垃圾回收器的所有信息,比如垃圾缓存区;`gc_root_buffer`用来保存每个可能是垃圾的变量,它实际就是整个垃圾收集buffer链表的元素,当GC收集一个变量时会创建一个`gc_root_buffer`,插入链表。 + +`zend_gc_globals`这个结构中有几个关键成员: +* __(1)buf:__ 前面已经说过,当refcount减少后如果大于0那么就会将这个变量的value加入GC的垃圾缓存区,buf就是这个缓存区,它实际是一块连续的内存,在GC初始化时一次性分配了10001个gc_root_buffer,插入变量时直接从buf中取出可用节点; +* __(2)roots:__ 垃圾缓存链表的头部,启动GC检查的过程就是从roots开始遍历的; +* __(3)first_unused:__ 指向buf中第一个可用的节点,初始化时这个值为1而不是0,因为第一个gc_root_buffer保留没有使用,有元素插入roots时如果first_unused还没有到达buf的尾部则返回(buf+first_unused)给最新的元素,然后first_unused++,直到last_unused +* __(4)last_unused:__ 与first_unused类似,指向buf末尾 +* __(5)unused:__ From b402875942b4826d294eff3e66a23daca241925d Mon Sep 17 00:00:00 2001 From: qinpeng Date: Mon, 24 Apr 2017 17:45:15 +0800 Subject: [PATCH 156/379] add img --- 5/gc.md | 9 ++++++--- img/zend_gc_1.png | Bin 0 -> 31687 bytes 2 files changed, 6 insertions(+), 3 deletions(-) create mode 100644 img/zend_gc_1.png diff --git a/5/gc.md b/5/gc.md index 4ddb530..ec23b01 100644 --- a/5/gc.md +++ b/5/gc.md @@ -67,9 +67,9 @@ typedef struct _zend_refcounted_h { (3) 再次遍历buffer链表,将非GC_WHITE的节点从roots链表中删除,最终roots链表中全部为真正的垃圾,最后将这些垃圾清除。 -接下来我们简单看下垃圾回收的内部实现。 -垃圾收集器的全局数据结构: +### 5.3.3 垃圾收集的内部实现 +接下来我们简单看下垃圾回收的内部实现,垃圾收集器的全局数据结构: ```c typedef struct _zend_gc_globals { zend_bool gc_enabled; //是否启用gc @@ -102,6 +102,9 @@ typedef struct _gc_root_buffer { * __(1)buf:__ 前面已经说过,当refcount减少后如果大于0那么就会将这个变量的value加入GC的垃圾缓存区,buf就是这个缓存区,它实际是一块连续的内存,在GC初始化时一次性分配了10001个gc_root_buffer,插入变量时直接从buf中取出可用节点; * __(2)roots:__ 垃圾缓存链表的头部,启动GC检查的过程就是从roots开始遍历的; -* __(3)first_unused:__ 指向buf中第一个可用的节点,初始化时这个值为1而不是0,因为第一个gc_root_buffer保留没有使用,有元素插入roots时如果first_unused还没有到达buf的尾部则返回(buf+first_unused)给最新的元素,然后first_unused++,直到last_unused +* __(3)first_unused:__ 指向buf中第一个可用的节点,初始化时这个值为1而不是0,因为第一个gc_root_buffer保留没有使用,有元素插入roots时如果first_unused还没有到达buf的尾部则返回first_unused给最新的元素,然后first_unused++,直到last_unused,比如现在已经加入了2个可能的垃圾变量,则对应的结构: + +![](../img/zend_gc_1.png) + * __(4)last_unused:__ 与first_unused类似,指向buf末尾 * __(5)unused:__ diff --git a/img/zend_gc_1.png b/img/zend_gc_1.png new file mode 100644 index 0000000000000000000000000000000000000000..514bdce09688e44c88309b28fc936c3a5bb92c67 GIT binary patch literal 31687 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 z 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 literal 0 HcmV?d00001 From 4ab59535d4868fd08e49d1231ee0d646fa6c1aea Mon Sep 17 00:00:00 2001 From: qinpeng Date: Mon, 24 Apr 2017 18:09:28 +0800 Subject: [PATCH 157/379] update --- 5/gc.md | 14 +++++++++++++- img/zend_gc_1.png | Bin 31687 -> 29275 bytes img/zend_gc_2.png | Bin 0 -> 32058 bytes 3 files changed, 13 insertions(+), 1 deletion(-) create mode 100644 img/zend_gc_2.png diff --git a/5/gc.md b/5/gc.md index ec23b01..1e27a43 100644 --- a/5/gc.md +++ b/5/gc.md @@ -107,4 +107,16 @@ typedef struct _gc_root_buffer { ![](../img/zend_gc_1.png) * __(4)last_unused:__ 与first_unused类似,指向buf末尾 -* __(5)unused:__ +* __(5)unused:__ GC收集变量时会依次从buf中获取可用的gc_root_buffer,这种情况直接取first_unused即可,但是有些变量加入垃圾缓存区之后其refcount又减为0了,这种情况就需要从roots中删掉,因为它不可能是垃圾,这样就导致roots链表并不是像buf分配的那样是连续的,中间会出现一些开始加入后面又删除的节点,这些节点就通过unused串成一个单链表,unused指向链表尾部,下次有新的变量插入roots时优先使用unused的这些节点,其次才是first_unused的,举个例子: +```php +$a = array(); //$a -> zend_array(refcount=1) +$b = $a; //$a -> zend_array(refcount=2) + //$b -> + +unset($b); //此时zend_array(refcount=1),因为refoucnt>0所以加入gc的垃圾缓存区:roots +unset($a); //此时zend_array(refcount=0)且gc_info为GC_PURPLE,则从roots链表中删掉 +``` +假如`unset($b)`时插入的是buf中第1个位置,那么`unset($a)`后对应的结构: + +![](../img/zend_gc_2.png) + diff --git a/img/zend_gc_1.png b/img/zend_gc_1.png index 514bdce09688e44c88309b28fc936c3a5bb92c67..769a16fc26819a9bd8e1969aa4de705f4aeedd60 100644 GIT binary patch literal 29275 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 b{`j8#p|OcJpy@ocrG)CKb4o81F5mh;=}c<{ literal 31687 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 z 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 diff --git a/img/zend_gc_2.png b/img/zend_gc_2.png new file mode 100644 index 0000000000000000000000000000000000000000..02c7c12cd206d70d2c499b980f8824a39924491e GIT binary patch literal 32058 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 Date: Mon, 24 Apr 2017 18:14:48 +0800 Subject: [PATCH 158/379] update --- 5/gc.md | 1 + img/zend_gc_2.png | Bin 32058 -> 31588 bytes 2 files changed, 1 insertion(+) diff --git a/5/gc.md b/5/gc.md index 1e27a43..f1f859e 100644 --- a/5/gc.md +++ b/5/gc.md @@ -120,3 +120,4 @@ unset($a); //此时zend_array(refcount=0)且gc_info为GC_PURPLE,则从roots ![](../img/zend_gc_2.png) +如果后面再有变量加入GC垃圾缓存区将优先使用第1个。 diff --git a/img/zend_gc_2.png b/img/zend_gc_2.png index 02c7c12cd206d70d2c499b980f8824a39924491e..b3d626870bb8127639ffdbf362363ef156448149 100644 GIT binary patch literal 31588 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�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 Date: Mon, 24 Apr 2017 18:20:14 +0800 Subject: [PATCH 159/379] update dir --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b046851..2c7b453 100644 --- a/README.md +++ b/README.md @@ -43,7 +43,7 @@ * 第5章 内存管理 * [5.1 Zend内存池](5/zend_alloc.md) * 5.2 引用计数 - * 5.3 垃圾回收(gc.md) + * [5.3 垃圾回收](5/gc.md) * 第6章 线程安全 * [6.1 什么是线程安全](6/ts.md) * [6.2 线程安全资源管理器](6/ts.md) From 54c38cdc34f21297e2ff8d21e29c495969da0ae8 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Mon, 24 Apr 2017 19:48:43 +0800 Subject: [PATCH 160/379] update --- 5/gc.md | 64 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) diff --git a/5/gc.md b/5/gc.md index f1f859e..2f5dd3f 100644 --- a/5/gc.md +++ b/5/gc.md @@ -109,6 +109,7 @@ typedef struct _gc_root_buffer { * __(4)last_unused:__ 与first_unused类似,指向buf末尾 * __(5)unused:__ GC收集变量时会依次从buf中获取可用的gc_root_buffer,这种情况直接取first_unused即可,但是有些变量加入垃圾缓存区之后其refcount又减为0了,这种情况就需要从roots中删掉,因为它不可能是垃圾,这样就导致roots链表并不是像buf分配的那样是连续的,中间会出现一些开始加入后面又删除的节点,这些节点就通过unused串成一个单链表,unused指向链表尾部,下次有新的变量插入roots时优先使用unused的这些节点,其次才是first_unused的,举个例子: ```php +//示例1: $a = array(); //$a -> zend_array(refcount=1) $b = $a; //$a -> zend_array(refcount=2) //$b -> @@ -121,3 +122,66 @@ unset($a); //此时zend_array(refcount=0)且gc_info为GC_PURPLE,则从roots ![](../img/zend_gc_2.png) 如果后面再有变量加入GC垃圾缓存区将优先使用第1个。 + +此GC机制可以通过php.ini中`zend.enable_gc`设置是否开启,如果开启则在php.ini解析后调用`gc_init()`进行GC初始化: +```c +ZEND_API void gc_init(void) +{ + if (GC_G(buf) == NULL && GC_G(gc_enabled)) { + //分配buf缓存区内存,大小为GC_ROOT_BUFFER_MAX_ENTRIES(10001),其中第1个保留不被使用 + GC_G(buf) = (gc_root_buffer*) malloc(sizeof(gc_root_buffer) * GC_ROOT_BUFFER_MAX_ENTRIES); + GC_G(last_unused) = &GC_G(buf)[GC_ROOT_BUFFER_MAX_ENTRIES]; + //进行GC_G的初始化,其中:GC_G(first_unused) = GC_G(buf) + 1;从第2个开始的,第1个保留 + gc_reset(); + } +} +``` +在PHP的执行过程中,如果发现array、object减掉refcount后大于0则会调用`gc_possible_root()`将zend_value的gc头部加入GC垃圾缓存区: +```c +ZEND_API void ZEND_FASTCALL gc_possible_root(zend_refcounted *ref) +{ + gc_root_buffer *newRoot; + + //插入的节点必须是GC_BLACK,防止重复插入 + ZEND_ASSERT(EXPECTED(GC_REF_GET_COLOR(ref) == GC_BLACK)); + + newRoot = GC_G(unused); //先看下unused中有没有可用的 + if (newRoot) { + //有的话先用unused的,然后将GC_G(unused)指向单链表的下一个 + GC_G(unused) = newRoot->prev; + } else if (GC_G(first_unused) != GC_G(last_unused)) { + //unused没有可用的,且buf中还有可用的 + newRoot = GC_G(first_unused); + GC_G(first_unused)++; + } else { + //buf缓存区已满,这时需要启动垃圾检查程序了,遍历roots,将真正的垃圾释放 + //垃圾回收的动作就是在这触发的 + if (!GC_G(gc_enabled)) { + return; + } + ... + + //启动垃圾回收过程 + gc_collect_cycles(); + ... + } + + //将插入的ref标为紫色,防止重复插入 + GC_TRACE_SET_COLOR(ref, GC_PURPLE); + //注意:gc_info不仅仅只有颜色的信息,还会记录当前gc_root_buffer在整个buf中的位置 + //这样做的目的是可以直接根据zend_value的gc信息取到它的gc_root_buffer,便于进行删除操作 + GC_INFO(ref) = (newRoot - GC_G(buf)) | GC_PURPLE; + newRoot->ref = ref; + + //GC_G(roots).next指向新插入的元素 + newRoot->next = GC_G(roots).next; + newRoot->prev = &GC_G(roots); + GC_G(roots).next->prev = newRoot; + GC_G(roots).next = newRoot; +} +``` +同一个zend_value只会插入一次,第2次插入时如果发现其gc_info不是GC_BLACK则直接跳过。另外像上面示例1的情况,插入后如果后面发现其refcount减为0了则表明它可以直接被回收掉,这时将需要从roots缓存区中删除,删除的操作通过`GC_REMOVE_FROM_BUFFER()`宏操作: +```c + +``` + From 4dfd420a4cd21a9004989b701c3afe9aaadd734a Mon Sep 17 00:00:00 2001 From: qinpeng Date: Wed, 26 Apr 2017 22:10:44 +0800 Subject: [PATCH 161/379] update --- 3/zend_prop.md | 2 +- 5/gc.md | 61 +++++++++++++++++++++++++++++++++++++++++-- img/zend_dy_prop.png | Bin 17049 -> 19642 bytes 3 files changed, 60 insertions(+), 3 deletions(-) diff --git a/3/zend_prop.md b/3/zend_prop.md index 7e88f89..7aad28d 100644 --- a/3/zend_prop.md +++ b/3/zend_prop.md @@ -69,7 +69,7 @@ found: } } ``` -上面就是成员属性的修改过程,普通属性根据其offset再从对象中取出属性值进行修改,而首次创建动态属性将通过`rebuild_object_properties()`初始化`zend_object->properties`哈希表,后面再创建动态属性直接插入此哈希表,`rebuild_object_properties()`过程并不仅仅是创建一个HashTable,还会将普通成员属性值插入到这个数组中,这里的插入并不是增加原zend_value的refcount,而是创建了一个IS_INDIRECT类型的zval,指向原属性值zval,具体结构如下图。 +上面就是成员属性的修改过程,普通属性根据其offset再从对象中取出属性值进行修改,而首次创建动态属性将通过`rebuild_object_properties()`初始化`zend_object->properties`哈希表,后面再创建动态属性直接插入此哈希表,`rebuild_object_properties()`过程并不仅仅是创建一个HashTable,还会将普通成员属性值插入到这个数组中,与动态属性不同,这里的插入并不是增加原zend_value的refcount,而是创建了一个IS_INDIRECT类型的zval,指向原属性值zval,具体结构如下图。 ![](../img/zend_dy_prop.png) diff --git a/5/gc.md b/5/gc.md index 2f5dd3f..4010dd7 100644 --- a/5/gc.md +++ b/5/gc.md @@ -162,7 +162,7 @@ ZEND_API void ZEND_FASTCALL gc_possible_root(zend_refcounted *ref) ... //启动垃圾回收过程 - gc_collect_cycles(); + gc_collect_cycles(); //即:zend_gc_collect_cycles() ... } @@ -180,8 +180,65 @@ ZEND_API void ZEND_FASTCALL gc_possible_root(zend_refcounted *ref) GC_G(roots).next = newRoot; } ``` -同一个zend_value只会插入一次,第2次插入时如果发现其gc_info不是GC_BLACK则直接跳过。另外像上面示例1的情况,插入后如果后面发现其refcount减为0了则表明它可以直接被回收掉,这时将需要从roots缓存区中删除,删除的操作通过`GC_REMOVE_FROM_BUFFER()`宏操作: +同一个zend_value只会插入一次,再次插入时如果发现其gc_info不是GC_BLACK则直接跳过。另外像上面示例1的情况,插入后如果后面发现其refcount减为0了则表明它可以直接被回收掉,这时需要把这个节点从roots链表中删除,删除的操作通过`GC_REMOVE_FROM_BUFFER()`宏操作: ```c +#define GC_REMOVE_FROM_BUFFER(p) do { \ + zend_refcounted *_p = (zend_refcounted*)(p); \ + if (GC_ADDRESS(GC_INFO(_p))) { \ + gc_remove_from_buffer(_p); \ + } \ +} while (0) + +ZEND_API void ZEND_FASTCALL gc_remove_from_buffer(zend_refcounted *ref) +{ + gc_root_buffer *root; + //GC_ADDRESS就是获取节点在缓存区中的位置,因为删除时输入是zend_refcounted + //而缓存链表的节点类型是gc_root_buffer + root = GC_G(buf) + GC_ADDRESS(GC_INFO(ref)); + if (GC_REF_GET_COLOR(ref) != GC_BLACK) { + GC_TRACE_SET_COLOR(ref, GC_PURPLE); + } + GC_INFO(ref) = 0; + GC_REMOVE_FROM_ROOTS(root); //双向链表的删除操作 + ... +} +``` +插入时如果发现垃圾缓存链表已经满了,则会启动垃圾回收过程:`zend_gc_collect_cycles()`,这个过程会对之前插入缓存区的变量进行判断是否是循环引用导致的真正的垃圾,如果是垃圾则会进行回收,回收的过程前面已经介绍过: +```c +ZEND_API int zend_gc_collect_cycles(void) +{ + ... + //(1)遍历roots链表,对当前节点value的所有成员(如数组元素、成员属性)进行深度优先遍历把成员refcount减1 + gc_mark_roots(); + + //(2)再次遍历roots链表,检查各节点当前refcount是否为0,是的话标为白色,表示是垃圾,不是的话需要对还原(1),把refcount再加回去 + gc_scan_roots(); + + //(3)将roots链表中的非白色节点删除,之后roots链表中全部是真正的垃圾,将垃圾链表转到to_free等待释放 + count = gc_collect_roots(&gc_flags, &additional_buffer); + ... + + //(4)释放垃圾 + current = to_free.next; + while (current != &to_free) { + p = current->ref; + GC_G(next_to_free) = current->next; + if ((GC_TYPE(p) & GC_TYPE_MASK) == IS_OBJECT) { + //调用free_obj释放对象 + obj->handlers->free_obj(obj); + ... + } else if ((GC_TYPE(p) & GC_TYPE_MASK) == IS_ARRAY) { + //释放数组 + zend_array *arr = (zend_array*)p; + + GC_TYPE(arr) = IS_NULL; + zend_hash_destroy(arr); + } + current = GC_G(next_to_free); + } + ... +} ``` +各步骤具体的过程不再详细介绍, diff --git a/img/zend_dy_prop.png b/img/zend_dy_prop.png index ed72def4ef4431b96ca594e0ad8c0cf352f57c2e..7f95bcc1fd256bea8d86009e4cddc0b71ae117e3 100644 GIT binary patch literal 19642 zcmce;Wmpw&^e#MschwzsG3l(1ZH*gmn z{<)?vBk>Hmy!!LCCNm0N!M2vvutO01hO56QpPBK=5ab>r_3Wvt^OyB;7p+@^CmdUu z9-H%a%u39~J`;f~D4J=>o7_|fX{BBJqkVf%NIVb-2lZ0 z=stv^I4dd{Xiu=H`+_*yXnex&*RzBXiUwXU5fsH@I`2x4Eb^T2HlMnHa%$`>wh2=EzT_{D9Fyv z7GQlHErCTHcW^lAlKD`q1?J>W6k+EuZ{?68ngmo-* zE6Rzw)1Zb)JWi}aYi~kScW@#Sz`mM<{ zYtclv6+tph*;ejaL>z1qEr_^UUry?JF0Tlen@^9o)a{>I)k(d1hrR_1&+gS;zHzaC zU`bRcIybNQ*>aseATM<@)GQ|>P+jd97x{5^yx0{c^JMKjLL(V#d*u#Ri=co&)vZh} zR|k>{+{JmVi>2pu<~$bouZsLwx*ToXoi7W@3Mdi5!h)Txz0hFcC;6z}E)zkXBe$dm z%vM+OU)FT?kAE-=tgXn2uS`n1Se|PL&UKj#=8T{(+pHnR>_vM{rFxkP4t zpDj9Pmh7i{eKb{bZ)~#TCjO-S!oDLGny_Oz-T@0>jUj ze_Z53@E8}_$E!7Mci*;@eH_n>y2YNBm{DeFW^rVyFef_co!}&++^LI-L~aMbQekse zr?War{^6B}a~~v3327FW>x! zy{wB`a-}5*(#Jgn0y{ST)G}IbWy@xAa*ZwXITQR+*_Fuq_N>ara#P%Mq|!C>W|+#T zaA85^}U)Wzj~AvLP*V} z&h78;P8jc3$|2U%Yo@N;Oo#&>PjY1JBe{I`b~$ zxuqo=`@P4mCp5_Gt;OUhUg?vVUo7M?5|YAu!~a&2nyLNT|Z_wNJ#eQugR9vjua4l$#NC_`a8Ca^V#(2)eMkEtY{+naib z;!akUx#isu&MOskn7v!`{ovS+kyqWMq|{;GlkNNs4{pVy_XSD9HCu({R@w7zPCLo! z>T&ULGQ(d#Zk$PnKaHKgA&P7^nMD`s@IKLq)7e&8(ce~ zpsAS(`PKPbN%X^@9b0c(OP&{U&p(u=%re!n{B1v{8LRyQv-I<+k9eY3h_`+D;d(%t z-;{*A(H*y$+X#zp&D+VO=86K9tf!G6=VeSG9)EGxL*1Wx`?j|2#0c@pH46>)b?=rD zxlzw!h2z7gwJiZn(;gD1O|g&7Ith?qQgc50ET(|(*+tW!hvW)Yt{4&5bZaekc9R5* z^XT?%vq-8u+X(2wC>toooLEn95^Wu>@}PLb#y&J)?V@FPp{@o7Gk0*|eoXleJS#fF zG43$XAceno^F!hFmiM_;P0k6}rrA<+39n~p{ksHxy_3FIJx6DUc5En9 zPqa{7sBt~e(y(=irz#-+pn(6Jt#RMTMHM)@7*p2}@E%JM7qZ!4K7ehPb(KyiXA_NU zOw|p|z`eV2jOTulPc{fTKgZU1c>5}t{SDV~bTbECs^mMUF&ba_(iR7%-lkr-DlcG* zS5loiy?cy-f#K`xi~JiK)6&#zvws#SCL<#wE{=h;cXY6_usr_q)`3evhPvs62QlW5 z?AZ%Z-?z0Z`8V89)vx86fA8lW!a2SsjaE|q{*9$&M{{#?dwau=2{$uy^OjM~SFi4p zkTe;Wtgo+|bi|7*i>$myX>EP}x8`xU=#JZFDLV;A8}s|%;9wsgpM?eE9aR~bwvmyO zReM?O} zalVd8Z3>dM4enaR#K4HSy}7ZG6d76k`ZucVwuhLwcw=KD9UWcc;9yLnJ~uBfoHM_$ zz)3+On#$4EmbWm*-r3s=4hovJew?45ucxOsJUlFm z>HALtK9del^Y5RcaB`P^k-oluUVeUDXqK))$#8dfw;=}uKY!(qALH0lSo=clJGP8W zOgYunU-o8fSY8r;f0_6FJBOH<*a~j!@<&2f%#!M}>1}7jGu{Uenj6xRlR6nbG{>+d zbP!{q!^LF%Kl~Gjou5|_6-7m?ACr@ikYpGxleg7Ucqy8xtQc^tz z*P-=5$G~__SGeGP9D z@fOmai1OlMeSX3|Hhg~rJv}8=Rn?a-hd${36Jx`Tm|dTHgo2&U5mTU)%eUbeYqf>Tb#ILT{fRRn3$O63~pkf%Qn3~ z5oq7p@!6Yy*w%(&8z3zxg!2%;q*~C_(h>t9FNnaMYm2QUe}zEHietQ z?wFdIl9H0DPWR`kXKSjx)YP2)?62e%ZhybiJcS+UQ{BedeH%G{>V$)CrK4c`rPbb^ z6Yq4VIJ9j(a4hAt?(&?yRF*C7eYk$mxoKC~zIl=`BZl|5KpA~QBV%ny`}qZ=zhwHF{Fg1msEkc3M2s1Y%@_3^~zKhRHZ!o$lB^ zsTNRpEm7;G=N=y0?cdEy-&Y*U=FgIqU6O6o=)Q*zI^%7>D2`J^6Gj+$4UFR6L}F8@ zps3_s(1Z_?PLu*W=Y+E#Fpri_CBlBOu=6gByR0?S_@w!0=)6_@U%&fn=p==22s+N) z5bdcy-bq|oU2R*#^LF>}h#TSduMY?cGBDf3N@4rOGHEJE$eWqTQ=e)ht_k7ZPX?V1$Zy)r@zVIPj(T3m^NibCY zMEiqAE%V9LWWtksuZv#R)R6SKHOmc6)_RP}tZ$A~`wds zrxd(%=MENfA*Ze*-6d$Q}+0AgO z7pEZQG{o97j+Vg5-j~~*^s3ny<|$&IBoY$Vw_EAUuCA`uEPv~<-ALl%;zGiv70YWy zso`*bvhQ(vfPs$w(V}N)XsD-0RJ_=my?%!79T)8unTqT7Pg%;5LK$HxcuP*a4v)<$FcTDO+j zr{-5*-zOIECa%Z5nF`EIOwGkXK|uut8%aWLIk~yGxVUaK*IQyeXXk?x6Dg3}w{K4w z-f6hE*47pRi$p#K2cvt}`xB_Es&Y`=SV1bDKMHG-k(9*3#a-P#*mfh4LIWlLmYyyy zCiY?Zf#PC#+cT2ex9zTcAH|qvpvy#Cv9D=H$dRgGN*t z8yma3r^n3F5)Th=Jptte_9|T_rbouOD@j{JgV6)m?O?6K?XW;{y3%2Fts(r~Gn>WE zL;<^n;7_bh4|sT9+#{r=r^i8me{j(Jbr|*~Nho3Y!HDndj&`@(WToXs(D$MuC3STw z0mr<`N`3_V$>GYO$ObZcv?PMzoY za2;{P3G<7*quDSKn<+@V%q2uU1>>%EF5KJW#7Dk z5N-($yd#14!~6HmzHd(`le-vNPJ-BLzv_R*X|dOlwz1g;wQK3q;YpC|rvk&MF*Y)y z;~RfvXxAf}Fi-JTlGkCS543ydw7;h(a^!`sZt^pE45`mi(b>jQclKhmw6p|W_ueRn z=u8-^?(yJVzkacseEEo*Tgj?3_MyR&dgA@lRR2C>#N%2?HTl=e{GpMNNQ~;}ICt2m zz<_{&z(6MFu9lXT&d$z1e^T2lrI#3kE<0)H{P8LHt*4MBha@<@{r&xh^l!w(>i3p=Y3|=2F`t~Ato!=)iMDo4O3G7h?L=}D zdZH}iXRR$|hGNCK+}x$0>*a^i3W@wgH*Xdjcf_-5mXSZU{`L3oHAG8WyQK`V2A#OY zAa7lvl_SW-6}9$=j?M_ou1{v-rwvU^8!H>z!NCC-IK5qeR(Wbo){d2U}Z`3JL_+*vH#VRN_025x6Za14GHM zMI@d0Ku^9-&B?zMG2|X0*542^iIZkpzYmxMk)8n&5#1?b{#n{+Prwa7efqn`?XY<= zG9p4rM~AXM;KtJtbrqG8($e%nm;DtYsd(6|ks<@kmL0_U^5Q&GAvtoMLcozlvn+Tm zUMHk!79qL*h%2A zl$MlyQ&L=6d9pEHm7Qrgb!Wm$D5@JxTU%RsX=%xMXHLq%z<^06Qk1idL%#v5-Doz3tXaqKAlxNHK?LPugc@^++2c zWT?`CnUO(B>2&|_Pz1D}~({zabf_j$w_VxXcd2jZZk=3KVT+m4Tq&+`rnfXC+JD=jO7hwK{| zxHvzYoS&b+xe^l{eb?Rc8GE+#L0^Br+MgRDDk>@wH&Ya2KYuRuJa;uWH>aRTgi09# zLyF>0$Mq4tdOt{g*N2K|9zKj137`0R6q*&ezdC4QWW*;RKtRfwmXd-ZoOC2ZY;SK5 zId?-F3I6Lyx#rCjUaN`lOcr7p+pYWax?blF{z?Hq7Dl01;9m62=1;=1`WCRAH$`=EoselAQx5T(3 zgp8NJ-}uFg7tfygl$3BGb8~Y)G%~ZYn!CFrbU5GqyXWArUur(+ctH2>{Ni+TPJoe} zonYid|JKutsQCE!=ue-JbsZt~0xfEH2fL zBPks2bLZ~e_{hka+1YPtX?t(#*Nw+IOpwX|egvvnyA*Mmv9;9}tGRN?mO z>M>uw$hyw-pn1dQFfcGcmTxs$)&UiUpx~`rw;&I@`P{~)2rQc$Bd%$-Blh9!!TPAi ze+LAsXu{7&RpbBug@67m-tm&o7xs`LAKUk;iW2k3hhM;h&dnL7C>||!15#5md{als z3LuZU>p_jLzQ2AdEse9>2)Fh3^#!ftq=>mrD(L+E-8+<;2DqsGtNK5G;u8`=LPFTJ zE9d6txt+IOBS&YuU1+GNwdV(#$i4E6qVM1D?)+dB zk|PXU;&6%(az5MN?=eP3MudfhuVSp*0SoEF%vZ)G!?4d)F1rhJEm1Yq)jPYpRo0Rs z_wUclGzP(`*REXyl=nV+^iR)oe&p!r2ptnsAxSW<@(|y@ei-sQ5C&++=KQ>PCyhBf zQv?sBt%-?=-~Kz6+090Nm_mvPN(FWYxfClaEArad*l~MC+`wRVeY9NS*|WWK*;WPD zP26WnQ08gZy2rWRy>sWKlG4+Q$fdeQCT8ZAwAKoUOq3cNW_?-kqy-_KpFVwJdHH>6d$vi4 zQq4&g+}z~!EV88#jl+l?yEt<0W%HPAlGR-pg5SLd53mqO{9wOvaB)EhkX+2p&hnAt zBOe!~aVm(Xv3+V{zmDP;l>weho`f%%40z1Uxd3n+c>0wL zuT4$8CLxIdnBw3S7}Fkh+e|2h!1G!e$@#4sjPB2S7%OvaP&!1;B)O2+xo0`BF1VTeY-@SX+ zQ~r0}mXEx1qQ;G`j}-F%u%=t2QVihQ8|Q7w?%vIiOL$I1Pe&JWmmBm&$?%qKLB*rr zORKAPkG~8Sx*a+0)I0?k<$CVmFa(!;dlLxe61a#y6P_of_N{Xf^ z-nn(lZf{8m5-J}bbha4gc}&nEL92;s0jG`d?$7v#qD`~gwzjsAen4b%TpN1&85Yn9 zArs^W+Dvino?LiwK>f7hEDzNC;TFHY71kKRHrOq8I#^pjU}lc;%$=H=f<#IBr*SjX zO3|TV?Ta85>D3D z(P7(Eua1ah@!GsU{LbU}t&)lgO{RVCwsSQE25{b5mG)96H*U6qB+z%>MXbLv92vdCr|jNJuC}F)J@mOI7vL=g%0(%E}5LGwb^ms%mP} z=Z^!Dk|-+_{rvr#iVT{--Cx7I`^@qupi(^};QP+b&X(|SM3O8@-gKt|;s#m`vO-1p zZV@2Y@$jIW6A~2kJl`LL^)aesfSe+FF;Kw8E-x>4YtpEbB|kEaBzL&8zP2VUBV%W0 z2M#DMG@ZS4YW5RwTL}q3tlsG=m z4gUq)Vrc$Bo`JTEz9LP-c_Ee~vBnpPj(FkfJfy&ibcmg=lF`tpsP`-?F6QLpcpx#y z_WFH?@$RvE#~-)+BixvInAd!Og^DWKGiu)VNHI^M5bmov;8kaFAu3Y*{k0TQ@>|g3zU!!Y2YW3# z@;iYyUe_H3aqv3(`{X57$^>`{buCE&ZTrHli^Q{dCY|n@Ke_6~v4L~0okn4#q0DC_ zfuFoqANT8j`3!*k&^8b8Y+f@-K&faFkYz zy>_1>pb|P=qHx|TRd;6H<9^7+%LxqwbKfxgJz=dMoVIRDG4($tsy#gf4(}osI6<`i zs3a~J1zL92n{ScF&VtwoTSlThp9?CY>X&oPYE1erb-#QgRc>~UDrt_iSy_{1Xy%~k zWTt{NHQNir{_9Qz#T+d*W?eOJ`+`n31j=IQlG`|Vxd#UOjhVcMgQ8J>4bNgWs5d4( zF1>ss>N4GrPxkOfye#oECiNF0gMEr7jCEDY?sE$MH@ni%ybsCC9hlDqEMEBdQOf*p zE`a2zmBQ~@cXdg-J4R_m*c$%^X8*OxPziku3$iplwljE{7MgS+eJP$+JtH#Dd`_Y< zA{#5{P)Rs7rQmjOd8d@t`uOkn=HJN#+leCnIR|1({PkABynf<5brv{Ub9B^xU7tSt z{-`4}4#UGnf4{Z0#gqKEp~1)h>Hs8XZ*AeeW@AIcSfxV{%V2+hME(f*Xv)ZS0)je+ z)o7m@nih1c%bYw>{ z-=lTW1rv{ZTDO07Kg+Qm$GP13lY2KOr-yfRmZQx{>M%0>_;GIdKaOu!vVRWOFuhNG zF=#(jcEl}~{&M=uLO>{bvaHfpOAztZJbl9ijA zz@Z1~TL>{-Sw$s=MWaV&XnT7bk}or>%`7p@Q2Nf;%WkFQw4o)B8=9`}5}vs{&L{ax z+s5gi+}Y~&i_Ld)i9PaMg9UINl|3^`6e+KiA^{*zHcj-8-Yg^?B z%~Jox(K_#R(>zUx95S`YkZ#y6Vf&+a%WZOCfQOOMbfzHy36GDL-VlK(C9lT8!EuEW zjZ`%n@$zP#LIn?aj??-G1_JQIH;J%<+}v+gcW&QCN6O!h!?RBo8_Br2ZK_xXj|N8H z7GWf_6pUm+5Dj`s5p@-@{3EI1C()eTua(s&U#d^uQ`WFmd1kb~%lp1O{_aZrU9&yW z9^37x;xKg&EQfpM-Wh&OH9ieb!lZ30o>A2>tk>`>N97T@V9$j7IK=;VDqOxf7B)`A zqgU;l^7)%Ht|iZ?{LvqR%XRA5dD4U8?5DeJ?CIHj*5OOb)?K+S$k!BVUb}io>YMRw zVKY`%SEcANydhXbusIgKm4}#I0~j7eDfy>Atzp`3qEU6bXjQ2{hyZdpnA^!>E(-+}PJwLwg?Ki!3qt z380-D8h;@y*FL@*%9xxtZEL4t%E|}N#9TBJ8uaU z#MJgB_wY~3G0sa>*tMR$klz?tSDM)jd%Qw%)!MB}byI&#IMG?d@3q|njWcm493Ro| zKZ=QPd_}2$Rb8SW*VWY8>RdeLc)uZE*Q88U3_jG~HYpb7yI2YpIz^e1Ucg8pRPE>H z|0wa`Hcl0(UDrK|X~+rya|U=&c?s~5p`km(#5~qhPg?5ljgM(HKz+G%ZUaC-1P% zaPm8;NsMl&d4vcoA-}$xndTvVXZBa{1eegUrZ&VaO99tUfnin~SR= zAWyF&$`Mm*miby|y>qj<_GmxEyj*-Zn2SM^g5SpMcX6qK>;x6>TPq#eQxBVr3vB&p z6TekMO*QV)jK9x!ZD#vNR)Vd@C@Yv=+vsd?15w1{Y`~OBEq}gCJu1Jwd7-V=s{8{Q zQlVZ*E_8GYsm{vYv3F1=&2gQIP2=P9cnwJqWMNPd%f!^KwhDQi08}V0*rL2-z?e9G zhHKk7cuIVw>c<~%(CE~-($x~F?GEH?lCbMkdz_ZdO`R$yxQLxC|F;XSs8|wYWFx_3 zQC^!UY9Zga1ZVqhMDHMFeoWpRT&I8SGo{LAJEVNY-2Oa&#Ygu=n55V}+b4r5H<^T3 zs4^k(ukuB3-reKR7jZ!`=OnI?HNj`nm;aJDkbi>|7uz<}5sJP@c$`Q5sKLS;12KeJ z=D389D`P_>{(<8o?5um~Udek7{{Ae7GzuE6$);J^FI4;gO$Kr`9YmaH4zeZB@g!gT zY4Kv$s+FD~-s$s7S-kibu&gmm-4@ex&_B^Eo3N}q@@TR|7xPNf6DC{A9P!`UEo#?% zF*P#J%x|O4r;rzvV@30x=B4Mu2n*aG-nu**?=gNK&!6yWzRo>_Ge|Ag$!@1_dC%6y z5nrW`TllW;>uRyh)l~t&=pd=h3Cl}Kxj{y@Ix_=M2P1js1pG93s`1q z9tKfG~jAu96z z!v{<}ARtV>Z%yPSr&p)?iR+BH9Xl-~KtHXI z<3Ch&<#>xnr2I}at1dpNSarXQ&|OXl;p8MUQawm+?erVm+xhGlpVQ3D{jYb~LLeAQ z-9f+W>(g;1MhepEm~6!ClXhD}k^y#BvBi4z*G^Obwcs4Ym*{Hgv~ZbyV0ijTgXyw5sIxu&T8(f%QSmqzbs-Ws2IK{iVBupbj$k#1zDkNvtiCC(c7tZ$mm8e%`m#HmrhsbPa z$MwHDe+R>!niuZeZ?+b-M;&#?q?Z0}k1`(y$BDW*sxffUDH?A{D(Up|( zO;56Ivb!2kgTD-avvLa+!9w@)$a<2?1t0!0CP)<)XR+^8PjAR(JTZPBO(@aHH?cL` zvW5X}v_ht9mW7u-Kuk<@T8K}_{`AZ@>he|S!(sA@!+!yWml#QVLk+s(WDo7lU)K7! z7)38`J412L^58*Me!dZ{x6E?(m@h?gUa%s&IZe8p(~o4TpU=fCAGDbJJ6c&4#?%

VZPXA=?a$JZ>)b?D=9*8oq9X=W9`*U5KJl1s+l+2M)cuvdK2xv5(jj-V z>kHNDV_Za@a%}&C=EA)$^7HI75}hYo#5vZpIo|koY2Ok% z7P69`zfwT)E`HyZi$-!~x$oU$W=z>9TlMY5)$p?0b6srob!pFi>jdV^O>2b=8!x^w z98w8M)rgbaBhQ*HHaD5nkd^_>MN zYZS%B#bso2*$wWP7)+W}iDjuQw8s|PW_S6v4dO{yTd;Oy@6@~fd1kh7q~y8ELg4P#xan=>`CQy8N%YRt_~Ml*8w%&#g@7LaY=>djyg;v zsU!n;;zC?L?7mea~bkM2_(GA`2*Tm+)+(=8xSy0sL1|y5V95OcsDPEG@?m4}-p!l=Kd8{VF0Hw%-`z zd-r5&X=%vnEp5-WvdX*pCg<{QnPHGLF;csf4&T-@H)XqM{Aa9kKjh<}Dc3a*?e$Kb zZdu3x43GVD8Nc`UXWj6Eh?c``_VkSI`zOqg&qS@Bp_Wy~KhhNs4i96|1%}bxyG(>w z2(WzqKsU91+Wsfeia)e>j@&P@l)jzVMXO7G?(d2zz_+yf{4S|8WqkDXF(nd9b>})_ zgb_p67ck;PyWQ?v8<=Hj8$Qp)$q5ewU34{7RZ%f9Ioa4`-X0whPv6Zmb@qgty`#ct zyDr=cn(7&KU#iD5u9N1RsEoCQ=B5e{4wyz$5rtg*wRUU9LDOE}NG9(7Ah&;8&VgG( zAc036kFt5?^l{q`dyQt~&(-ivcd^>t&lw95!xY6D~UYxk>db%8>W|;j9omi0@T_?|w zd^>3}&=(^YBBs`Vv(saV{;|T*Qs#W{u-2r}q)Ld&ys-gm`TCedp%hPAtFEd#2J06Y zt1qg}mFG`1!*-W0#{FDt<13#tOyJXU3De%zFw2nusW-op+!4(v6l|Z}ZjNJt9vUo^ zGje7$DmoHDHngaA_Qd7-b7SO???&r8WWyS8lS2vtBc6fCq=?bI)XJQr-$KX(PwUO! zc9*yo%=P2{|iVBpKUtpMK zzP!Y`r3u@>wCiD>gnN!m^=;Fr`hM*v^A)|r)%i+BVpICL>*U1u>p+}0Qk#M2afX( z_>k`n1>$FEbJW8$E+a#Vm&MsO!M^h>1q8^LvsaYOuFXIcd7{;vVLCk}tBbW&urHm* z#|5J(Ro=0uoKHRyG`jBLkap~JbaVja2$`Clr6Gx;YxQEw&(Aiq>u+_?lxAT>(XdfJM90k-(zAHzE14Iwu9!KHtSz%zxRH? zBCU1wELD^EXiXJAJ)dm$Y`h>(u^Tx=;QPI`gZ24%F1oim;wKF+6vFzkxkm` zL*c(Y(CQfL}V3E*h7??A^EHVAq#0KLjK_3&&HEUsETH(g$OKh#8rE-5GYoV~B7yT7O3 zeD{{8b>a824A%^Qb=wzgE<*zHx%t_h{9b+&U!w~so2JaSZK=JZg2<3BkAEm&h2L?y zI@x1LK8Kr?LR+V?q_{foS-jtaMygw;ae+#N&C^av!dC~TsHzG5%cRY{Y zQ)b+!!7in4s$&(B*~*`8k;nt#i?+-B^n5|0 zdwT{NN5h)2&tesu;Nxwkx|B$0a>vTgn}}1&q_bu>b00zYyAOoHULE(at?A7#yGxQw z;aNl-32H>0y7n*ExaJFkpYJ=DU{TY`JC;RSba~>Fjlde&Uw%gnowbCyxNcqbKVtFGOW&OhgKNw{i{QiIvoagV z(}3nH^l)V{d){3hvq!nbG_q{Y&eq#wQJn7eDqNoGJ{RF%a6idrN#c|X&(R?T ze0$5(5T4Yv1M~rKLdM3%!4{z>d~R;1KY#ul8F?j~%ueD&zl1;BY1zXMeQX&STn$PQ zPeJ6We{=0xWF)klqB5bo17Kj9HPHWLpN)u%j(Cw$SBcczSV84U$WKql*ksqqmmK+7 z@OjQnrggN29D4NZy0zDl)5Fb7oWsq@%b7-8Gf~m_sghZCW+S=O9n>V4=x45xUz;Vd1BpgREfQ1Ddd{_fS7mJY}0gd|5y$7TRTH`3c zfI(AVUk{j3#YgI^F8I*sXjBZ1d)V(IqhwW&RLhYT&c- zme4d98ym~&pb~PWE&iO4py}-VSi^H~>4wMmB#Spdi7_ys5gw!y6#Qc5*b+(CM-Pw@ z4-b!_?!$)<-@biI>uJU=`4Hrnm6i2~m$#|05eUYS1JSISl7W~AbV6}S*pOe@Dw&TS zJ=)vfmr7L0lox;goSv4JgEWgglBo^&*8PKn05XSX0s=y-G11re1E?{nsrt|dhKJo; zTY%db+G%Qz0)iW8(LXeFAd~^1ES#dOq!f{yETZ4=@v4W80~8Ig^n$D`NhvAl)Y42+ z0SE&Zg}$GuxVUdzoCa{uk9QYQKx6ffcjkMlu_bk2-N5NWpvQJq$?$(k>KzCV*&|^i zY5g7^P6#Xx1qFp2`|X)V1>l%LMGe#z5tB}G<)i&U-7ESkh~xL~cdmS#7nMGudL|+n z6L*Ru9JMBzn?LRaOBNsO?4Tk{^?{iq_`D`XFVk-1a5IAYm;3T~yBpwIN}>42HZ!n! z;!IGdo0^%SdP7gxgFZMvpVdR+KIz@Q+MsjcaHxJ`5rpEH%-i9sYRtfRy7 z^kBWpaUI?Vx)z=9^z<}PUZ7dJIheNUtn`EVPaGqM ztrKW((PpCk0xrS%`8fo|FMMDQRD8Cyz-7nrO`9YpCFQdi;^2%Gt08|CLs}{~QY*NO zVPa^gRqY(X0@~5g)U-KX#S2YUA)%U*grqkDh~o-Bk2eE0U4cFc zU1hplj?agh+&N1RXQ>#_$GIh0iBSE;ApUw;`ESQA>Ya@x~a3erltny zAd)G-kSi}gEH-LuR^dsYAS2UMQP~CB3DA69-0G^jJDesx7(}#Bn1_7r5Gw@t0CNq7s?Xea0fGhY9p|f?WMs^>$DbHg3bZOjuXQYcJ9z&5 zc~Mc3YRMc6Q-nu^iUFmN>$A_B<}(twD; z-|IVlz?*GuezUjK4aN(tft!V1vwuUXs|8oS<~A>Yk)k7xD*B+<^4v=Oo1asDH?fO+;%I#7LXuetxWHKy>+iuUMjOkpLR2A=$94Y)y2r$XHdlNh!R z`YXZG!%e3Oagr@jx;gw~E3c;O{S~~H6F(|uazrmY1Py>L8yvK7x29QW#Q~YT;!d`L zq@=Zdq8NKih4tUIdCe75<-ZQw`F__aADgr`nBHotII>z>7-EUkEsmXUX&=@oF`hn_ z&N>7VcZS#!%-x_fs1vwKb^3DYa82Mf_VL!-Y}rxuR6ohII46sVG52ki`O*`fUx&Qc z((UW+z5%lpJy|FF1ZEZLyKY8C=@}XH=T!7S6CRA@e$A9X!a?!Yxj%tA%zaJ=K_3&-KiTU-LzLF`88O^L zl4%oDZzK8>O3SAFE#bMtF#k7|eEKwmSOW#xWK>kpS{wkZHu4X!hYXF3vU78R0*d?s zZpg3&PjXkXpbL;W`4Qldn9R3+?!!OnQY+o6qB)u7Oy+E;3 zSBFs~dXi@=1x`*k^eh^#7qW+iyT38N&x1T!oxI$gi&;sh?8J_s=Ay`RGyQ0McC-x) zwmCMc+rSB8P)Gva-#J8aBs?}23t=H%h1CKX4PHC}#J{AtSaKc`89%>kEA8~sP|pIx zD*JM-pcCyOF@oK6H5&%gRh{1HYaN{%q*=XQ@ zF*2B>M9q`&zJ=Cj?=Fc3jK)R^U*9H)1nQ{swmyhtM^#MB0Ae7J3RTY`3`fVrEY8md z{2;u0*9?TbxG2G$4&pR05Q~PwrVVDG2xLWn0iFxOGQc~^Bfu|mbbe5rlJaiOUK-{y zo;^c%pdJFwR{5}kZiTIpsHo`c*Z1N^M;Hwy6SW@sass#yER^SSC{sX8kL9t9KT7Y0 z%hFv34@Hr4qvDEk%=+r`a=@4Kjrn;8@Rg9A^x$T@5rn^K`Kn^2w_)%H1azh^+>x1)@f;|TO-D*Vw|jt0NXt~ z`*BV1bQm_Q^IViyf^un=psyD=Z67~=1lk#-pgD^72>&r72BGCvLfo48d>mg8j^(n{}fy}pk5=6`j(ts20E3|B1O?8wXuQac@*%Cx;yq+r| zezyxFiWIwhdln%5H*X}Rr7K2zY5NA>P1t0=5zm>m6XY&+J+yP}xF4 z@Q^#Cq)H`B%b`>vl%%9mA<^W5&Wg6QeU0-i8<9~_U^x~>M&j$;!^18R&u7TMh7Lj2 zYHFKo7hEuX010Pvv!v^f57+SSo40JDH9kHky3+UDTiT6p517j>N1xYyD5$NiReT`m zc97R>>EJ7xQdqbN^8nzLE{|pjp#902dlL~96ueJE1I=g26+xRB^kar zhTVOmj9g7v>3Z<$_tLoAk(=v$~_r8j(K=6x7H6{)QdNEDt&blK1RR9W{#)4lr<`6p9BY- z&@ubbc<}t3SH3Em=#LkkK0kV2y{q6A@&QRW>btK%Gy~{<(DA(nWecgs&n((ViQ*$W z1#xkVkxF&}Q5bTIY^<#g43z$_hhw+7j#?#-mEtK%e7a-!bpecC7V|x!sI3D0-_g+# zh6&Tt(?RwC>A)-%HOzrm015a#Nf$gp-{7_DOYcbcAU1<1Z9y4=Q~;(LU@r5cOI%zW z0x_n^{+{GT^UTMP$VgEBTS!A=( z09ZO~^jz4QBi>J~{~0BPEEDzJlh%B6)OU|Q2#RK?sSWHfna72u_EsK7-1oV2uS!El zT%3-HDX>w0`}hpzVWs#ybfCs+YGPnz&5vOZhppcMcvcX3V`}Q_=LfU0K)QsQj52I+ znjVA#Ni39$T5KeCLZVnLOFso0|NOZRvzU(_efn=Us^aHQD8g*9eGXn~Xc(E8@Ioco z&;a!*yb65x2$#d2_80=4+Euk(^A%IWy~7+cF=R^C)^Vk!EzSCU&2iw=v8o3WE8NSr zJ=C}m!^$LvS*TODwHi@rxIW)r{SC7h@%|KbhyVKQQN&)}Zh3R@a%`bkJ?heFvE3b+ z5!t%puxF(Phpi#z2dKX$hW61uT@qEXm(ERd6$k9L2LzpsA+H0}mw3Nj&-yOaGMD|r zPB4+*T>(@;VgMdHHZ~Ua3{r3y$;f~iG!qk;(*S}b>D{|!8p%L=ZHu(4F${|CypL;| z%|}O&ti|=A*LJ2h!}4iP z&Y6SMSAn_$Yy|y%otbW*rB=zH%fd5abMKs!@V>M*9!ZoCE~JJsn7}u;=je zIvJ1b&cgi)N+d1r_EBjHKGG*#$n0`tv2m7d7}XaQv&jBM*nbrZDZAAnO&LAe>G54Z zgru~;ww~Sar|56Ll1g+)oGV! zY57!oSe;yg$sB58nV8yx7!oIHqo^cT>WElodG>G=8kDJB1wMvdW2R+FlW7==7eN?C zM2grEScwm)#I4TU^atGjwzEI%&hF0c=ZDw(HOM6N^w=gpz#?*72QzoPk-UdP6#uQ* z)RwB36nI2wFvg`jl;!bSp}-$J2*OjKN(X655Me+b4cW@n_EjKdwH10sAh#NIjw7n- z+7Er49v>JC6_qrB!i~Fs-)h8VPBt{vbs%4J_Ca!@l)#YWNoR3bbI1ORJcT1ze3Vt> z%tO6yz-$^T*|}v&u+qWLDfqChj1v{0j*az$Ui-{a_N?|j6%GkUL4`{twz zhn^5b)t!B?cp{;u*KFcW^Z7C67C+U~rD%vaCS-kryZ?&RO_9ZKSLN1i%;$Pc9-9bJ zDv*88>L!ETBbByIuzzZ{M^qvL$A?xys+-no=UKP{yb$2y zi6d{3M()x)JSt{=s@v&LFZ3JY6Vt@6FrQ~0$#PS3XKu(j><`7^Q#8S&mM6TS+JU>5 zB<_ux2tZ*P!!t#&zLc2LcFuLv{-RT%m_6Nw@MjIRJRX+?oY6&ft)n6Se)R0ft0AvJq|_UYX&0mt;tL)>Mjx&>N61twyX2aq z&FKM-@N%8D?Nlj^FVbuZs^BVn?UdhZv~8W@u0@c3m`x8P{VlrIo-a#@^I7^!i=owj zmjgLYwU$V_Wj2JlLCe;N^b~h)qqfjbsk0lPO({Dhqr)YeJyTXZ&s*HN)4l(E*qJ_8 zVRJ@cAw!cc_dh_6b=XSYHc+8GE+g*1obbZ2GSbp~JUuB{S)&wO8wn>bTd*l$#Es<6 zy>efrn)12gkgn*3NyT3t6Q5=XRuA>VzO%kCXZYMs2@-D(_}B&=c4f3}9|a`;X6VURC;^K!4)_N2;TzSQ}3?zGzX ze8;D_^mv$9O$*~yyd&rRG*Rwcee!*njZ4mCae=LXsqM#zM!{E!{Ki|?c!3nH8$)Di zMw>&db|1ONqSrSG?LfxJ;&@fnT`I6p^+erm2ka)Zs_Y!Cc@@etKMMD1cw@o})AQl9 zYZKD--!hWH#vLn5a$BEaiLPOL;#lmmaL&DyHyK$=R=F!%3v<#6^6l4&N!D+oSVtDU)(Obhs8yTUwUGfbQydF?Qy2w!q#+ zf;~i-r@rT09GHv5`A#fKCmeKIQy7Vw(~Zm{;p>1XOUua1`R;5JJtW}89szfOg_Z9Q z3(+;ymAbN0aeaM#0%DQ>X&EON6K_!3U&W$y{M&6;Kk|Ywe;AZ=>Zx(-ey^afm^mn$ rmPe81%r9WtIe*oE{Q3VIFy%8RUTz@|U;PuP$Dpu~h~NhFp@M$_Dh>3C literal 17049 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 Date: Wed, 26 Apr 2017 22:21:44 +0800 Subject: [PATCH 162/379] update --- 3/zend_prop.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/3/zend_prop.md b/3/zend_prop.md index 7aad28d..7ec0dfb 100644 --- a/3/zend_prop.md +++ b/3/zend_prop.md @@ -73,6 +73,8 @@ found: ![](../img/zend_dy_prop.png) +> 这里不清楚将原有属性也插入properties的用意,已知用到的一个地方是在GC垃圾回收获取对象所有属性时(zend_std_get_gc()),如果有动态属性则直接返回properties给GC遍历,假如不把普通的显式定义的属性"拷贝"进来则需要返回、遍历两个数组。 + 成员属性的读取通过`zend_object->handlers->read_property`(默认zend_std_read_property())函数完成,动态属性的查找过程实际与`write_property`中相同: ```c zval *zend_std_read_property(zval *object, zval *member, int type, void **cache_slot, zval *rv) From ecf4f98640791b876ecd25d5c13c8ebdf5251031 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Wed, 26 Apr 2017 22:24:44 +0800 Subject: [PATCH 163/379] update --- img/zend_dy_prop.png | Bin 19642 -> 22961 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/img/zend_dy_prop.png b/img/zend_dy_prop.png index 7f95bcc1fd256bea8d86009e4cddc0b71ae117e3..4860737040359247076679f9098fa9d06e68f27b 100644 GIT binary patch literal 22961 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 From 92a53439336a30c058aa561022d01acf24f1413d Mon Sep 17 00:00:00 2001 From: qinpeng Date: Thu, 27 Apr 2017 20:37:29 +0800 Subject: [PATCH 164/379] update object --- 3/zend_object.md | 64 +++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 60 insertions(+), 4 deletions(-) diff --git a/3/zend_object.md b/3/zend_object.md index 9e5e3d8..98e1b3d 100644 --- a/3/zend_object.md +++ b/3/zend_object.md @@ -176,7 +176,7 @@ ZEND_API zend_object *zend_objects_new(zend_class_entry *ce) return object; } ``` -有个地方这里需要特别注意:分配对象结构的内存并不仅仅是zend_object的大小。我们在3.4.2.1介绍properties_table时说过这是一个变长数组,它用来存放非静态属性的值,所以分配zend_object时需要加上非静态属性所占用的内存大小:`zend_object_properties_size()`(实际就是zend_class_entry.default_properties_count)。 +有个地方这里需要特别注意:分配对象结构的内存并不仅仅是zend_object的大小。我们在3.4.2.1介绍properties_table时说过这是一个变长数组,它用来存放非静态属性的值,所以分配zend_object时需要加上非静态属性所占用的内存大小:`zend_object_properties_size()`,根据普通非静态属性个数确定,如果没有定义__get()、__set()等魔术方法则占用内存就是: __属性数*sizeof(zval)__ ,如果定义了这些魔术方法那么会多分配一个zval的空间,这个多出来zval的用途下面介绍成员属性的读写时再作说明。 另外这里还有一个关键操作:__将object编号并插入EG(objects_store).object_buckets数组__。zend_object有个成员:handle,这个值在一次request期间所有实例化对象的编号,每调用`zend_objects_new()`实例化一个对象就会将其插入到object_buckets数组中,其在数组中的下标就是handle。这个过程是在`zend_objects_store_put()`中完成的。 ```c @@ -245,7 +245,63 @@ ZEND_API void object_properties_init(zend_object *object, zend_class_entry *clas * __step4:__ 查找当前类是否定义了构造函数,如果没有定义则跳过执行构造函数的opcode,否则为调用构造函数的执行进行一些准备工作(分配zend_execute_data) * __step5:__ 实例化完成,返回新实例化的对象(如果返回的对象没有变量使用则直接释放掉了) -#### 3.4.2.3 对象的复制 +#### 3.4.2.3 成员属性的读写 +普通成员属性的读写处理handler分别为`zend_object.handlers`中的:read_property、write_property,默认对应的函数为:zend_std_read_property()、zend_std_write_property(),访问获取修改一个普通成员属性时就是由这两个函数完成的。 + +__(1)读取属性:__ + +比如:`echo $obj->name;`,先看下具体代码的实现: +```c +zval *zend_std_read_property(zval *object, zval *member, int type, void **cache_slot, zval *rv) +{ + zend_object *zobj; + uint32_t property_offset; + + zobj = Z_OBJ_P(object); + + //根据属性名在zend_class.zend_property_info中查找zend_property_info,得到属性值在zend_object中的存储offset + property_offset = zend_get_property_offset(zobj->ce, Z_STR_P(member), (type == BP_VAR_IS) || (zobj->ce->__get != NULL), cache_slot); + + if (EXPECTED(property_offset != ZEND_WRONG_PROPERTY_OFFSET)) { + if (EXPECTED(property_offset != ZEND_DYNAMIC_PROPERTY_OFFSET)) { + //普通属性,直接根据offset取到属性值:((zval*)((char*)(zobj) + offset)) + retval = OBJ_PROP(zobj, property_offset); + } else if (EXPECTED(zobj->properties != NULL)) { + //动态属性的情况,没有在类中显式定义的属性,后面一节会单独介绍 + .... + } + } else if (UNEXPECTED(EG(exception))) { + ... + } + + //没有找到属性 + //调用魔术方法:__isset() + if ((type == BP_VAR_IS) && zobj->ce->__isset) { + ... + } + + //调用魔术方法:__get() + if (zobj->ce->__get) { + zend_long *guard = zend_get_property_guard(zobj, Z_STR_P(member)); + ... + if(!((*guard) & IN_ISSET)){ + *guard |= IN_ISSET; + zend_std_call_issetter(&tmp_object, member, &tmp_result); + *guard &= ~IN_ISSET; + ... + } + } + ... +} +``` +普通成员属性的查找比较容易理解,首先是从zend_class的属性信息哈希表中找到zend_property_info,然后直接根据属性的offset在zend_object.properties_table数组中取到属性值,如果没有在属性哈希表中找到且定义了__get()魔术方法则会调用此方法处理。 + +> __Note:__ 如果类存在__get()方法,则在实例化对象分配属性内存(即:properties_table)时会多分配一个zval,类型为HashTable,每次调用__get($var)时会把输入的$var名称存入这个哈希表,这样做的目的是防止循环调用,举个例子: +> public function __get($var) { + return $this->$var; +> } + +#### 3.4.2.4 对象的复制 PHP中普通变量的复制可以通过直接赋值完成,比如: ```php $a = array(); @@ -295,7 +351,7 @@ ZEND_API zend_object *zend_objects_clone_obj(zval *zobject) return new_object; } ``` -#### 3.4.2.4 对象比较 +#### 3.4.2.5 对象比较 当使用比较运算符(==)比较两个对象变量时,比较的原则是:如果两个对象的属性和属性值 都相等,而且两个对象是同一个类的实例,那么这两个对象变量相等;而如果使用全等运算符(===),这两个对象变量一定要指向某个类的同一个实例(即同一个对象)。 PHP中对象间的"=="比较通过函数`zend_std_compare_objects()`处理。 @@ -318,7 +374,7 @@ static int zend_std_compare_objects(zval *o1, zval *o2) ``` "==="的比较通过函数`zend_is_identical()`处理,比较简单,这里不再展开。 -#### 3.4.2.5 对象的销毁 +#### 3.4.2.6 对象的销毁 object与string、array等类型不同,它是个符合类型,所以它的销毁过程更加复杂,赋值、函数调用结束或主动unset等操作中如果发现object引用计数为0则将触发销毁动作。 ```php //情况1 From 131ea74846e9dad82b7402ecf1b955ae039fe193 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Thu, 27 Apr 2017 20:50:13 +0800 Subject: [PATCH 165/379] update object --- 3/zend_object.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/3/zend_object.md b/3/zend_object.md index 98e1b3d..322e2e6 100644 --- a/3/zend_object.md +++ b/3/zend_object.md @@ -297,9 +297,8 @@ zval *zend_std_read_property(zval *object, zval *member, int type, void **cache_ 普通成员属性的查找比较容易理解,首先是从zend_class的属性信息哈希表中找到zend_property_info,然后直接根据属性的offset在zend_object.properties_table数组中取到属性值,如果没有在属性哈希表中找到且定义了__get()魔术方法则会调用此方法处理。 > __Note:__ 如果类存在__get()方法,则在实例化对象分配属性内存(即:properties_table)时会多分配一个zval,类型为HashTable,每次调用__get($var)时会把输入的$var名称存入这个哈希表,这样做的目的是防止循环调用,举个例子: -> public function __get($var) { - return $this->$var; -> } +> public function __get($var) { return $this->$var; } +> 这种情况是调用__get()时又访问了一个不存在的属性,也就是会在__get()方法中递归调用,如果不对请求的$var作判断则将一直递归下去,所以在调用__get()前首先会判断当前$var是不是已经被__get()了,如果是则不会再调用__get()。 #### 3.4.2.4 对象的复制 PHP中普通变量的复制可以通过直接赋值完成,比如: From da8c0f42184035fb8c37fab3de954b4f00b32695 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Thu, 27 Apr 2017 20:51:02 +0800 Subject: [PATCH 166/379] update object --- 3/zend_object.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/3/zend_object.md b/3/zend_object.md index 322e2e6..8c9b7d5 100644 --- a/3/zend_object.md +++ b/3/zend_object.md @@ -297,7 +297,8 @@ zval *zend_std_read_property(zval *object, zval *member, int type, void **cache_ 普通成员属性的查找比较容易理解,首先是从zend_class的属性信息哈希表中找到zend_property_info,然后直接根据属性的offset在zend_object.properties_table数组中取到属性值,如果没有在属性哈希表中找到且定义了__get()魔术方法则会调用此方法处理。 > __Note:__ 如果类存在__get()方法,则在实例化对象分配属性内存(即:properties_table)时会多分配一个zval,类型为HashTable,每次调用__get($var)时会把输入的$var名称存入这个哈希表,这样做的目的是防止循环调用,举个例子: -> public function __get($var) { return $this->$var; } +> __ public function __get($var) { return $this->$var; } __ +> > 这种情况是调用__get()时又访问了一个不存在的属性,也就是会在__get()方法中递归调用,如果不对请求的$var作判断则将一直递归下去,所以在调用__get()前首先会判断当前$var是不是已经被__get()了,如果是则不会再调用__get()。 #### 3.4.2.4 对象的复制 From dd4416a2181720a0ca5b58512337231c27ae6bd0 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Thu, 27 Apr 2017 20:51:40 +0800 Subject: [PATCH 167/379] update object --- 3/zend_object.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/3/zend_object.md b/3/zend_object.md index 8c9b7d5..bc35451 100644 --- a/3/zend_object.md +++ b/3/zend_object.md @@ -297,7 +297,8 @@ zval *zend_std_read_property(zval *object, zval *member, int type, void **cache_ 普通成员属性的查找比较容易理解,首先是从zend_class的属性信息哈希表中找到zend_property_info,然后直接根据属性的offset在zend_object.properties_table数组中取到属性值,如果没有在属性哈希表中找到且定义了__get()魔术方法则会调用此方法处理。 > __Note:__ 如果类存在__get()方法,则在实例化对象分配属性内存(即:properties_table)时会多分配一个zval,类型为HashTable,每次调用__get($var)时会把输入的$var名称存入这个哈希表,这样做的目的是防止循环调用,举个例子: -> __ public function __get($var) { return $this->$var; } __ +> +> __public function __get($var) { return $this->$var; }__ > > 这种情况是调用__get()时又访问了一个不存在的属性,也就是会在__get()方法中递归调用,如果不对请求的$var作判断则将一直递归下去,所以在调用__get()前首先会判断当前$var是不是已经被__get()了,如果是则不会再调用__get()。 From 14a54467c8358d9f4b25cd7ad18421b2ac250357 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Thu, 27 Apr 2017 20:52:32 +0800 Subject: [PATCH 168/379] update object --- 3/zend_object.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3/zend_object.md b/3/zend_object.md index bc35451..7e8957e 100644 --- a/3/zend_object.md +++ b/3/zend_object.md @@ -298,7 +298,7 @@ zval *zend_std_read_property(zval *object, zval *member, int type, void **cache_ > __Note:__ 如果类存在__get()方法,则在实例化对象分配属性内存(即:properties_table)时会多分配一个zval,类型为HashTable,每次调用__get($var)时会把输入的$var名称存入这个哈希表,这样做的目的是防止循环调用,举个例子: > -> __public function __get($var) { return $this->$var; }__ +> ***public function __get($var) { return $this->$var; }*** > > 这种情况是调用__get()时又访问了一个不存在的属性,也就是会在__get()方法中递归调用,如果不对请求的$var作判断则将一直递归下去,所以在调用__get()前首先会判断当前$var是不是已经被__get()了,如果是则不会再调用__get()。 From d0c7483e2f1644b7d449149cb374c807aca0b527 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Thu, 27 Apr 2017 21:14:04 +0800 Subject: [PATCH 169/379] update object --- 3/zend_object.md | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/3/zend_object.md b/3/zend_object.md index 7e8957e..3bbeaaa 100644 --- a/3/zend_object.md +++ b/3/zend_object.md @@ -260,6 +260,7 @@ zval *zend_std_read_property(zval *object, zval *member, int type, void **cache_ zobj = Z_OBJ_P(object); //根据属性名在zend_class.zend_property_info中查找zend_property_info,得到属性值在zend_object中的存储offset + //注意:zend_get_property_offset()会对属性的可见性(public、private、protected)进行验证 property_offset = zend_get_property_offset(zobj->ce, Z_STR_P(member), (type == BP_VAR_IS) || (zobj->ce->__get != NULL), cache_slot); if (EXPECTED(property_offset != ZEND_WRONG_PROPERTY_OFFSET)) { @@ -294,13 +295,20 @@ zval *zend_std_read_property(zval *object, zval *member, int type, void **cache_ ... } ``` -普通成员属性的查找比较容易理解,首先是从zend_class的属性信息哈希表中找到zend_property_info,然后直接根据属性的offset在zend_object.properties_table数组中取到属性值,如果没有在属性哈希表中找到且定义了__get()魔术方法则会调用此方法处理。 +普通成员属性的查找比较容易理解,首先是从zend_class的属性信息哈希表中找到zend_property_info,并判断其可见性(public、private、protected),如果可以访问则直接根据属性的offset在zend_object.properties_table数组中取到属性值,如果没有在属性哈希表中找到且定义了__get()魔术方法则会调用__get()方法处理。 > __Note:__ 如果类存在__get()方法,则在实例化对象分配属性内存(即:properties_table)时会多分配一个zval,类型为HashTable,每次调用__get($var)时会把输入的$var名称存入这个哈希表,这样做的目的是防止循环调用,举个例子: > > ***public function __get($var) { return $this->$var; }*** > -> 这种情况是调用__get()时又访问了一个不存在的属性,也就是会在__get()方法中递归调用,如果不对请求的$var作判断则将一直递归下去,所以在调用__get()前首先会判断当前$var是不是已经被__get()了,如果是则不会再调用__get()。 +> 这种情况是调用__get()时又访问了一个不存在的属性,也就是会在__get()方法中递归调用,如果不对请求的$var作判断则将一直递归下去,所以在调用__get()前首先会判断当前$var是不是已经被__get()了,如果是则不会再调用__get(),否则会把$var作为key插入那个HashTable,然后将哈希值设置为:*guard |= IN_ISSET,调用完__get()再把哈希值设置为:*guard &= ~IN_ISSET。 + +__(2)设置属性:__ + +设置属性是对属性的修改操作,默认通过zend_std_write_property()处理,比如:`$obj->name = "pangudashu";`,看下具体的实现过程: +```c + +``` #### 3.4.2.4 对象的复制 PHP中普通变量的复制可以通过直接赋值完成,比如: From c1612e4ce6c5672a243df68e0d4ee9268b4baf55 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Fri, 28 Apr 2017 10:03:43 +0800 Subject: [PATCH 170/379] update object --- 3/zend_object.md | 52 +++++++++++++++++++++++++++++++++++++++++++----- 3/zend_prop.md | 6 ++++-- 2 files changed, 51 insertions(+), 7 deletions(-) diff --git a/3/zend_object.md b/3/zend_object.md index 3bbeaaa..4b6f906 100644 --- a/3/zend_object.md +++ b/3/zend_object.md @@ -250,7 +250,7 @@ ZEND_API void object_properties_init(zend_object *object, zend_class_entry *clas __(1)读取属性:__ -比如:`echo $obj->name;`,先看下具体代码的实现: +通过对象或方法内通过$this访问属性,比如:`echo $obj->name;`,具体的实现: ```c zval *zend_std_read_property(zval *object, zval *member, int type, void **cache_slot, zval *rv) { @@ -301,14 +301,58 @@ zval *zend_std_read_property(zval *object, zval *member, int type, void **cache_ > > ***public function __get($var) { return $this->$var; }*** > -> 这种情况是调用__get()时又访问了一个不存在的属性,也就是会在__get()方法中递归调用,如果不对请求的$var作判断则将一直递归下去,所以在调用__get()前首先会判断当前$var是不是已经被__get()了,如果是则不会再调用__get(),否则会把$var作为key插入那个HashTable,然后将哈希值设置为:*guard |= IN_ISSET,调用完__get()再把哈希值设置为:*guard &= ~IN_ISSET。 +> 这种情况是调用__get()时又访问了一个不存在的属性,也就是会在__get()方法中递归调用,如果不对请求的$var作判断则将一直递归下去,所以在调用__get()前首先会判断当前$var是不是已经在__get()中了,如果是则不会再调用__get(),否则会把$var作为key插入那个HashTable,然后将哈希值设置为:*guard |= IN_ISSET,调用完__get()再把哈希值设置为:*guard &= ~IN_ISSET。 __(2)设置属性:__ -设置属性是对属性的修改操作,默认通过zend_std_write_property()处理,比如:`$obj->name = "pangudashu";`,看下具体的实现过程: +与读取属性不同,设置属性是对属性的修改操作,比如:`$obj->name = "pangudashu";`,看下具体的实现过程: ```c +ZEND_API void zend_std_write_property(zval *object, zval *member, zval *value, void **cache_slot) +{ + zend_object *zobj; + uint32_t property_offset; + + zobj = Z_OBJ_P(object); + + //与读取属性相同 + property_offset = zend_get_property_offset(zobj->ce, Z_STR_P(member), (zobj->ce->__set != NULL), cache_slot); + if (EXPECTED(property_offset != ZEND_WRONG_PROPERTY_OFFSET)) { + if (EXPECTED(property_offset != ZEND_DYNAMIC_PROPERTY_OFFSET)) { + //普通属性 + variable_ptr = OBJ_PROP(zobj, property_offset); + if (Z_TYPE_P(variable_ptr) != IS_UNDEF) { + goto found; + } + } else if (EXPECTED(zobj->properties != NULL)) { + //动态属性哈希表已经初始化,直接插入zobj->properties哈希表,后面单独介绍 + ... + if ((variable_ptr = zend_hash_find(zobj->properties, Z_STR_P(member))) != NULL) { +found: + zend_assign_to_variable(variable_ptr, value, IS_CV); + goto exit; + } + } + } else if (UNEXPECTED(EG(exception))) { + ... + } + + //没有找到属性 + //如果定义了__set()则调用 + if (zobj->ce->__set) { + //与__get()相同,也会判断set的变量名是否已经在__set()中 + ... + ZVAL_COPY(&tmp_object, object); + (*guard) |= IN_SET; //防止循环__set() + if (zend_std_call_setter(&tmp_object, member, value) != SUCCESS) { + } + (*guard) &= ~IN_SET; + }else if (EXPECTED(property_offset != ZEND_WRONG_PROPERTY_OFFSET)) { + ... + } +} ``` +> __Note:__ 属性读写操作的函数中有一个cache_slot的参数,它的作用涉及PHP的一个缓存机制:运行时缓存,后面会单独介绍。 #### 3.4.2.4 对象的复制 PHP中普通变量的复制可以通过直接赋值完成,比如: @@ -429,5 +473,3 @@ ZEND_API void zend_objects_store_del(zend_object *object) } ``` 另外,在减少refcount时如果发现object的引用计数大于0那么并不是什么都不做了,还记得2.1.3.4介绍的垃圾回收吗?PHP变量类型有的会因为循环引用导致正常的gc无法生效,这种类型的变量就有可能成为垃圾,所以会对这些类型的`zval.u1.type_flag`打上`IS_TYPE_COLLECTABLE`标签,然后在减少引用时即使refcount大于0也会启动垃圾检查,目前只有object、array两种类型会使用这种机制。 - - diff --git a/3/zend_prop.md b/3/zend_prop.md index 7ec0dfb..f2efa12 100644 --- a/3/zend_prop.md +++ b/3/zend_prop.md @@ -1,5 +1,5 @@ ### 3.4.4 动态属性 -PHP中除了显示的在类中定义成员属性外,还可以动态的创建非静态成员属性,这种属性称之为动态属性,比如: +前面介绍的成员属性都是在类中明确的定义过的,这些属性在实例化时会被拷贝到对象空间中去,PHP中除了显示的在类中定义成员属性外,还可以动态的创建非静态成员属性,这种属性不需要在类中明确定义,可以直接通过:`$obj->property_name=xxx`、`$this->property_name = xxx`为对象设置一个属性,这种属性称之为动态属性,举个例子: ```php class my_class { public $id = 123; @@ -11,10 +11,12 @@ class my_class { $obj = new my_class; $obj->test("prop_1", array(1,2,3)); +//或者直接: +//$obj->prop_1 = array(1,2,3); print_r($obj); ``` -在`test()`方法中直接操作了没有定义的成员属性,这种动态属性 __首次定义__ 只能在类的成员方法中完成,无法在类之外定义,比如:`$obj->prop_2 = array(1,2,3);`,但是首次定义完之后就可以像普通成员属性一样使用了。上面的例子将输出: +在`test()`方法中直接操作了没有定义的成员属性,上面的例子将输出: ``` my_class Object ( From e7ce1b5068fe658a6ecd0b54709173a6685fa636 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Fri, 28 Apr 2017 10:08:59 +0800 Subject: [PATCH 171/379] update --- 3/zend_object.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/3/zend_object.md b/3/zend_object.md index 4b6f906..81e8259 100644 --- a/3/zend_object.md +++ b/3/zend_object.md @@ -329,6 +329,7 @@ ZEND_API void zend_std_write_property(zval *object, zval *member, zval *value, v ... if ((variable_ptr = zend_hash_find(zobj->properties, Z_STR_P(member))) != NULL) { found: + //赋值操作,与普通变量的操作相同 zend_assign_to_variable(variable_ptr, value, IS_CV); goto exit; } @@ -352,6 +353,8 @@ found: } } ``` +首先与读取属性的操作相同:先找到zend_property_info,判断其可见性,然后根据offset取到具体的属性值,最后对其进行赋值修改。 + > __Note:__ 属性读写操作的函数中有一个cache_slot的参数,它的作用涉及PHP的一个缓存机制:运行时缓存,后面会单独介绍。 #### 3.4.2.4 对象的复制 From 6c3a65169439bc0c8b25ed01abc0f86d4e810215 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Fri, 28 Apr 2017 10:21:18 +0800 Subject: [PATCH 172/379] update --- 3/zend_object.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/3/zend_object.md b/3/zend_object.md index 81e8259..fd768bd 100644 --- a/3/zend_object.md +++ b/3/zend_object.md @@ -302,6 +302,8 @@ zval *zend_std_read_property(zval *object, zval *member, int type, void **cache_ > ***public function __get($var) { return $this->$var; }*** > > 这种情况是调用__get()时又访问了一个不存在的属性,也就是会在__get()方法中递归调用,如果不对请求的$var作判断则将一直递归下去,所以在调用__get()前首先会判断当前$var是不是已经在__get()中了,如果是则不会再调用__get(),否则会把$var作为key插入那个HashTable,然后将哈希值设置为:*guard |= IN_ISSET,调用完__get()再把哈希值设置为:*guard &= ~IN_ISSET。 +> +> 这个HashTable不仅仅是给__get()用的,其它魔术方法也会用到,所以其哈希值类型是zend_long,不同的魔术方法占不同的bit位;其次,并不是所有的对象都会额外分配这个HashTable,在对象创建时会根据***zend_class_entry.ce_flags***是否包含***ZEND_ACC_USE_GUARDS***确定是否分配,在类编译时如果发现定义了__get()、__set()、__unset()、__isset()方法则会将ce_flags打上这个掩码。 __(2)设置属性:__ From 24fb9c875ed5cea231d48cca9183e80ac948e5bf Mon Sep 17 00:00:00 2001 From: qinpeng Date: Fri, 28 Apr 2017 10:22:59 +0800 Subject: [PATCH 173/379] update --- 3/zend_object.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3/zend_object.md b/3/zend_object.md index fd768bd..e5e83e5 100644 --- a/3/zend_object.md +++ b/3/zend_object.md @@ -303,7 +303,7 @@ zval *zend_std_read_property(zval *object, zval *member, int type, void **cache_ > > 这种情况是调用__get()时又访问了一个不存在的属性,也就是会在__get()方法中递归调用,如果不对请求的$var作判断则将一直递归下去,所以在调用__get()前首先会判断当前$var是不是已经在__get()中了,如果是则不会再调用__get(),否则会把$var作为key插入那个HashTable,然后将哈希值设置为:*guard |= IN_ISSET,调用完__get()再把哈希值设置为:*guard &= ~IN_ISSET。 > -> 这个HashTable不仅仅是给__get()用的,其它魔术方法也会用到,所以其哈希值类型是zend_long,不同的魔术方法占不同的bit位;其次,并不是所有的对象都会额外分配这个HashTable,在对象创建时会根据***zend_class_entry.ce_flags***是否包含***ZEND_ACC_USE_GUARDS***确定是否分配,在类编译时如果发现定义了__get()、__set()、__unset()、__isset()方法则会将ce_flags打上这个掩码。 +> 这个HashTable不仅仅是给__get()用的,其它魔术方法也会用到,所以其哈希值类型是zend_long,不同的魔术方法占不同的bit位;其次,并不是所有的对象都会额外分配这个HashTable,在对象创建时会根据 ***zend_class_entry.ce_flags*** 是否包含 ***ZEND_ACC_USE_GUARDS*** 确定是否分配,在类编译时如果发现定义了__get()、__set()、__unset()、__isset()方法则会将ce_flags打上这个掩码。 __(2)设置属性:__ From 2f1b01c3e35e1e4e8c0d844ae32480f191e179a3 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Fri, 28 Apr 2017 11:04:15 +0800 Subject: [PATCH 174/379] finish gc --- 3/zend_prop.md | 2 ++ 5/gc.md | 27 ++++++++++++++++++++++++++- 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/3/zend_prop.md b/3/zend_prop.md index f2efa12..61caf03 100644 --- a/3/zend_prop.md +++ b/3/zend_prop.md @@ -76,6 +76,8 @@ found: ![](../img/zend_dy_prop.png) > 这里不清楚将原有属性也插入properties的用意,已知用到的一个地方是在GC垃圾回收获取对象所有属性时(zend_std_get_gc()),如果有动态属性则直接返回properties给GC遍历,假如不把普通的显式定义的属性"拷贝"进来则需要返回、遍历两个数组。 +> +> 另外一个地方需要注意,把原属性"转移"到properties并不仅仅是创建动态属性时触发的,调用对象的get_properties(即:zend_std_get_properties())也会这么处理,比如将一个object转为array时就会触发这个动作: $arr = (array)$object; 成员属性的读取通过`zend_object->handlers->read_property`(默认zend_std_read_property())函数完成,动态属性的查找过程实际与`write_property`中相同: ```c diff --git a/5/gc.md b/5/gc.md index 4010dd7..b41d153 100644 --- a/5/gc.md +++ b/5/gc.md @@ -240,5 +240,30 @@ ZEND_API int zend_gc_collect_cycles(void) ... } ``` -各步骤具体的过程不再详细介绍, +各步骤具体的操作不再详细展开,这里单独说明下value成员的遍历,array比较好理解,所有成员都在arData数组中,直接遍历arData即可,如果各元素仍是array、object或者引用则一直递归进行深度优先遍历;object的成员指的成员属性(不包括静态属性、常量,它们属于类而不属于对象),前面介绍对象的实现时曾说过,成员属性除了明确的在类中定义的那些外还可以动态创建,动态属性保存于zend_obejct->properties哈希表中,普通属性保存于zend_object.properties_table数组中,这样以来object的成员就分散在两个位置,那么遍历时是分别遍历吗?答案是否定的。 +实际前面已经简单提过,在创建动态属性时会把全部普通属性也加到zend_obejct->properties哈希表中,指向原zend_object.properties_table中的属性,这样一来GC遍历object的成员时就可以像array那样遍历zend_obejct->properties即可,GC获取object成员的操作由get_gc(即:zend_std_get_gc())完成: +```c +ZEND_API HashTable *zend_std_get_gc(zval *object, zval **table, int *n) +{ + if (Z_OBJ_HANDLER_P(object, get_properties) != zend_std_get_properties) { + *table = NULL; + *n = 0; + return Z_OBJ_HANDLER_P(object, get_properties)(object); + } else { + zend_object *zobj = Z_OBJ_P(object); + + if (zobj->properties) { + //有动态属性 + *table = NULL; + *n = 0; + return zobj->properties; + } else { + //没有定义过动态属性,返回数组 + *table = zobj->properties_table; + *n = zobj->ce->default_properties_count; + return NULL; + } + } +} +``` From 32b5e1bb5bd86d0b6e5a45b87174f317113d9ab5 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Fri, 28 Apr 2017 14:38:35 +0800 Subject: [PATCH 175/379] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E7=AB=A0=E8=8A=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 2c7b453..c63c720 100644 --- a/README.md +++ b/README.md @@ -48,8 +48,20 @@ * [6.1 什么是线程安全](6/ts.md) * [6.2 线程安全资源管理器](6/ts.md) * 第7章 扩展开发 - * 7.1 扩展的构成 + * 7.1 扩展的构成及编译 + * 7.1.1 扩展能做什么 + * 7.1.2 扩展的组成结构 + * 7.1.3 ext_skel工具 + * 7.1.4 编译及安装 * [7.2 扩展加载过程](7/extension_start.md) + * 7.3 变量的操作 + * 7.4 函数的操作 + * 7.4.1 扩展中调用自定义函数 + * 7.4.2 创建内部函数 + * 7.5 面向对象 + * 7.5.1 扩展中创建对象 + * 7.5.2 创建内部类 + * 7.6 资源类型 ## 反馈 [交流&吐槽](https://github.com/pangudashu/php7-internal/issues/3) [错误反馈](https://github.com/pangudashu/php7-internal/issues/2) From ba7091efd0ce810ad0da9b497a729e3f52dff6a8 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Fri, 28 Apr 2017 14:49:14 +0800 Subject: [PATCH 176/379] update --- README.md | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index c63c720..a5cffa2 100644 --- a/README.md +++ b/README.md @@ -54,14 +54,19 @@ * 7.1.3 ext_skel工具 * 7.1.4 编译及安装 * [7.2 扩展加载过程](7/extension_start.md) - * 7.3 变量的操作 - * 7.4 函数的操作 - * 7.4.1 扩展中调用自定义函数 - * 7.4.2 创建内部函数 - * 7.5 面向对象 - * 7.5.1 扩展中创建对象 - * 7.5.2 创建内部类 - * 7.6 资源类型 + * 7.3 ini配置 + * 7.4 变量的操作 + * 7.5 函数的操作 + * 7.5.1 扩展中调用自定义函数 + * 7.5.2 创建内部函数 + * 7.6 面向对象 + * 7.6.1 扩展中创建对象 + * 7.6.2 创建内部类 + * 7.7 资源类型 + * 7.8 经典扩展解析 + * 7.8.1 Yaf + * 7.8.2 Redis + * 7.8.3 Memcached ## 反馈 [交流&吐槽](https://github.com/pangudashu/php7-internal/issues/3) [错误反馈](https://github.com/pangudashu/php7-internal/issues/2) From d25e806ed7469583d8613db6c3b7a42cb39b99b9 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Fri, 28 Apr 2017 15:35:29 +0800 Subject: [PATCH 177/379] update --- 2/zval.md | 13 +++++++++++-- README.md | 9 ++++----- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/2/zval.md b/2/zval.md index 07c71ff..3807501 100644 --- a/2/zval.md +++ b/2/zval.md @@ -1,8 +1,17 @@ ## 2.1 变量的内部实现 -PHP变量实现的基础结构是`zval`,各种类型的实现均基于此结构实现,是PHP中最基础的一个结构,每个PHP变量都对应一个`zval`,下面就看下这个结构以及PHP变量的内存管理机制。 +变量是一个语言实现的基础,变量有两个组成部分:变量名、变量值,PHP中可以将其对应为:zval、zend_value,这两个概念一定要区分开,PHP中变量的内存是通过引用计数进行管理的,而且PHP7中引用计数是在zend_value而不是zval上,变量之间的传递、赋值通常也是针对zend_value。 -### 2.1.1 zval结构 +PHP中可以通过`$`关键词定义一个变量:`$a;`,在定义的同时可以进行初始化:`$a = "hi~";`,注意这实际是两步:定义、初始化,只定义一个变量也是可以的,可以不给它赋值,比如: +```php +$a; +$b = 1; +``` +这段代码在执行时会分配两个zval。 + +接下来我们具体看下变量的结构以及不同类型的实现。 + +### 2.1.1 变量的基础结构 ```c //zend_type.h typedef struct _zval_struct zval; diff --git a/README.md b/README.md index a5cffa2..d7a9ad3 100644 --- a/README.md +++ b/README.md @@ -35,11 +35,10 @@ * [3.4.7 类的自动加载](3/zend_autoload.md) * [3.5 运行时缓存](3/zend_runtime_cache.md) * [第4章 PHP基础语法实现](4/php_language.md) - * 4.1 变量 - * 4.2 运算符 - * 4.3 选择结构 - * 4.4 循环结构 - * 4.5 跳转语句 + * 4.1 运算符 + * 4.2 选择结构 + * 4.3 循环结构 + * 4.4 跳转语句 * 第5章 内存管理 * [5.1 Zend内存池](5/zend_alloc.md) * 5.2 引用计数 From f3ba7447d24ae107ddbc9067fd5d5739fc8fc3f8 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Fri, 28 Apr 2017 17:31:59 +0800 Subject: [PATCH 178/379] updaet --- 4/php_language.md | 41 ----------------------------------------- 4/variable.php | 9 --------- README.md | 2 +- 3 files changed, 1 insertion(+), 51 deletions(-) delete mode 100644 4/php_language.md delete mode 100644 4/variable.php diff --git a/4/php_language.md b/4/php_language.md deleted file mode 100644 index 49248db..0000000 --- a/4/php_language.md +++ /dev/null @@ -1,41 +0,0 @@ -# PHP语法实现 -写在前面: - -这一章是根据PHP语法的实现详细解析Zend内核的处理过程,即各个opcode的handler处理,比如变量的赋值、函数的调用……有些内容前会跟之前部分章节内容重复,这里将再从具体的操作总结性的分析下,相比《第3章 Zend虚拟机》的内容,这一章分析的内容更加具体,虽然可能没有太大意义,但可以帮助我们更好的了解PHP的实现。 - -本章内容主要涉及zend_vm_def.h、zend_vm_execute.h,其中zend_vm_execute.h是根据zend_vm_def.h的定义通过zend_vm_gen.php脚本生成的,所以开发者实际编写opcode的handler是在zend_vm_def.h中,但是为了更加直观的分析各handler的处理,我们将重点分析生成的zend_vm_execute.h,同时只分析常见的用法,也不会把所有情况统统分析一遍。 - -目录: - -## 1.变量 -### 1.1 变量的定义、赋值 -### 1.2 变量类型转换 - -## 2.运算符 -### 2.1 算数运算 -### 2.2 赋值运算 -### 2.3 比较运算 -### 2.4 逻辑运算 -### 2.5 位运算 - -## 3.选择结构 -### 3.1 if条件语句 -### 3.2 switch条件语句 - -## 4.循环结构 -### 4.1 for循环 -### 4.2 while循环 -### 4.3 foreach循环 - -## 5.跳转语句 - -## 6.函数 -### 6.1 函数定义 -### 6.2 函数调用 -### 6.3 函数返回值 - -## 7.文件加载 - -## 8.面向对象 - - diff --git a/4/variable.php b/4/variable.php deleted file mode 100644 index fc661cb..0000000 --- a/4/variable.php +++ /dev/null @@ -1,9 +0,0 @@ -## 4.1 变量 - -### 4.1.1 变量的赋值、销毁 -PHP变量定义:变量名 = 变量值,其中变量名有两种类型:CV($var_name)、VAR($$var_name),这里的CV、VAR等就是对应前面Zend编译过程中提到的那5种[__操作数类型__](../zend_compile.md#操作数类型)。 - - -### 4.1.2 变量类型转换 - - diff --git a/README.md b/README.md index d7a9ad3..d131e90 100644 --- a/README.md +++ b/README.md @@ -34,7 +34,7 @@ * 3.4.6 抽象类和接口 * [3.4.7 类的自动加载](3/zend_autoload.md) * [3.5 运行时缓存](3/zend_runtime_cache.md) -* [第4章 PHP基础语法实现](4/php_language.md) +* 第4章 PHP基础语法实现 * 4.1 运算符 * 4.2 选择结构 * 4.3 循环结构 From 9601729fb00ab51e51230045ba6fec935655bf65 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Fri, 28 Apr 2017 18:14:18 +0800 Subject: [PATCH 179/379] update --- 4/if.md | 22 ++++++++++++++++++++++ img/if.png | Bin 0 -> 14947 bytes 2 files changed, 22 insertions(+) create mode 100644 4/if.md create mode 100644 img/if.png diff --git a/4/if.md b/4/if.md new file mode 100644 index 0000000..6357519 --- /dev/null +++ b/4/if.md @@ -0,0 +1,22 @@ +## 4.2 选择结构 +程序并不都是顺序执行的,选择结构用于判断给定的条件,根据判断的结果来控制程序的流程。PHP中通过if、elseif、else和switch语句实现条件控制。这一节我们具体分析下这几条语句的执行过程。 + +### 4.2.1 if语句 +If语句用法: +```php +if(Condition1){ + Statement1; +}elseif(Condition2){ + Statement2; +}else{ + Statement3; +} +``` +各语句的条件可以有多个。 + +IF的语句有两部分组成:condition(条件)、statement(声明),多个else就会对应多组这样的组合,所以整体来看if语句编译后是这样的结构: + +![](../img/if.png) + + +### 4.2.2 switch语句 diff --git a/img/if.png b/img/if.png new file mode 100644 index 0000000000000000000000000000000000000000..a4b8d7276aba0bde128cdf6aab229d3338ed7de1 GIT binary patch literal 14947 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 Date: Fri, 28 Apr 2017 18:30:20 +0800 Subject: [PATCH 180/379] add img --- 4/if.md | 1 + img/if_run.png | Bin 0 -> 30042 bytes 2 files changed, 1 insertion(+) create mode 100644 img/if_run.png diff --git a/4/if.md b/4/if.md index 6357519..69f29d9 100644 --- a/4/if.md +++ b/4/if.md @@ -18,5 +18,6 @@ IF的语句有两部分组成:condition(条件)、statement(声明),多个el ![](../img/if.png) +![](../img/if_run.png) ### 4.2.2 switch语句 diff --git a/img/if_run.png b/img/if_run.png new file mode 100644 index 0000000000000000000000000000000000000000..ee62932b4390756501e8b4857fba27e298c357f4 GIT binary patch literal 30042 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≥d1+Oy#Q02bME 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 UwZ(26UX6-8l~R<<64&$mKZpctu>b%7 literal 0 HcmV?d00001 From e5e950d1118d57240f2f3f7c3ed107cce6d3f4e7 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Fri, 28 Apr 2017 18:32:09 +0800 Subject: [PATCH 181/379] update --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d131e90..936706d 100644 --- a/README.md +++ b/README.md @@ -36,7 +36,7 @@ * [3.5 运行时缓存](3/zend_runtime_cache.md) * 第4章 PHP基础语法实现 * 4.1 运算符 - * 4.2 选择结构 + * [4.2 选择结构](4/if.md) * 4.3 循环结构 * 4.4 跳转语句 * 第5章 内存管理 From 5581ad0870b1f49a8e331f89fdcb0addfa5e8c9c Mon Sep 17 00:00:00 2001 From: qinpeng Date: Sun, 30 Apr 2017 16:18:18 +0800 Subject: [PATCH 182/379] update --- 4/if.md | 21 ++++++++++++++++++++- img/ast_if.png | Bin 0 -> 43928 bytes 2 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 img/ast_if.png diff --git a/4/if.md b/4/if.md index 69f29d9..cb87b3a 100644 --- a/4/if.md +++ b/4/if.md @@ -14,7 +14,26 @@ if(Condition1){ ``` 各语句的条件可以有多个。 -IF的语句有两部分组成:condition(条件)、statement(声明),多个else就会对应多组这样的组合,所以整体来看if语句编译后是这样的结构: +IF语句有两部分组成:condition(条件)、statement(声明),每个if、elseif对应一组这样的组合,其中最后的else比较特殊,它没有条件,编译时也是按照这个逻辑编译为一组组的condition和statement,其具体的语法规则如下: +```c +if_stmt: + if_stmt_without_else %prec T_NOELSE { $$ = $1; } + | if_stmt_without_else T_ELSE statement + { $$ = zend_ast_list_add($1, zend_ast_create(ZEND_AST_IF_ELEM, NULL, $3)); } +; + +if_stmt_without_else: + T_IF '(' expr ')' statement { $$ = zend_ast_create_list(1, ZEND_AST_IF, + zend_ast_create(ZEND_AST_IF_ELEM, $3, $5)); } + | if_stmt_without_else T_ELSEIF '(' expr ')' statement + { $$ = zend_ast_list_add($1, zend_ast_create(ZEND_AST_IF_ELEM, $4, $6)); } +; +``` +从上面的语法规则可以看出,编译if语句时首先会创建一个`ZEND_AST_IF`的节点,这个节点是一个list,编译if、elseif、else时创建一个`ZEND_AST_IF_ELEM`的节点,这个节点中包含condition、statement两部分,然后把这个节点插入到`ZEND_AST_IF`下,最终生成的AST: + +![](../img/ast_if.png) + +所以整体来看if语句编译后是这样的结构: ![](../img/if.png) diff --git a/img/ast_if.png b/img/ast_if.png new file mode 100644 index 0000000000000000000000000000000000000000..e8f47a5ffed354b80a14d2d6da68030d61491ba2 GIT binary patch literal 43928 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 m{?CF;p)t{nHyHkVXqk Date: Sun, 30 Apr 2017 17:27:03 +0800 Subject: [PATCH 183/379] update --- 4/if.md | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/4/if.md b/4/if.md index cb87b3a..8dee9c7 100644 --- a/4/if.md +++ b/4/if.md @@ -14,7 +14,7 @@ if(Condition1){ ``` 各语句的条件可以有多个。 -IF语句有两部分组成:condition(条件)、statement(声明),每个if、elseif对应一组这样的组合,其中最后的else比较特殊,它没有条件,编译时也是按照这个逻辑编译为一组组的condition和statement,其具体的语法规则如下: +IF语句有两部分组成:condition(条件)、statement(声明),每个条件分支对应一组这样的组合,其中最后的else比较特殊,它没有条件,编译时也是按照这个逻辑编译为一组组的condition和statement,其具体的语法规则如下: ```c if_stmt: if_stmt_without_else %prec T_NOELSE { $$ = $1; } @@ -29,13 +29,20 @@ if_stmt_without_else: { $$ = zend_ast_list_add($1, zend_ast_create(ZEND_AST_IF_ELEM, $4, $6)); } ; ``` -从上面的语法规则可以看出,编译if语句时首先会创建一个`ZEND_AST_IF`的节点,这个节点是一个list,编译if、elseif、else时创建一个`ZEND_AST_IF_ELEM`的节点,这个节点中包含condition、statement两部分,然后把这个节点插入到`ZEND_AST_IF`下,最终生成的AST: +从上面的语法规则可以看出,编译if语句时首先会创建一个`ZEND_AST_IF`的节点,这个节点是一个list,用于保存各个分支的condition、statement,编译每个分支时将创建一个`ZEND_AST_IF_ELEM`的节点,它有两个子节点,分别用来记录:condition、statement,然后把这个节点插入到`ZEND_AST_IF`下,最终生成的AST: ![](../img/ast_if.png) -所以整体来看if语句编译后是这样的结构: +编译opcode时顺序编译每个分支的condition、statement即可,编译过程大致如下: -![](../img/if.png) +* (1)编译当前分支的condition语句,这里可能会有多个条件,但最终会归并为一个true/false的结果; +* (2)编译完condition后编译一条ZEND_JMPZ的opcode,这条opcode用来判断当前condition最终为true还是false,如果当前condition成立直接继续执行本组statement即可,无需进行跳转,但是如果不成立就需要跳过本组的statement,所以这条opcode还需要知道该往下跳过多少条opcode,而跳过的这些opcode就是本组的statement,因此这个值需要在编译完本组statement后才能确定,现在还无法确定; +* (3)编译当前分支的statement列表,其节点类型ZEND_AST_STMT_LIST,就是普通语句的编译; +* (4)编译完statement后编译一条ZEND_JMP的opcode,这条opcode是当condition成立执行完本组statement时跳出if的,因为当前分支既然条件成立就不需要再跳到其他分支,执行完当前分支的statement后将直接跳出if,所以ZEND_JMP需要知道该往下跳过多少opcode,而跳过的这些opcode是后面所有分支的opcode数,只有编译完全部分支后才能确定; +* (5)编译完statement后再设置步骤(2)中条件不成立时ZEND_JMPZ应该跳过的opcode数; +* (6)重复上面的过程依次编译后面的condition、statement,编译完全部分支后再设置各分支在步骤(4)中ZEND_JMP跳出if的opcode位置。 + +具体的编译过程在`zend_compile_if()`中,过程比较清晰,这里不再展开。最终if语句编译后基本是这样的结构: ![](../img/if_run.png) From a0fa47ff1ac25465eaec165607c1b01163659293 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Sun, 30 Apr 2017 17:51:22 +0800 Subject: [PATCH 184/379] finish if --- 4/if.md | 67 +++++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 58 insertions(+), 9 deletions(-) diff --git a/4/if.md b/4/if.md index 8dee9c7..eea9484 100644 --- a/4/if.md +++ b/4/if.md @@ -12,8 +12,6 @@ if(Condition1){ Statement3; } ``` -各语句的条件可以有多个。 - IF语句有两部分组成:condition(条件)、statement(声明),每个条件分支对应一组这样的组合,其中最后的else比较特殊,它没有条件,编译时也是按照这个逻辑编译为一组组的condition和statement,其具体的语法规则如下: ```c if_stmt: @@ -35,15 +33,66 @@ if_stmt_without_else: 编译opcode时顺序编译每个分支的condition、statement即可,编译过程大致如下: -* (1)编译当前分支的condition语句,这里可能会有多个条件,但最终会归并为一个true/false的结果; -* (2)编译完condition后编译一条ZEND_JMPZ的opcode,这条opcode用来判断当前condition最终为true还是false,如果当前condition成立直接继续执行本组statement即可,无需进行跳转,但是如果不成立就需要跳过本组的statement,所以这条opcode还需要知道该往下跳过多少条opcode,而跳过的这些opcode就是本组的statement,因此这个值需要在编译完本组statement后才能确定,现在还无法确定; -* (3)编译当前分支的statement列表,其节点类型ZEND_AST_STMT_LIST,就是普通语句的编译; -* (4)编译完statement后编译一条ZEND_JMP的opcode,这条opcode是当condition成立执行完本组statement时跳出if的,因为当前分支既然条件成立就不需要再跳到其他分支,执行完当前分支的statement后将直接跳出if,所以ZEND_JMP需要知道该往下跳过多少opcode,而跳过的这些opcode是后面所有分支的opcode数,只有编译完全部分支后才能确定; -* (5)编译完statement后再设置步骤(2)中条件不成立时ZEND_JMPZ应该跳过的opcode数; -* (6)重复上面的过程依次编译后面的condition、statement,编译完全部分支后再设置各分支在步骤(4)中ZEND_JMP跳出if的opcode位置。 +* __(1)__ 编译当前分支的condition语句,这里可能会有多个条件,但最终会归并为一个true/false的结果; +* __(2)__ 编译完condition后编译一条ZEND_JMPZ的opcode,这条opcode用来判断当前condition最终为true还是false,如果当前condition成立直接继续执行本组statement即可,无需进行跳转,但是如果不成立就需要跳过本组的statement,所以这条opcode还需要知道该往下跳过多少条opcode,而跳过的这些opcode就是本组的statement,因此这个值需要在编译完本组statement后才能确定,现在还无法确定; +* __(3)__ 编译当前分支的statement列表,其节点类型ZEND_AST_STMT_LIST,就是普通语句的编译; +* __(4)__ 编译完statement后编译一条ZEND_JMP的opcode,这条opcode是当condition成立执行完本组statement时跳出if的,因为当前分支既然条件成立就不需要再跳到其他分支,执行完当前分支的statement后将直接跳出if,所以ZEND_JMP需要知道该往下跳过多少opcode,而跳过的这些opcode是后面所有分支的opcode数,只有编译完全部分支后才能确定; +* __(5)__ 编译完statement后再设置步骤(2)中条件不成立时ZEND_JMPZ应该跳过的opcode数; +* __(6)__ 重复上面的过程依次编译后面的condition、statement,编译完全部分支后再设置各分支在步骤(4)中ZEND_JMP跳出if的opcode位置。 + +具体的编译过程在`zend_compile_if()`中,过程比较清晰: +```c +void zend_compile_if(zend_ast *ast) +{ + zend_ast_list *list = zend_ast_get_list(ast); + uint32_t i; + uint32_t *jmp_opnums = NULL; -具体的编译过程在`zend_compile_if()`中,过程比较清晰,这里不再展开。最终if语句编译后基本是这样的结构: + //用来保存每个分支在步骤(4)中的ZEND_JMP opcode + if (list->children > 1) { + jmp_opnums = safe_emalloc(sizeof(uint32_t), list->children - 1, 0); + } + //依次编译各个分支 + for (i = 0; i < list->children; ++i) { + zend_ast *elem_ast = list->child[i]; + zend_ast *cond_ast = elem_ast->child[0]; //条件 + zend_ast *stmt_ast = elem_ast->child[1]; //声明 + + znode cond_node; + uint32_t opnum_jmpz; + if (cond_ast) { + //编译condition + zend_compile_expr(&cond_node, cond_ast); + //编译condition跳转opcode:ZEND_JMPZ + opnum_jmpz = zend_emit_cond_jump(ZEND_JMPZ, &cond_node, 0); + } + //编译statement + zend_compile_stmt(stmt_ast); + //编译statement执行完后跳出if的opcode:ZEND_JMP(最后一个分支无需这条opcode) + if (i != list->children - 1) { + jmp_opnums[i] = zend_emit_jump(0); + } + if (cond_ast) { + //设置ZEND_JMPZ跳过opcode数 + zend_update_jump_target_to_next(opnum_jmpz); + } + } + + if (list->children > 1) { + //设置前面各分支statement执行完后应跳转的位置 + for (i = 0; i < list->children - 1; ++i) { + zend_update_jump_target_to_next(jmp_opnums[i]); //设置每组stmt最后一条jmp跳转为if外 + } + efree(jmp_opnums); + } +} +``` +最终if语句编译后基本是这样的结构: ![](../img/if_run.png) +执行时依次判断各分支条件是否成立,成立则执行当前分支statement,执行完后跳到if外语句;不成立则调到下一分支继续判断是否成立,以此类推。不管各分支条件有几个,其最终都会归并为一个结果,也就是每个分支只需要判断最终的条件值是否为true即可,而多个条件计算得到最终值的过程就是普通的表达式运算。 + +> __Note:__ 注意elseif与else if,上面介绍的是elseif的编译,而else if则实际相当于嵌套了一个if,也就是说一个if的分支中包含了另外一个if,在编译、执行的过程中是有差别的。 + ### 4.2.2 switch语句 From 4c439b2c2d7ba6404051d4d108b6e4951c5d07e2 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Sun, 30 Apr 2017 17:52:26 +0800 Subject: [PATCH 185/379] finish if --- 4/if.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/4/if.md b/4/if.md index eea9484..5bc7ab2 100644 --- a/4/if.md +++ b/4/if.md @@ -91,7 +91,7 @@ void zend_compile_if(zend_ast *ast) ![](../img/if_run.png) -执行时依次判断各分支条件是否成立,成立则执行当前分支statement,执行完后跳到if外语句;不成立则调到下一分支继续判断是否成立,以此类推。不管各分支条件有几个,其最终都会归并为一个结果,也就是每个分支只需要判断最终的条件值是否为true即可,而多个条件计算得到最终值的过程就是普通的表达式运算。 +执行时依次判断各分支条件是否成立,成立则执行当前分支statement,执行完后跳到if外语句;不成立则调到下一分支继续判断是否成立,以此类推。不管各分支条件有几个,其最终都会归并为一个结果,也就是每个分支只需要判断最终的条件值是否为true即可,而多个条件计算得到最终值的过程就是普通的逻辑运算。 > __Note:__ 注意elseif与else if,上面介绍的是elseif的编译,而else if则实际相当于嵌套了一个if,也就是说一个if的分支中包含了另外一个if,在编译、执行的过程中是有差别的。 From 2529ccafb13ef003c457bb52d9b6d58f312e2d60 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Sun, 30 Apr 2017 20:11:21 +0800 Subject: [PATCH 186/379] update --- 4/if.md | 54 ++++++++++++++++++++++++++++++++++++++++++++- img/ast_switch.png | Bin 0 -> 52714 bytes 2 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 img/ast_switch.png diff --git a/4/if.md b/4/if.md index 5bc7ab2..0223a4b 100644 --- a/4/if.md +++ b/4/if.md @@ -93,6 +93,58 @@ void zend_compile_if(zend_ast *ast) 执行时依次判断各分支条件是否成立,成立则执行当前分支statement,执行完后跳到if外语句;不成立则调到下一分支继续判断是否成立,以此类推。不管各分支条件有几个,其最终都会归并为一个结果,也就是每个分支只需要判断最终的条件值是否为true即可,而多个条件计算得到最终值的过程就是普通的逻辑运算。 -> __Note:__ 注意elseif与else if,上面介绍的是elseif的编译,而else if则实际相当于嵌套了一个if,也就是说一个if的分支中包含了另外一个if,在编译、执行的过程中是有差别的。 +> __Note:__ 注意elseif与else if,上面介绍的是elseif的编译,而else if则实际相当于嵌套了一个if,也就是说一个if的分支中包含了另外一个if,在编译、执行的过程中这两个是有差别的。 ### 4.2.2 switch语句 +switch语句与if类似,都是条件语句,很多时候需要将一个变量或者表达式与不同的值进行比较,根据不同的值执行不同的代码,这种场景下用if、switch都可以实现,但switch相对更加直观。 + +switch语法: +```php +switch(expression){ + case value1: + statement1; + case value2: + statement2; + ... + default: + statementn; +} +``` +这里并没有将break加入到switch的语法中,因为严格意义上break并不是switch的一部分,break属于另外一类单独的语法:中断语法,PHP中如果没有在switch中加break则执行时会从命中的那个case开始一直执行到结束,这与很多其它的语言不同(比如:golang)。 + +从switch的语法可以看出,switch主要包含两部分:expression、case list,case list包含多个case,每个case包含value、statement两部分。expression是一个表达式,但它将在case对比前执行,所以switch最终执行时就是拿expression的值逐个与case的value比较,如果相等则从命中case的statement开始向下执行。 + +下面看下switch的语法规则: +```c +statement: + ... + | T_SWITCH '(' expr ')' switch_case_list { $$ = zend_ast_create(ZEND_AST_SWITCH, $3, $5); } + ... +; + +switch_case_list: + '{' case_list '}' { $$ = $2; } + | '{' ';' case_list '}' { $$ = $3; } + | ':' case_list T_ENDSWITCH ';' { $$ = $2; } + | ':' ';' case_list T_ENDSWITCH ';' { $$ = $3; } +; + +case_list: + /* empty */ { $$ = zend_ast_create_list(0, ZEND_AST_SWITCH_LIST); } + | case_list T_CASE expr case_separator inner_statement_list + { $$ = zend_ast_list_add($1, zend_ast_create(ZEND_AST_SWITCH_CASE, $3, $5)); } + | case_list T_DEFAULT case_separator inner_statement_list + { $$ = zend_ast_list_add($1, zend_ast_create(ZEND_AST_SWITCH_CASE, NULL, $4)); } +; + +case_separator: + ':' + | ';' +; +``` +从语法解析规则可以看出,switch最终被解析为一个`ZEND_AST_SWITCH`节点,这个节点主要包含两个子节点:expression、case list,其中expression节点比较简单,case list节点对应一个`ZEND_AST_SWITCH_LIST`节点,这个节点是一个list,有多个case子节点,每个case节点对应一个`ZEND_AST_SWITCH_CASE`节点,包括value(或expr)、statement两个子节点,生成的AST如下: + +![](../img/ast_switch.png) + + + diff --git a/img/ast_switch.png b/img/ast_switch.png new file mode 100644 index 0000000000000000000000000000000000000000..d92fb965da89fc1050c08331a8f05f4b22bea315 GIT binary patch literal 52714 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%0Aw=HRK>c=)M-J+DmOP5a2o;T2aqmG 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 RCkXs|^IA!&RKh6e{{Z96*@^%F literal 0 HcmV?d00001 From eb8f6ed238cc219a261d5adad4655d190d80f467 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Sun, 30 Apr 2017 20:56:02 +0800 Subject: [PATCH 187/379] update --- 4/if.md | 9 +++++++++ img/switch_run.png | Bin 0 -> 21318 bytes 2 files changed, 9 insertions(+) create mode 100644 img/switch_run.png diff --git a/4/if.md b/4/if.md index 0223a4b..14831a1 100644 --- a/4/if.md +++ b/4/if.md @@ -146,5 +146,14 @@ case_separator: ![](../img/ast_switch.png) +与if不同,switch不会像if那样依次把每个分支编译为一组组的condition、statement,而是会先编译全部case的value表达式,再编译全部case的statement,编译过程大致如下: + +* (1)首先编译expression,其最终将得到一个固定的value; +* (2)依次编译每个case的value,如果value是一个表达式则编译expression,与(1)相同,执行时其最终也是一个固定的value,每个case编译一条ZEND_CASE的opcode,除了这条opcode还会编译出一条ZEND_JMPNZ的opcode,这条opcode用来跳到当前case的statement的开始位置,但是statement在这时还未编译,所以ZEND_JMPNZ的跳转值暂不确定; +* (3)编译完全部case的value后接着从头开始编译每个case的statement,编译前首先设置步骤(2)中ZEND_JMPNZ的跳转值为当前statement起始位置。 + +具体编译过程在`zend_compile_switch()`中,这里不再展开,编译后的基本结构如下: + +![](../img/switch_run.png) diff --git a/img/switch_run.png b/img/switch_run.png new file mode 100644 index 0000000000000000000000000000000000000000..633cbb9e454a4a339181c4f958f44d53700372b5 GIT binary patch literal 21318 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 Date: Sun, 30 Apr 2017 21:08:29 +0800 Subject: [PATCH 188/379] update --- 4/if.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/4/if.md b/4/if.md index 14831a1..003a703 100644 --- a/4/if.md +++ b/4/if.md @@ -156,4 +156,13 @@ case_separator: ![](../img/switch_run.png) +执行时首先如果switch的是一个表达式则会首先执行表达式的语句,然后再拿最终的结果逐个与case的值比较,如果case也是一个表达式则也先执行表达式,执行完再与switch的值比较,比较结果如果为true则跳到当前case的statement位置开始顺序执行,如果结果为false则继续向下执行,与下一个case比较,以此类推。 + +> __Note:__ +> +> __(1)__ case不管是表达式还是固定的值其最终比较时是一样的,如果是表达式则将其执行完以后再作比较,也就是说switch并不支持case多个值的用法,比如:case value1 || value2 : statement,这么写首先是会执行(value1 || value2),然后把结果与switch的值比较,并不是指switch的值等于value1或value2,这个地方一定要注意,如果想命中多个value只能写到不同case下 +> +> __(2)__ switch的value与case的value比较用的是"==",而不是"===" + + From 8327ee40242a970199b44834a2422afb99ef3ab6 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Sun, 30 Apr 2017 21:10:28 +0800 Subject: [PATCH 189/379] update --- img/switch_run.png | Bin 21318 -> 21454 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/img/switch_run.png b/img/switch_run.png index 633cbb9e454a4a339181c4f958f44d53700372b5..130a6be168d21f1b999077e6f97f8d320766d52d 100644 GIT binary patch literal 21454 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 literal 21318 zcma&ObwCwC+c&%jk`e;a-O>WmEh(jRcS$PUAR!|(*t2KP%qY|M)5QHu(BcTjIa3SFP3-TjyB=aRz4EPVxSWa33 zdVqapwid*JBPj1>v>YJ_qZ{@O7te%23_%o-tb~}VTk39_uWsDh{lk*8;*D2qGPh)= z;sv{yvxY+qYW&&vbI|oIc$@zQ^6l1V4YR zxMEoK@ik!z!@DOpK0o;^mPA-vbuud=e%my=i;!Og^tD>gIRBpEKL2&&v2?KGEo91( z42fZNC%er~z>8ubY$2oK_){n%{r~vcmq987c?=8;yk)>m8(LXe!NJC^P$VzxT63tb zt`^`COHByA7GHJM(Mjnr+|(U4ufDlBh;k+{pl4-e<>9%AktQP)bbG%+7lJcMABeKG z68Pzpx~eJ{509t2JD&%0h$Q=5-S$>2%}+Z#<}?g^`P5(K@`0#Id^9M2*CgFg=L%FmUMtucDLk>*~0rF%c?pap`i) z{T8M09|fU^VHE@nbOuf^A^**0*GlRie9oP+xA~C**_c!wkM5CFIYr3Of3Id(#cp(p zDlTfDGxX7VExPT|J$(a~d|eVUL90L3n|NL1PZkw535hs3tUUV8rwq|{-^0IzBL!_? z>e{tv=MMinltlfxy2wXS5hLCi{{u>rNc<~;fe2zA=JIgsHC<56ZrZE8`lS+E|Nm1v zVY>Nj4FVF8j}&E(K)ZFBf+<*0A8WzgR&W7qg{sgq+SGI<{+xYu&WY`U& zL&E`GjiAf4;lS?8XyJYOnx}nn^ERKbX;J@_y9w6Kpp|cv>|bapxQfgs;ij_6oBQse z?t?dE_5`w%gOf-Yi&OX7ULtsg+@^J{~cT;ju15LTkY%?DF1q43>pAId|zcNWSFDB~M%kVL3 zuLVwme|?gAUfDB0(X zsm8Hd#c%3m%G=xITO8!nJ)#fYm8&S|j?P{(iPJp}#V@CzWntlwiu`+Uw@O`2nG6{w zyRC^-)!(2=!GCvm-sAW%$zw72&C&IuBX@7dT3uo+#nxxy-BiJCB@-@Mw-LDax=%5q zD5<57L_{thKh3`lFo2+mm>MU-r)hCTQ;rfJ(9sjUy@Pco3z%tH=(ri*OMe0-okTU%Sp%amBifsreba$L|6WtMj_<@MHTyr+1V|;PeP4eD{TkWr~DSOJE z`Grw4l~m5#Qgszf*>Rl2A#@B3Jk%gv)|n5lcA7y;kzK}4ZMIodjJ?JisDq=h`wjy$ zMdJp(Jh*?@O6>cLvF72{05AIHk1BifZ#xdowEc9IH98!~=6CvHhlIzt^^4}9CF0@G zuUA@&_@2V|$Pl7KQ{vFKxiAMu$JUk>=Jr7K;+F(Z6ciNH)YPV@r*qla+22sbxOsZQ zi|Xm6DHd2;Sv9#GWuKFw2Kjd_BL{VUSm}L?h*+h`oT5)|{Bjtd&iX^TfW(9&wYnV7 zLdzVH@ZDo&hrPaxh2ST2MNZ3JdjUl1Uor?*M4DRfB5m&U1gyg!EWr&5j?a^wY@W(H zKNqmGyR-Cp{L_g0sz#*y@F_9^RZPDnS3*JpBkt$zf2E;;w^DO=V?&zGDX^)j>GNmU z@%((cJmo@F#yJ}o8yg!ZC$2#iHZb#Fw&v^N_`}2fIW4T#sV|5N8;uIPW-fpK;no^@ ze`3yb>!U*cEoFZyU&-Bd>St9|xxH>XpY8RR99pwnFO%(GKOzXt%nag2!C@`6JEfDM zm)yEBbgd{*M1+R$5EC=gjmLSaRv1olg|sM=J#|n59jFF*`x;WmNv_(`&rxqd0vfH^j#xOSA8L`dkU1 zn);=Qow7K`$?cuNBEo9@)5G`e@7sR1Tn!XWCAQ5VhM)1UFH=_(8s?9S0~4f8CrATR6$1!K>rjaL6y~s zQ8M{57aq)Igvtc^bhk%PQBhHeEvVY$}Vm zGqiSmcXJ`~&A-F&TVY}4Pb)e!6`SUsUh`^jV`pt#z=W`~D?=Be0MimaGW~@8q+&VX zTS-YO*SpE%wIO^~T}>4g$0dFNmt6wz9Z4!svVAonP5u~4xszC2T(q7kd+fKnYjYy6 z6tb4dPFXfM5J&%#Xk>f3cr0Cr7z@j=FWr+t9-_cS9ViuT)U~TOI-`C6wA}g01!2?s zdsOKt|Br&V71Ql85fKp(77mU{+3S}tUn&V6N#KVfZSU;B`HgM3zLi;66>6!*!^hW9 zQ_GvSQe%9!PFaBm?memX8pw=TnD2k=|E7w0`jgh@b6A*w(Pz zOBC^`Z^hlsEtU5}_N%zBU%#%dn#R9=42fq&tIoFj`dV2PN##%m&DYtYAtPUo`QF1r zBp3zsz!Tp&r@C_nE!-1l|EYl#FV>WMF!y^8ycWJ6^x^}M4{l$bdbNTHcQ#tOl zXYaU(tQe(}WtcR|m>C)Qowrqk={#EXb0%&NyD+I@EHCzdLlv$E`Vmsq_DgM`mhj(4 z(*({uyd51+USSF$oMX{J(XaEcLuuI9lxVQCCQSK2LSzF^-A>xms^i36W+1Digo%Q( zd~#LZay;nGWV6r^)3?H6(3U#3fs^4RD~kf<=I0+@c?oBfD;IJRjVOuSNwmnB#`%-| z-PoYVMb**KdExY(5jLYr;~kw^Fjb<+V$##weD1EFQcJC_t=TR#9JM*)F>4;4%@~yH zw-P}KYzF!U1_%557?7;2EEt@iSd699@?82{E+at%Ja)R6(vlQyqyGMn!XMX@(4ocI zTCX+r9f^s^3wj_{dP`8f6&3xyH(!6CBVDNK;qGo`ZZ0Ju0f{<0pM80*0{vNNbcDO0 z!0}B}>@%-^{74L3?vF#`qmSPW*$w66)?fiWsjZj|j6`^-Sfd;R1!b=efcuC|@8%aM-4AYg|ee}8{&+h4f2xCl_Q%O1bOYJZ_h zfja07t7%5;9jCwDD2=-M>gqoyCu5_du}Dc3_z#TbJ`iJ}2K~Tb3ZaF~xz92nj7j|H zdW;78vcfM_g)%XYUWv|ifj>2cItKQl`#_wM@VljG8GBec$j{GjYT{o|>%j(Sp;`dX z?1^|u_e91vx!Zo@#_l5hTYj#u%m^U0=QmD7&d1118DIoS@2eHPz4W+>_l5etzbA4s zL-jwiyhncY5iHY|wc2Tl8=I945Xic|p2s`xe%bijBR3+lwYjNPY#VOSaC%i4mq9MT z=d-L_S{D;pEErO@bh6}gQ~GM);cn?c>pmvtdkoU=jF&_a&z?O)4a&~U^kbIFLc#Vm z99VpV92YcDSL+~ulUJ97S$BYooIaP_y0Z7;HoJ>k7y6znhL8H~*1bPQ zhQC_JXPO`9ZBK1M-eg?K`|_n)q3ZR`O zUuaA=q3p}~NeSOgjRpq>D69FHKHP?nbeZ(`zr7v9^bxC}d-#J7jf+X=w-H>cZ}U5} zxlI($H9IgoYi6tZQj;|MEmy4^?t5SJ1xVuC(To^buB>hYzo)ljSvNXv%;Y=>YCBvK z#L)Ps=(LmhFdQ8nN##_QmF*8FbAo*8hmhw-Q3|{;PnL=hWSp|3YJ?dqI*_kUZPjR( zb{O*d-V3TN{`m33`K#E_g-3o8dGf4tQ0nhSl+enbF4ioZ7K-z+SHfBnF011cM>xH| z_1>62f^d@LLGJPcoAcwJLvsTWF$8besr7t-Pe$AX-jt6#P2qvWr3byL;STrZWtjGD??m*73VmmT|5YX#jI(4$m->dmN!5ymJ0&8FhoyrssIaW8EIT{9sp;$22u}}K0Rz~PmxNI+ zG9!ch>Y}KuOq~Ju$9W(LhBO1N@crcqY7i9@)6V)xis{ovT0nXDs5caZp`K9VXwZZ; zx3=2i_aa3II9xIui7FwZ-ri-?#SNIo=H0STh*lh>)j}0QJ2}TyE2NCkIL9HW{{bl5 zhvLT~Z2I@x+nB16ag~s$B!TX*c}FGDg*APPoEqb7jC#GtZE$^Q%&OzPfu}CgE~4oRO?WK z!~uHynv&vaaqB|wVb^W7^(lo%r>mfS{Avz>!t@OGgj9pp>wqhjXKVBz*S527r`GYE z86{c~`PFAJYh?B=_Eb%Ia?z(CK*6bM`}9~tqdnzF{d58Ork!AjfXi*Xc*r0!oqkZ{ zTkh)C&#?<76Jx$Q58|i6%gmjs+S*^!(iCV0Ksw09rOJRC>y2~})?wH`ILOGxh6G^* zQ{#nob#-~#H?)esIXr>hU;mgZou3jAAr`(1a^-Gwt*I#y^PEc*SZKNZt)MeB6j`s^ z{uI168EcYzTl&KpHmh59dEIBhARX8)9~KyPb0vmM4^&MLT6Q9zvPBrAHu!zg_=&#% z3NdA9s#K@`n5~(3>(q zMz$Y;t|3D@Ct%-FW4SmJuf}QKy1Bee_LMK+OFIGCxv|^q|6&w!fDXIR=9+|ByO_HY zcUHc?p>uSouR zupXlD#^a!Q`yV*zyA)9nB3XGjC3q;1eGDLqYGc&Fo1!dtZwMI`;|VIp?)V0I`7|67 zk`k6XM--Xp^&<=%041L%4uMrp4W}|SmBe9*2Q>B-M%w6XgL;`jL3v!>rXhB_z^=fb zp9gQfmTqt{u;_9o7!rpD6m`JT^x?w?JjHGRO&lE^wU`qms9ua=ol{uOYhbifB8#)N zvdDv+oFloUtSoZGyj-vO=P`2q@v%b{oFW(lJAQ5P=-!}eb`B>+@ zhJ_!HKdg)FeHz=7J8d;JITnGMSHIlx(25{Z9 zdJeRRd-xCy6*XimWk0n*-T2C!%uUm092sS>)qd2zn=k7FqqKS|^!-<@HA_2^1;zju z!Lw&(8!^tZ^=-D{CfT8$$=aJ9o*zn6(Zq6kzNDquauER<*LDc!n|d+G3jq+o=R?Fo zFrsnNk_U?{Sme5vHB%nN{{^uF!XhEDIU(2#(f{DMQx8BwvuoJtj`T{KY{-yUB72Nh zt0r?DA7$w4yhncN-R@IQTdSliNg-pZlizSNI*-Pt7PZ@`pm_J`_zU`Qdx_CZlqz!NMt=p^&ELpx}v=&SCtV| zHAvh@>AaV+^T(@tp8uf}XAP42QDe#OnXrsJ&gU#VCkJ2|bwfLaKVV$31khCU^hmYd z&v!kekw}t?AexR-4B_RsLVD3X_nm?czjL$`@C}clmEMRQBN5a3Nog|oZVVGZE>Blf zv&VSe09OL-!!25H)OcHPZN_sL59*1k@~_0z*VmJp)XtRZXsD{LE-z0= zrp?#e7poS{*LyaxWbZiK{IrEEd1_o4=xIgnH;Z(9exbq0(^*bkza+V=tSpz^>b$(5 zzLhlI51o^4>kCQdR_5zY>Cz}E>3e#5PS!`@{jRS)Ads=$ zobTyW7{WojOYOePok4tjeCx!+(=#*0s*G80Wb%DRMn)itxB)IA^mj56jGUZPv9?=) zK*n{!0r@mtMFx9J55wM`@8NpY+%8DPRn^tg1>KJ~GJFyJ5)$xEPytZtTPaj6>W38> zDxNo=k@iqR<${tC_c{? z2DxyH-S4JfzkY$tpc7Wap>aztT3Xs%e?VF_H#h4chEgCa%+48CX=FlM1p(|JmMG>- z;Ns(lNo0dwt2F6zvFqPBK|@0u_)-ein#RVtuC7-(6T5TO!DAabE+6FI3~;?KO&v1g z+2GNNH7`FS@9z6yluZ00=gVs|P+JEFhYfWaqUx%uSej&bh>fj$YpMWV)Y#bA%#60N z(4zc}e7D;7S_jtPw5jyjA!Fm}IcB`#u7vmYEl0h1a*5}=bB?!{N1-_M+h-nD%DpQ` z5Wx8LH8lWbGW`SU02e-ml$Diz?yok$EygzNSviW0jrHJd`NA{F#-qPyL@#6U3Bz-{ zb%fY*np z78Y)<dmQAiR0T!3isXK)t>=SlSC5jn%#Uk0@a^QY^+y#qpO`ZqYaJXx6LFgxn4@#j_|-SV|>J)!{{hbv)0zmOZUFk43Q{i}XRb?->ub8^Pp0y!7-1Wo4|? z)Lp;USKG++bQD*9QzK-d7t|#|qBPhacvH8xtzvfv5XVdXC|HB5(Qp7G8rB0vr={(w z-lXvgwlY&=O8XXtRR7uSM1Yo;mjST@ZZv=|>My%Dp9T8C>WvTh0x)h3tLGTwKkpt{ zQ`SkA|G{kLG+eqMhqb$mQa(LB9lVDbkBNt;zNKZMsE+G*JSQcWXdk`gN1#1*z6?Zx z5FUM$pn~(Oso@%q2y0-Nn3(AHdezix240e&dio&{aEYMsdGIQZxSzRl*G%q|&wJC1 z`klBD=VWJ(FPov1(a1ws`1pWq)MQRjE(9^F=CP7X)GKp-Egj(ygNB+N{tRFB)7#mB za%QcV+BJCV8zp(Skx%L_f%%wdu&T1sfh*wQ(IpN6Ch#9e$=%1}tS}IBoRE;>bh_}$ zZgJCGHHEXjuUjgEUnQpH^<*5Hcgsy2<8)#A=^q>3LyISscr!S35TFh~ga=R$bQec5 zh-9(T^yjo!wdewC8G-G)KAvOIJAw z0{9t_ugUW3TU&+d#UKF7)9n}votbioP`WWgB;~j39mhZ9hWZqX6j}6ZJ=6Mzmbu>5?*XQ7>p;MoHTp4RfTA~ z()7|krVhwHK>l-W@bax(96t|Es}iR}g!>NA-E%g1B0lWu9cLv|Q<}Ndc$>>7kX!bCf#BJZGWusV%#DSHpI@5>J3cWH zaEWRf8elG~R4RfIZ;A%*>+6f=$;9iHlqz`J$K~9|)Xt}WHPStRL$xu2u$d>>@(_Ih zhhu81gydJUw>6o|LtK;CVal)N+_ZL$z7_)y{W*9zt+gI8z$H_RZTm{&eI{zxvD=?~ zf1lG~>cRH`ZhE>2cWY;0=Yid3djY|f{{6+EfuioA?z&de(@3uLiLp z!#gD&kz|0M^d43(udXUJnU$23JlC@76XX(EK^V!-rXq`)0iodMPjkD8r8aM!Jmsgp zUH~RupY3dbJj(m}6vRqEOqM6fdi;+U00=XH3luP&ReXd4=A0(8x*M!COjxS^Q$ZNx z2Q9g{U%rg-&SQ2Jf9B(p8)gxu;p2E@aHgkP!S>Q(dL^LuEoLzKiQTw9q95n<(jz}h z^CxGjLubSnds$h_$3|w)p@k;rl*P((0<*WzArkcjP36YS%*>nD(0lt0vOML1m7^xb z!37*tG&I@2=2d81lE%h=_kTCTW#;Fvi`hClIJgOt&B4E5U|;}|yFZ4SK|b8S$2jO; zffH3!R0LAeT=Rl>uJYD({l49kTF;FFkKg1j*UqlwTo(J`p>g!gNf%#9`xaipBVjby zHv)z4-B!CjL#KJObD3jJ&93cS^D?J?5-FdYV`0|mkcm^oBpI`|V0%@z)%5l==e`#+_ zrX*o)^VZ_}%o7*7q;7z|lO4*;#NXZCl9}E|3+mz`24pogU4vl&i-g6+I?XPnq7+zR zJz%kNA##h#%r5Rn3|Tcj-JFOdj!^*=5!GzM)>VOZlfYhk=N(NUPiQ*vQ^HEagY-K% zlgE6Xj!J2QD?k!`zEr?l!N^Bz^nnEWF~g&Kb5ziLPr(UmhSd)bZ@GZF7c0MQRozAX zfNnl}g40`9OIT;_Gd}B>!~<4}9-{i@B&%L59g z#CMb+@lc7sSeRcr3^UJ5Fp-fdnyJck8?h4!RT|Fq_^x@6&fd9Rh?Te0vCE~q7^rQh zHKe0-d?fe!qNVEOmaMrgbXrI&w*o$DKtk-2a`Kl(gD;L z;QXQP$#SM*0-QcvGP1Ha3^dp%vg(vEGC=Fxo#vYh7p9@1;ozt`sh03lWmE$xuH%>x zAomLksHms_Lk@^wP!gH7IyX+5-^-jm1>S?XUIvlH+XiIms7DZmm7T}mh~vP%gB z4Dj;Loil2wa0oh{SBx133 z-h{aMH=I)ArSP4#IdC_)-Se}+2s40?GD0WU5&zmuTU#4oh%x*-Bm{({rC4g7mEotM z5>zoE9+vuZUOev*-ZNTowl*o}jFHq#f^XSq3WQ}pYmgo>8I=`nJaNs2;j4@ zkhOJmN?$YD!-F-Eh7Wi0B_Nyqr^VzkE`lh=e-{|qgM2`q&ZK&7ZEa1R+aiAxw}|!V#|+pO>lgRxeZq+PV`a$`%n&mCQY) zknuc-wV2gyY(NO+clw4e732g5j4z@Z`4)YipOf9jLunU#0ndsTrlzL{(x{0Gu_QKm zWMe)X?)kB?F-xw=7)i295?s2Jty->G@9oUT#Vrwl>w?~>sYy;5V#$dbZHG%PkxP%c zC%J3h-|GaaElOp*L54OTT$mZ;WehsR?WtvP%BHs7lk+=1L3|}8C8e&ee&DtQa&wkb zM^C5a+h>tvkKrk0nMpB%yC$}r_|qbX*7!Y`N5z3^^6uSp=oqN28bFqI!qP= zf<_yC$6`B;Nip-IMkHI!}|r3d4%Mr z-|%AinhYcuG-S?vgsD-Q8He+e20K1?$;>;Ey)oQzDJjHBbI39WCOk%;BO|3O0D5!j zuxr11`}XZiIUJOEcU zk?>+zft^%Fe^0LB=oGR&8IZ+sV6LJjd^#(YaR6RmKn-N|^g#}dEdYK9N+zpU#_#A|5gAQ z_C=EJ%#@3Gp4*6uih6tBm1tE1co)^D)9xdr)|dRj#$O{)_z5C>Q?hQ*K1+T}iy&E4 z-^$Twx=^#l7@6|73CmNDyL^Qd0DhV*o9%w{M@XsY>gpO8w0oRc#lNOaQ z|KM$ol(Sw|e!dh8`x3=U6GCo+=_85NaQ`{u-g*syBnyY*ZX6{nS}ImYX`^_Z4$q{q z?4_up(?yHXwo}7K}7x#VYktK=VdOffQ64v->gd>5T$G4sX$xb6Jn?D?8lm zO?p9`8!_-9Kv2*CHn_-Bc8|xDyk4ccl9G=h1SBK@7Xnr|m|ZXxE@whhPY)f4@8c6D zAK*ZD<~&OsY{UYDiz)YpC}0_^t&86ydl-X&hFwsGmb zyET-%7TAfsIm@}L`}#T$q~81~Im_Zqi}s)Ph$q~l{r&UJu9aiA&L=|X_vV)(C+!XSBc z^oVT26C&cWer08F#!D`)*fIe7k~OGb<}uB{{v_+Ct+S60GauGzu_T<1X3X7wL(0v? zIKNwp*3?;(+W-I=E%eW_PMJ)nhB=$RMoV_ z*sJ^bLVFJn_jRw^=TM;hlWQQL^}qE3&?koa3Odxk{wax4DJWdOzRNdIHIw1i$s}`m z`vsp4099myo89jpquf0_AV14qFM~2A04!%pJUv&MXMAp-0}JA(x^tB!RUS)XeA@2& zW4ZYh`<7C5U!M1WzSlScsb_VD1SQ)&bJ0;%KR4g!V@M3#~tZD;%TrRYQ6unkgTFQpwjhe z>H{U}Kal|r*v5z>q=LkcX4>!LN6dlorlh0n7LBq2I>G3{$a<-M@ZE&zf0 zf2CtU@3x2&SY+wCSnrODS?0MPKSp{a`ZLlMzdNKbab<{9al2ejHeHBmzvWuM_hABD zKEdbe*~`wGHd5Dz^Gox!C=o7i_ivXi*Yg-__4dCRN5^u=@NjW8&wzI&&V-$y$@2JQ zOr*Z9&coBQuczm&HDY#7PH|Du4=ZPN^@QMH>3R*o0)u(B`4j@_AJB;^D%gkmwwiv- z%#3|~X$^vOv+KdWyFIWu75Mi@Tbd8=_G_`xv%0;hy$$G@DZ4{}KuZ_uJCnEV;Y7JO zKQX>2msJgAw@Ko02CmJu+beB{V|@?xV28=iMF-0-x|?Rq>ABl4>S0C$$16+?BHxBd z86jo{hKeE`2bB_?NAU0hUjVi)oZbe4!BBaRaV0nu5D?JS*-2u@0JvXx2t*IrH9*1M z-`xQ7xbs9^X{kcagj2!+h>{sT*RZhe7`MJ|4mH@~+Kacm%i`wnUi^7fZR=n(L#fS?R$PppZ#TI(4Q8UYS*07UFa3J;)$ zZ`8RD0{d1X$b_1}T>%)TuI~JBxht0mM0bzV&9j}EzTVzPey{UDa)yF}^8ER8K(y@q zEG;fAr5$;0!U$})^z`&pRM`y;1p9?XNFdH|m&JSj`JE-AzSEIPYgNYJ)r+R`ih8uT zop?p$>!}of%lo#vwd;t#UF~C9-wM7VL5Kf~ex3R#ljTW!&pl5(eT4*tWE$Naiw4M9 zrS&RR>PZ`C+{acFZ!ih4_}E;`opcMUDvpblU#A1wgZ^`yH6^yu_BB!qXWbrqzj-zA z1eV&ay$8}V=m)sW?CigNwAJz+T<&ff)zp*$E8|WsGNh@!|y~WmaykDKNc3 zqBXKP6Tl{<#emz?+`Qy^>w-fEqi%YaF=YO^(51Tg=KH2NL*J=cEzTV45o}#DJ?qVHdDI(KA7#EwD(Z{$F=q2l& z@%tDxX7Gi8^>gm3?8Q{=k`JfwamZdm$jL47=_AjJeULc=F(gIModeokXjCbm;o;!{ zc_COxfbs09HyA$}`0=t=z~l$$b2z`-RyG@M0XjN!pr(+Kk%6%Ry-`ugfhF3MZ?k*C z@Rh!DZCxHMQBMFfq>85IWhTZR39H|hdDD6*z2L=j3}zfT@UtbpX>`Vw7m`sAK|=ov zjzwvxySp`%YggZfWmA{alp#Pzlb3yD%{R^-OwM`%=T$a$z)*q-HJ|T7|3&#jT@NID zpD`gj8y*Mo!!?Y8ug#Ue)5%2=WQKp*ZW*c2nYT3CCTo5@+OI2U$=KB;hk)N4XA78e zGsuaPTU9DOXXr`wCpzGRs?Ji*pJND$`0NVzz|CDN0Mq;4nafjmkApis6^oGln)(@+ z;}B}h?A%-gNLfV%=7Ss4C{!hiSTD%%dE^I_jz`d2^lS;tBKbiRfDanR11KsD!5E{* z6iBHz>5JUUZv4$m$5F^l6!H6~DPo;jMJg7_WzX^gM%v{i#(d7DA7kiOrq5rQw!KR6 zySntBVCKC39@vIkhqVr^WBetC{n~};jk{SxG~`F|5K@e4e#*k79cu^ z;&qL~+TfQjxMWfFz$gf+f}}>b26C##jr5h1tL`fWbN``4wvCgk|EO)NpZ}?Fz&t6O z(QeX*F&QeAlMHmij4=bC9Y*ze9<*LCleGWNcQActuvD4EzK8O66}U#lSrZfE<7;bb zKpQ2brHP+>0-{%6cQ@9|B=Fk+3`MS*{3Y?rm)+UQ9Iy<4W!1Qn00MSA2oiAJ2O8vU zky`OE>1;42`Tfn(0|vBOwg4DUdZlz-O--3=-4?eOM_ho{u>DmN`okRyb8ZLi=dWL{ z#pN(a`ArisJTZ=#qqS;+6vSV>awTWjulp676tXY|qVxpi1*P476{gGHW4{OQ@F~e! z+80lO$6ejK1Q_WO9_UwBR~c|WgA}%HJ=uY5*Zjo?UJ};C;%O^c_LSD9J(RlA`06(W zA8zQhKkTM3VIh-wY*GRqJUB92$z%)~`t!%IRNZrZn2`P{op{D)eX(7CQHu9P56i+K zLMuuA{M0Fq5){b(SiA3D0DuIvCLo0ZFW{5V2-|S|N*lb7qxK$^JIy;yD7I-xwc6hI zx9$)!2F896O@d40tqWsLAtq4OFM3co9UDo21s?GRIDU1oXHv67-9#v7M; zoNLun)XB%HfkvjLremJV`M~r36n9LnXvXmO-!u3@-Z^WeQL%3=EcfI6SJJyaW;lC#NIu z_yPyB_SnZ+Qtdi>;CxO@HXEm!16o4CoG_eBVI$Pt@%@aLd-^U7R)T6R;a%fOE z!HdqmzF@{0%C}FAQJnT-sjx%A-~{d!*=)hDWs@&YCCg!((ll=i0j{N@=3h_E3C-}m zZ`?rzy9$7<8u+Y5YESwA2dc(6y%Hs&sN6?YBR-?p!i*P2BMYR(_cpBW0ru9u-FWc1 zJFtI{Hh2J<6TBbLrJ|#wZxp-pl`=5?Ys%GXcuyH`ZwZzxK{9&~c7O=>D12cdE5YS_^1~HMQo_Q zKl4mGZ7U!-o$z~xX4J3NF^t9D;bHj`bP+`$H)pk7=~q!r99+#@dHLWIds4UrN`?Is zUbMA|g1dmrkB+$Of{v>^-tiKhS&FRYpW5mXgaQFyKQIP?k?Z5rrd*hNBdn+Q8%<;P8Oc4Z`RYdssFfPH?y*Bb3Jxq&@^nDA zJ4g$g{M>cd9WH2jUGWW|_iXiIV71jQ&9~r{xj2mlR|A_fU=-~O7M78ZZxdz6yS449 z2ZRDUS4BOPz#K~W53L)WlEM@>pv&+HGJ-B2*2Tw(S;q-uWLEd~SmFl2DT)O^D0KWp z)3UC~oA&)j6PFRkP1vcH$Cz<87BT|x00KK;@$}~&<7-{Tq%A@*U0ft&90=@a0-y;X zrhpFM7o)=q+e#XnB5F03^>bSi^WOKrUI<%S|IxNSRl>2fzt>rQUk zLL{;e4-Xd>7Jza6-EYp zBTJNk{rISK0%xfE$5E{FXujTOcGBTh>Al_jPfXyz_iFJpm}j$vuuha~g8QPuR;^~& zbx0J5&7Y4~FhNFgV7zF&BJa!s#R&~|O{7_ynari5rpJw|TVTH>$i+De_9cz zz0n(=-*n)eHO@Ay)C6l4aB|XM$LMhammS!7qpAvAFbUxH5Jmhve>bnqcibfuF7P)- zS`*3?_ViHse410@>f7LP6(zD$r-|Uv>T_O_q*HGPpR_2qglec<%m#hGz-NmmExx_K z@c?q#2cspuOMJhr!T9{SYU5Ln){b#?my)W=<<}!~j%Iy~&itf)vP}-Z>G>L=d~l($ z^k;OXueVE?D(z!k`MpdDFo5Z)sR0SZ%F2q08whk@>zRj#@YxR)Aipu=4aH(iTb%*mg@jIIdPT6! zwy3bW@K6a?%A?bNbyZz3mLaq!a(<;1^TL<%XPiR%FZhgg(BD2gz@-~aNx+gUsl zpP)ciqv_OV#6+yXVP-qdt%#QKcWbTEMwa8b?>L$WkiaXK2NOyZ>RLHlp|W^K%2c@| zhTDIo+qm-o+hf-R99_R?{?epRF;?BzEsH6=JvOz?z{qLsV4tI!r7e|CrxWQZ*$DK3|`&(-hKw->U zuId=afF7=AdaSiX?(Qc?XRrrywr{R6U?(%W%7F!8CT^y^&P(=9#hyKe{~O*y_P2nH zkdlTKct2o_+;Y+`J^u^1wc%Z`^G%cj=u&uJHF8mWe^@%)uS^fQ?mOLT-zTx0!=_Gso&m2xvplm<`Mn+3!#PR3 zRRIL~!Z?fn*@ik-X|39f3qjbUu;&7lKVbcFJZSOt<%UY+_01QnLrVhhR%U(deGbZr z=SwS(23OxK6L7xB{^}G?PlYMqY^~T`q6skwr*71IlmTvYfO$(x(JdUy{HuA}(;@(l zT(oHPnPd(#=Spj*}%>Hl2Rg+V&U{6cqZ_DHg!HFM^@1` ztOtyi**#!ny?8@x&ySSUJE_NMB{YsULlZ}L7hk6*n}tiju4ciNhZ+?56XT6syJ2M1 zRDL#Y4%sFfaEpK{{D%@q`+wzAgnOJ0w83suurwZ4w{%8T)khwYx4v-R3nt$kT`bJ> zNWmhJu~If!dE$|3W%np9YK)zyE(Jv%>|K3edCAG}p0SYI826y(uma<(F!3EY;hF{YXEOk*{@Ac_DcCp~5Z zTPv&Bp*3y^VI9~r0}#Y)KJ^$AM)U%9oHcQ0W5e}qTTQu4xsX-A1-N`uzJ3L{2TN2> zB`V;wODC94X}?MBVwA;KM}Sll#K37QKw+tA0y$I>Id=>(MXd5b=V)TIwg=&T=$XueCr=}!80Ia4kloS z2S)9iax`FAOZ(=adiE}&2d3A6UTxwOdMI2HIo*6nX?O_ z_Q}~lAhGbpC6$TnNDfV zrfZts!6cpdW@t}mRjma}7!CS#efbpZL^3uc3* zFZI{5DXN#@tKwgR`mb#IEe=J z(f|9bjsHAc!+&7;QQb!-WvoYwJ&qLMb^xGKwHTvs*Ya9r!#la%4bzv}HY`UP4n{J7 z{FziJx(yA;_HCQ-LlGKiVIsAj^)ja2a*_@0^uZ-H*DOrQJ+8n!NG1}nHP_sjkVrq@=Sfo^`I`I=k*2FLjx<3ET)$rAI zpR#E#7d`3Xcf%uhEv~&&$(@hP&bEl8^?qwJUvL9%9{OJMZpxAb-58ERp4(Vjz-TAo z!s3(k$df3>=T`;l^X#00MU~4AgH83|=(}2UI(E|Al4w=U8qpGEZ<9w;`!)10uN^3SMJt}pWU*ZAzCNJss+%WL<67ajBk7@yf?rl z9NmS9d2GHuBNK8;x;W0wqgPU=FLw)gVxsQG1=)b>ugS`BKC}s04s;4+UGICne?5QP&-2VP&vRe*{aZfYuac4FJo8d}cU){1 z_Ng<{3ynL>{V4^r@op;Bpz%U@x6QAX-Ih-_;DXkO-BOWaTdL~HjBnUm@##LB`ph9q zgc~my_POh*iS3igPRZuZMcFs3t@&ChitWp1%5FgJ^B z2)}OJElU*H`+k|Z?en>d3dqLrVHP%^qg*089KZ3ZM=Tj1Mww>yg z?gmo8PD6s!K}_T(`7~{zkd%6d1sCGWc5(7x2qjoLgyLM&>*ms zrhjsih`p5Saq~THDj-03i{cE!`ZYfIx>5p}YTFAMUf_{oCQSK=Ejr2?(bpoUnr|*b zav2-`$;TN&d?P|WxoCZ@Fe6tE?Q1sZsN_|Ot*7Uhrk1C5s`XCiDRQ{AZz&Y~>HX@e zs_^~t?8=Mds4+Y?i6Nz=jYMe-(b#g3jZ$r0x$LU?mp?!ydle|gr@JGCP}U zJcuLAeJq+(s3>y4mg`7BXm-E0_WW#bsd~^QVZ<_5c<>2_a&>*ce6C^F$?QS9*T>}3 z>km)2GP&k)5*W9wuJ{yjIA8{8a60@LB-DqownopAx}BGtEtrk5WMT2MF4+Oh?tRh| zA$OaWIrwsqU9;03rxg_9j56U3gGBb&G5*T@9bac0GtccYIRML>1BW(7rd80<|Ac#RE|O zhS&j&Ba)gSQ-zQ2FMjgcMS!`w{si3U@oB*+lnvNyQt(?<|sS2 zzyiM8>ENM5ha@DTvWK37?$L(G+WTeLb~S%8HB;-P;n7?D;g`R{#?dk9D{%McH=Trv zfc!G<5+zJ8UH@pcY8hTwXwNs>@9Xt~gULGGrE7f_Ii44@Ux$NO&Du|PuTUy!ECK3- z8OKYv%HWc9jsHqNi*@;tiYAQ?R<3u&;vv6+s!U1A64cXLnBLHuhgs<3qnz{P4TL?% zcG8n3FFP63<49gm$y#AVzNk!KbSSrOJ3*7lXzO^e z;enb-t|m=;`WTH~*SqnEOuo{tGr$hLS@r#WT|x6^Jo{U&j?Vn{lWWXHx$w%(3seYc zy(8XvTjvMGU9&Pb>h?1qY`82pU`p^`YpgNIo7t>E`lGGMy_%X@9idfKJzi1jUt_c0 z?Be99Q?vq2FDO*6Wur{onW)|Mj%9JLUq@+XO4VEEJ=Sl2h?o{MEa-b;O_ipi*P{o& z=?l*48jiX)G+}NSM7AVbnzSd1zRMq_*2k?h4yT{ya;J3-2mk! z$wN#4N|b7m(L(hVVuggCi=#9+%mBuWO-Z&fKJ)V|`ESQLUG6u`Tg+6}`z7B|X6Wt$*A4{PP4NIjx)D~Dvl zeMCuHGwITEcajeihE8Y^OV+twieqP*sk#33)#*vMh$*%i@vmi&hdPu6P2RZXTKoNA zPKUuGvY4xC+$E_zG)tLXV`me-y7L)@{O2B%kecWO3#+V0Ie0XOb13C8{b3P}^n!y_ z_`Si{xoou^%NRJg99&g2X@Tv3r)pO5_BJ6mqF5riX+cftFsy^=eYn;ZT=jTE)i{5~ zSR}&1>zna#N0uoQdRP7ZT)F7f(5WP4gd+IEAcp2b7>uZ4;!8P1twM~4YbkNqFC;j8 zOBG1XKQ8OcjCHkAs0^Y;DEv9T5S&`OR?Dow40HS=*P=V{=Fs)gb{)d%r1wbY(D>%t zMiHy#{-09{rAyvVH2!=ST}c`l7wkL}>O#Ozw@7Vo-zI}=Y0<7UH-K`pRWfU=Ya_-( z3puv$#;+#HBB+4jwMs$|(@$Jrf)Dx_fA*lho#I(}$qD=3^BpVA-^ik4jJ0z${MBXq z-g~w3RdHB)GO{tr@oFIrVMDrzHr46oRJXEue$2^bTToq@*Bn?~1l|24!*8)4j!_W`A=6oj5QkuruKM;*7m`Q5<|cT6eAf^J&Bn+p2iD zGrz!DwQI*AO>83spb-fni^uJAmKg5NoVl~xxG*^iF6 z*7T~OycZ^eD<@YUT0+rJBe)Yg0(<@RR3fz7)IamTL|Pw8y&I?ZF+9ukO@v||ry z!0SR{K!|4>2SMz?qIi)od7i}?cq_2%JkEX(Y-1C_`G;pA=V-%@RF;mM*7~yaZ$ND! z%iC9 Date: Sun, 30 Apr 2017 22:37:21 +0800 Subject: [PATCH 190/379] add while --- 4/if.md | 2 +- 4/loop.md | 56 ++++++++++++++++++++++++++++++++++++++++++++++ img/ast_while.png | Bin 0 -> 9581 bytes 3 files changed, 57 insertions(+), 1 deletion(-) create mode 100644 4/loop.md create mode 100644 img/ast_while.png diff --git a/4/if.md b/4/if.md index 003a703..b24f528 100644 --- a/4/if.md +++ b/4/if.md @@ -1,5 +1,5 @@ ## 4.2 选择结构 -程序并不都是顺序执行的,选择结构用于判断给定的条件,根据判断的结果来控制程序的流程。PHP中通过if、elseif、else和switch语句实现条件控制。这一节我们具体分析下这几条语句的执行过程。 +程序并不都是顺序执行的,选择结构用于判断给定的条件,根据判断的结果来控制程序的流程。PHP中通过if、elseif、else和switch语句实现条件控制。这一节我们就分析下PHP中两种条件语句的具体实现。 ### 4.2.1 if语句 If语句用法: diff --git a/4/loop.md b/4/loop.md new file mode 100644 index 0000000..7fd47fd --- /dev/null +++ b/4/loop.md @@ -0,0 +1,56 @@ +## 4.3 循环结构 +实际应用中有许多具有规律性的重复操作,因此在程序中就需要重复执行某些语句。循环结构是在一定条件下反复执行某段程序的流程结构,被反复执行的程序被称为循环体。循环语句是由循环体及循环的终止条件两部分组成的。 + +PHP中的循环结构有4种:while、for、foreach、do while,接下来我们分析下这几个结构的具体的实现。 + +### 4.3.1 while循环 +while循环的语法: +```php +while(expression) +{ + statement;//循环体 +} +``` +while的结构比较简单,由两部分组成:expression、statement,其中expression为循环判断条件,当expression为true时重复执行statement,具体的语法规则: +```c +statement: + ... + | T_WHILE '(' expr ')' while_statement { $$ = zend_ast_create(ZEND_AST_WHILE, $3, $5); } + ... +; + +while_statement: + statement { $$ = $1; } + | ':' inner_statement_list T_ENDWHILE ';' { $$ = $2; } +; +``` +从while语法规则可以看出,在解析时会创建一个`ZEND_AST_WHILE`节点,expression、statement分别保存在两个子节点中,其AST如下: + +![](../img/ast_while.png) + +while编译的过程也比较简单,编译过程大致如下: + +```c +void zend_compile_while(zend_ast *ast) +{ + zend_ast *cond_ast = ast->child[0]; + zend_ast *stmt_ast = ast->child[1]; + znode cond_node; + uint32_t opnum_start, opnum_jmp, opnum_cond; + + opnum_jmp = zend_emit_jump(0); + + zend_begin_loop(ZEND_NOP, NULL); + + opnum_start = get_next_op_number(CG(active_op_array)); + zend_compile_stmt(stmt_ast); + + opnum_cond = get_next_op_number(CG(active_op_array)); + zend_update_jump_target(opnum_jmp, opnum_cond); + zend_compile_expr(&cond_node, cond_ast); + + zend_emit_cond_jump(ZEND_JMPNZ, &cond_node, opnum_start); + + zend_end_loop(opnum_cond); +} +``` diff --git a/img/ast_while.png b/img/ast_while.png new file mode 100644 index 0000000000000000000000000000000000000000..419bf73826eaaf9b871d5e2116942a8145d35f40 GIT binary patch literal 9581 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 IsA16m0%(xM>;M1& literal 0 HcmV?d00001 From e14e527300f1b6aa4cd5ab7463075559a520c1d4 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Tue, 2 May 2017 17:05:33 +0800 Subject: [PATCH 191/379] add loop --- 4/loop.md | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/4/loop.md b/4/loop.md index 7fd47fd..6a2be1e 100644 --- a/4/loop.md +++ b/4/loop.md @@ -28,8 +28,13 @@ while_statement: ![](../img/ast_while.png) -while编译的过程也比较简单,编译过程大致如下: +while编译的过程也比较简单,比较特别的是while首先编译的是循环体,然后才是循环判断条件,更像是do while,编译过程大致如下: +* (1) 首先编译一条ZEND_JMP的opcode,这条opcode用来跳到循环判断条件expression的位置,由于while是先编译循环体再编译循环条件,所以此时还无法确定具体的跳转值; +* (2) 编译循环体statement;编译完成后更新步骤(1)中ZEND_JMP的跳转值; +* (3) 编译循环判断条件expression; +* (4) 编译一条ZEND_JMPNZ的opcode,这条opcode用于循环判断条件执行完以后跳到循环体的,如果循环条件成立则通过此opcode跳到循环体开始的位置,否则继续往下执行(即:跳出循环)。 +具体的编译过程: ```c void zend_compile_while(zend_ast *ast) { @@ -38,19 +43,23 @@ void zend_compile_while(zend_ast *ast) znode cond_node; uint32_t opnum_start, opnum_jmp, opnum_cond; + //(1)编译ZEND_JMP opnum_jmp = zend_emit_jump(0); - zend_begin_loop(ZEND_NOP, NULL); - + //(2)编译循环体statement,opnum_start为循环体起始位置 opnum_start = get_next_op_number(CG(active_op_array)); zend_compile_stmt(stmt_ast); + //设置ZEND_JMP opcode的跳转值 opnum_cond = get_next_op_number(CG(active_op_array)); zend_update_jump_target(opnum_jmp, opnum_cond); + + //(3)编译循环条件expression zend_compile_expr(&cond_node, cond_ast); + //(4)编译ZEND_JMPNZ,用于循环条件成立时跳回循环体开始位置:opnum_start zend_emit_cond_jump(ZEND_JMPNZ, &cond_node, opnum_start); - - zend_end_loop(opnum_cond); } ``` + + From c18b21b6270b6064083946d3b952e70321be4025 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Tue, 2 May 2017 17:45:04 +0800 Subject: [PATCH 192/379] finish while --- 4/loop.md | 24 ++++++++++++++++++++---- img/while_run.png | Bin 0 -> 20008 bytes 2 files changed, 20 insertions(+), 4 deletions(-) create mode 100644 img/while_run.png diff --git a/4/loop.md b/4/loop.md index 6a2be1e..1818faa 100644 --- a/4/loop.md +++ b/4/loop.md @@ -29,10 +29,10 @@ while_statement: ![](../img/ast_while.png) while编译的过程也比较简单,比较特别的是while首先编译的是循环体,然后才是循环判断条件,更像是do while,编译过程大致如下: -* (1) 首先编译一条ZEND_JMP的opcode,这条opcode用来跳到循环判断条件expression的位置,由于while是先编译循环体再编译循环条件,所以此时还无法确定具体的跳转值; -* (2) 编译循环体statement;编译完成后更新步骤(1)中ZEND_JMP的跳转值; -* (3) 编译循环判断条件expression; -* (4) 编译一条ZEND_JMPNZ的opcode,这条opcode用于循环判断条件执行完以后跳到循环体的,如果循环条件成立则通过此opcode跳到循环体开始的位置,否则继续往下执行(即:跳出循环)。 +* __(1)__ 首先编译一条ZEND_JMP的opcode,这条opcode用来跳到循环判断条件expression的位置,由于while是先编译循环体再编译循环条件,所以此时还无法确定具体的跳转值; +* __(2)__ 编译循环体statement;编译完成后更新步骤(1)中ZEND_JMP的跳转值; +* __(3)__ 编译循环判断条件expression; +* __(4)__ 编译一条ZEND_JMPNZ的opcode,这条opcode用于循环判断条件执行完以后跳到循环体的,如果循环条件成立则通过此opcode跳到循环体开始的位置,否则继续往下执行(即:跳出循环)。 具体的编译过程: ```c @@ -61,5 +61,21 @@ void zend_compile_while(zend_ast *ast) zend_emit_cond_jump(ZEND_JMPNZ, &cond_node, opnum_start); } ``` +编译后opcode整体如下: + +![](../img/while_run.png) + +运行时首先执行`ZEND_JMP`,跳到while条件expression处开始执行,然后由`ZEND_JMPNZ`对条件的执行结果进行判断,如果条件成立则跳到循环体statement起始位置开始执行,如果条件不成立则继续向下执行,跳出while,第一次循环执行以后将不再执行`ZEND_JMP`,后续循环只有靠`ZEND_JMPNZ`控制跳转,循环体执行完成后接着执行循环判断条件,进行下一轮循环的判断。 + +> __Note:__ 实际执行时可能会省略`ZEND_JMPNZ`这一步,这是因为很多while条件expression执行完以后会对下一条opcode进行判断,如果是`ZEND_JMPNZ`则直接根据条件成立与否进行快速跳转,不需要再由`ZEND_JMPNZ`判断,比如: +> +> $a = 123; +> while($a > 100){ +> echo "yes"; +> } +> `$a > 100`对应的opcode:ZEND_IS_SMALLER,执行时发现$a与100类型可以直接比较(都是long),则直接就能知道循环条件的判断结果,这种情况下将会判断下一条opcode是否为ZEND_JMPNZ,是的话直接设置下一条要执行的opcode,这样就不需要再单独执行依次ZEND_JMPNZ了。 +> +> 上面的例子如果`$a = '123';`就不会快速进行处理了,而是按照正常的逻辑调用ZEND_JMPNZ。 + diff --git a/img/while_run.png b/img/while_run.png new file mode 100644 index 0000000000000000000000000000000000000000..eb590f8ca6e46233b5e3d9b73d3e30f9be87fe76 GIT binary patch literal 20008 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 Date: Tue, 2 May 2017 18:55:46 +0800 Subject: [PATCH 193/379] add do while --- 4/loop.md | 34 ++++++++++++++++++++++++++++++++++ img/do_run.png | Bin 0 -> 13773 bytes 2 files changed, 34 insertions(+) create mode 100644 img/do_run.png diff --git a/4/loop.md b/4/loop.md index 1818faa..0b4e5a0 100644 --- a/4/loop.md +++ b/4/loop.md @@ -77,5 +77,39 @@ void zend_compile_while(zend_ast *ast) > > 上面的例子如果`$a = '123';`就不会快速进行处理了,而是按照正常的逻辑调用ZEND_JMPNZ。 +### 4.3.2 do while循环 +do while与while非常相似,唯一的区别在于do while第一次执行时不需要判断循环条件。 + +do while循环的语法: +```php +do{ + statement;//循环体 +}while(expression) +``` +do while编译过程与while的基本一致,不同的地方在于do while没有`ZEND_JMP`这条opcode: +```c +void zend_compile_do_while(zend_ast *ast) +{ + zend_ast *stmt_ast = ast->child[0]; + zend_ast *cond_ast = ast->child[1]; + + znode cond_node; + uint32_t opnum_start, opnum_cond; + + //(1)编译循环体statement,opnum_start为循环体起始位置 + opnum_start = get_next_op_number(CG(active_op_array)); + zend_compile_stmt(stmt_ast); + + //(2)编译循环判断条件expression + opnum_cond = get_next_op_number(CG(active_op_array)); + zend_compile_expr(&cond_node, cond_ast); + + //(3)编译ZEND_JMPNZ + zend_emit_cond_jump(ZEND_JMPNZ, &cond_node, opnum_start); +} +``` +编译后的结果: + +![](../img/do_run.png) diff --git a/img/do_run.png b/img/do_run.png new file mode 100644 index 0000000000000000000000000000000000000000..1519e3a830242820e0383701fb1081c5df2dc0d9 GIT binary patch literal 13773 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 literal 0 HcmV?d00001 From 02fda2d7be181ca673f89545a0db3c38cdfcb8d8 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Tue, 2 May 2017 19:54:49 +0800 Subject: [PATCH 194/379] update --- 4/loop.md | 79 ++++++++++++++++++++++++++++++++++++++++++++++++ img/ast_for.png | Bin 0 -> 23130 bytes img/do_run.png | Bin 13773 -> 17950 bytes img/for_run.png | Bin 0 -> 25681 bytes 4 files changed, 79 insertions(+) create mode 100644 img/ast_for.png create mode 100644 img/for_run.png diff --git a/4/loop.md b/4/loop.md index 0b4e5a0..8359dc5 100644 --- a/4/loop.md +++ b/4/loop.md @@ -112,4 +112,83 @@ void zend_compile_do_while(zend_ast *ast) ![](../img/do_run.png) +运行时首先执行循环体statement,然后执行循环判断条件,如果条件成立跳到循环体起始位置,否则结束循环。 + +### 4.3.3 for循环 +for循环语法: +```php +for (init expr; condition expr; loop expr){ + statement +} +``` +init expr在循环开始前无条件执行一次,后面循环不再执行;condition expr在每次循环开始前运算,是循环的判断条件,如果值为true,则继续循环,执行循环体,如果值为false,则终止循环;loop expr在每次循环体执行完以后被执行。 + +for的语法规则: +```c +statement: + ... + | T_FOR '(' for_exprs ';' for_exprs ';' for_exprs ')' for_statement + { $$ = zend_ast_create(ZEND_AST_FOR, $3, $5, $7, $9); } + ... +; +``` +从语法规则可以看出,for被编译为`ZEND_AST_FOR`节点,包含4个子节点,分别为:expr1、expr2、expr3、statement。 + +![](../img/ast_for.png) + +for的编译与while类似,只是多了init expr、loop expr两部分,编译过程大致如下: +* __(1)__ 首先编译初始化表达式:init expr; +* __(2)__ 编译一条`ZEND_JMP`的opcode,此opcode用于跳到条件expression位置,具体跳转值需要后面才能确定; +* __(3)__ 编译循环体statement; +* __(4)__ 编译loop expr;然后设置步骤(2)中`ZEND_JMP`的跳转值; +* __(5)__ 编译循环条件:condition expr; +* __(6)__ 编译一条`ZEND_JMPNZ`,此opcode用于循环条件成立时跳到循环体起始位置。 + +具体编译过程: +```c +void zend_compile_for(zend_ast *ast) +{ + zend_ast *init_ast = ast->child[0]; + zend_ast *cond_ast = ast->child[1]; + zend_ast *loop_ast = ast->child[2]; + zend_ast *stmt_ast = ast->child[3]; + + znode result; + uint32_t opnum_start, opnum_jmp, opnum_loop; + + //(1)编译init expression + zend_compile_expr_list(&result, init_ast); + zend_do_free(&result); + + //(2)编译ZEND_JMP + opnum_jmp = zend_emit_jump(0); + + //opnum_start是循环体起始位置 + opnum_start = get_next_op_number(CG(active_op_array)); + + //(3)编译循环体 + zend_compile_stmt(stmt_ast); + + //(4)编译loop expression + opnum_loop = get_next_op_number(CG(active_op_array)); + zend_compile_expr_list(&result, loop_ast); + zend_do_free(&result); + + //设置ZEND_JMP跳转值 + zend_update_jump_target_to_next(opnum_jmp); + + //(5)编译循环条件expression + zend_compile_expr_list(&result, cond_ast); + zend_do_extended_info(); + + //(6)编译ZEND_JMPNZ + zend_emit_cond_jump(ZEND_JMPNZ, &result, opnum_start); +} +``` +最终编译结果: + +![](../img/for_run.png) + +运行时首先执行初始化表达式:init expression,然后执行`ZEND_JMP`跳到循环条件expression处,如果条件成立则执行`ZEND_JMPNZ`跳到循环体起始位置依次执行循环体、loop expression,如果条件不成立则终止循环,第一次循环之后就是:`循环条件->ZEND_JMPNZ->循环体->loop expression`之间循环了。 + diff --git a/img/ast_for.png b/img/ast_for.png new file mode 100644 index 0000000000000000000000000000000000000000..29ca52580b7414ec1ec38b3fad47c3d90722b364 GIT binary patch literal 23130 zcmcfpWn5KV)IJJtx*HMc2I=nHAYB3~(hU;Q-BKb70@6q*C?H6PlyoW$5)y)RDAGuC z2KV#)&wJi)=hIpD&)e-@d(9Yg%rVEf#x+)~uC@vRE)^~Ufgn&*RnkKsP&*L_6l!c# z_(rc5;}iUaX{Di}gt)r?FR$r+GJJ#MruxtmfgpsR5_Y1ba1l}?5DW-4B?SY&>_1I` zCi*I;$8uZSpZ?lAmGazp`qQ*DDUYeFR{aL)<2jz23Qh_nm3c)5A5335#@4>dGUUU? z_CsNL`bHP!gD%%(m_xl`oR`*{`?ahnTp#I2FM@iT&F0T9)4c-%NReM<7W`ZMb|o`} z><2yV1|{~h?Q{HBF`|&+FfO>NSMKQJ{r4%%7OfZkzfY1V|1Uo5n!lq!Ah=V!e^02f zkm_roP~uX=d7mG(Eg>qNt zpNb0+2t33q90Vc^<>X(>m5U<@q7^mFk`OUW_f(k(zHSvnxgJwkeAxef&~D|&LO2lN zgFF!o6`I#K5qZpc|NDWAzaIrLjrLzB*xY3Q-Cf6q!CYVK=<%-7%7JbmmmoHoG zJ{{^YAURlBqf!O!2Wg0ih$40G-=FwoKcsrPKJr$~`9~OW(l?u%d}i5FzPwt`OG~-4 zQ5d~e`!hn%m+0$+F(dM$=$I+uG&D3Ko;-QQmrAaEG^)hf+0|7nhqu*wTmRkh>FKCV z>r8LbFKd+qx~Pzg-Q;kdVudre6%XCq6q(rfag@-h?44WvHsEwo(@a$;q`WFWU^* z#yxxH=|p%{%tS$)6UNmz!5uv;}TAsd(hb24^}NFs%H_{o=bl*xRdDkH=UYaOh}7 zsj8+n)fD*e`+FU=ki)MwRWQk&9k+a4RURQOt`A?nWT~Er&fHJe7d55edETBL@#L;h0_qWyD=-|epr>GyfLyZc{V{CmW%uBNuJvGHwia6-32NA6;5 zV1S32S+V2X-QAs=;&*QfSEdawFYnR*zO`V6kB?7J0zLZ%At51YtW8fmEme+z6t7t$ zN22PJCr=zUwwwOZA=g3CdSkw>ctj3MZ8uu$wjo+K!>>229E>tc)CHG_h~B~LSN98Q z^Uw>CFV5B}@R^h3vs`|An z?j{kfq}NjS3ou4^d9aK;|NS+s+FD-jwBXN?3GBA2d_}8o*Pq^IRar!sb^HTlNhcRF zJ2?3FZG!BmDIJ1xFzkAZ_YY)=b+osO)5KHBMZntrGV|$vehWtY!y%lw0TiV@3hx#^ zCi3Zk-FInvDM`tlRyhnp}+6ACN8y683E;?F|HC z3js!IJtH%dDsuSr@b~y~+a~J5?otmnW2GT?qAC~>#Zi#5w@8$Yt!+w5O7P+MgWfNM zG~#(7_t#+N6x@co1_r|Ji%KF>{4z2!`tLMv2^-(JgAvog_$=}DYg2c3f$?N!mj5m; zE~noUWq0r1h2A4li!n3N*pTZf56tdnB(J6*HOrx2MPZQr*<_wGtBvZd9kyFl^khu}FIt-PmW(rW?GSbaaN~ zs|b4KCy)2~_%v9OYHCD{0=&IHD=}rrh01Oj@}~X%{oDBNUB(pk@oWr4n8JTHyT9n} z+p4OnfPete$Ft%EXj9Ijaa|3;XQFC%mx{w;PP|VFWIdKuq4B(&bWl!i3a8;>raO1; zz}Aq$oh&!EuQY@O95rgsukzZ^qlimMPFB>Ab6)eE$3>)JW^? z>#KeIb9!!0dqDoQujT4uoAY}ye}*PuOmbS9N}Su_!G^xcpBL0(gSm3^-@ktXEmUB= zi5oRW`3jp6Gh*S-pP-FVFh~Xe=0iiRJkBG&eWL5Ya0S z#blhGo(c*IW@ctO>{}JZh)YS`Bqw*CZ#LcDL$vOoz$rXT7o|7MNf8(IVtKpy?C(UG zv5=r(P*70O#+XacSh|3<>fMZtjJCG6k&zK>MtggE>1;WWUs8Q-?Sp*X^W&ui5FF@w z8n5XaT(`5Mtwd&(D#OywP9-Bry&JiXAOU3l%T!e!ir>7>qQ*^A^f9jtzxeR*7|YAc zLvzN)*B|usuA5*X#fj@$bQ6aT$NH_ipSPjWI}RdsKPn=vtQNV-8<~i)Baw`Vu{$l~hwWZz2$xJE-^ss9`>Sfq~}DK~u!6)-ejdv#c1BzZK{eyPrD$9QthY zEeSj#hRE)C+7EK|h*n7y*lOvt6YrHR(ly_W@D8M}flGHSlN?Li9~xR(H?Yw;eWRkI zySuxM*6R_7VOlWJh~cN#OOqw0v%=d{zUb2LiGs+Jx^_nLNboT`9C)8~OT%~?u01P< zp$e*1a6Blnv5hd`Z$y~(|5rXuhfVrYTLczpAK2*7;|}^7=c)D;4=o-N1Y)%duVdK- z8xhbmG^E3umSu$7s@r%ls==$1UESALY{Q%<4UU(|$;t0t zPeCy*VJBnf`|qzdoo;?u8_K1Z2{?Fyf#>MtL@yWee7|w8my3>$4)p!==g%T9)}xoZ zZkkuu){1>5M_By5Zn}diLz9gh_d`hu=!%+6r6DY6>Bo;D=f}HGNtoZfeS2|n5f~V# zh(w;Aot*^9#&p#C@7ux2>Fq5d(c9BwztA4_@#DvLb%Y3nCJy)}{4^U|TV)?V-k)Hk z;5GTW;3g?0rLU(4PrEof9|tvm`Xn^iy0jaK%>VGgNnIWH_IofcZ{8r;k{8I?k~h}Y zY8^(HsHv%$&B+mncc`E|l*$K3N4Qb#u;+|xA15kdVPUzty3*6r!-q&+W##TDyqmxC%y%-C@47{7XERyJh z-AlV}bfKYF>+9Wk3^W43SP%7-s|ra;FYW zE2h=p!2@e{9L$Kewf*;6S)#fN!eW|-NgULiG&D4+JjSa_OK8!!hzd6O3Qv{y6B_BR;adLiTz@y|uwDw;2%S~6R z2py5pK54V~Rf#VmiGJFY45QOAG0DzM#Ct*oeM$!$6oH*=XvkC|^mcQ@#=!xLKeF72 zK&10r%eWBvhq%DCTQc&?m$N)HVpSM*N|A4eflg?soT!19j}K{Oa8M8oS=mGZ1yR9$ zJz%^gu#qAnB4gWUun5qzmKXN(Rc%tvkzoRTnciqzFlusga{LAm`CJE8hM0yi#Bji6 zkX%nxpkU6oNSm}5{~P@HhwfbigM;-E=4{k!d5B*(|4ErC(cs=aoG2uz6)9t+H#Sf6 zuN4n}P`#X${QBfb^=da5AM^o7`uM)}boHYjy7_5)D4@yLGm?0t9P`Ufe0tzR(7`%M zLQe-~SiYnh$J@`;?*f)R{Jp)s)zokV41WCh!EIFi6}EqZJqkj;F%sNW+Su55ejZd10h2jc zj4r0DH!(9a(>7Jb$G?HFh`t^Q8#oc*b%+WI?*0Awg@Awnj*y#9zwV_I;yAN_r|`?``lmM7r^z#6)2cuE||Vu&^kxkY*TBye7s*&(F^vBQG}C z+}Nmhn&dTV;MIN2vbea2ZzC~0NTAP|lA4+-8+g>;)~4`9qsB`yN|nXK!$S}(Ri4;o z3wV<0Mwkd)Ef<$9``qBvw6uTkT5l7`tW|Not+6T%EPt zG!NR1x@p!bhk@F*IsV}xH^m{T@(ZfN)hyTU&Q1tAnl4X&H{=TQ@of+1D}tc|pB;;k z#&3T>%$rZ2HS}^n7wqD)#|iz_vC5)yNe(Qsj_k=YxaE4q2YV}h^C4$tEiEk+YljC1 zCe;oj@VlPekkgIOtAC;N(tbOKljaZZ-2+!GfnIJdsNF19=?#6z@dAvAQpAy5ySS{3 z00(EP(f`vU3^aty-kV}@y5@;vl~BVGu6XEA;CRqU=LbJQfPo>b0IZ#HCx46yZ+U5{ zv!mnb_SNO~P4n|D1uh<*7qPJqn*zKc+7xL?OPf@o4<;uiMYbzA2Ak0(#QfxupwU)V zj?Pz{J7qN;(pdHLt!*l#u;jcY#^6h!tc zS!P9QvPr>VP-WYvr>Cb{_n3_I)~$`-zrT3@z7HPXj~|BF>8Ys{#KaaxZ3y`x4n(Uo z1i}`drr?-7X3rYn<>Gq#w|&Oc)YN7M{{-YwZu*6So__oH@0q!|crr3l(!X;}akZ5@ z0s;cgqF+9Ii1YDNQo2^_(?3M?viNv-`+L_{@4&!#LpI~?^0#CRJPJR5e-U9}{LGAw zg_mq>w|RJY0uq%tQ&yLk(J?UmW!Sm7OW`Un*Wp_sN~x+66wP{3{;|BAsFu4qJSB?` z!A%8jHyaxV2X<(BLw!ACWD)cF^=j{S55ATnLH-aI@cCm1r=C?2Kbf1RgKX~h+FH-r z{_a14_!VMmYSmDv;$n#Wz+cQu@m%c0iPW{RDWDLRI;Y7mEoSK+8n)+lvMlKx?Ra>Z6%u6U>posDD9DWSZ*H?q+XRw*W!VuD@ z9Txl_P3oTz!_+_5*7EW2XlZJ`QZHojba5$5PA1c?^eShtpajprA|Re#E}j^qgv7r4 z;wm^e*hY$hfk8@&+BIuj73;{eQxZMCq8gkv>z;TL*Un=7_dZ@;FCU|svmvp~pH$81 znwXfFo12@N$+8GQD}K^BCcM6GZePEClcL)UJzkSOrE}nkg zDbNGG5F>|jWWI!6HNSt)e%Sp3g47?C)+9)9wDWWj6w$?6%&q*$!bi1vd13g*O8;HI zwpv@|tIBja9336|9Sh#(=QB!3OifOv8IHlElarG}PdC_;V(?w?h5bfGN89Z_K?G!N zWrd1{=Fa48OcnxWBKYjc^48+gl9uf#5h39bXx6uHw}kDrw6p>OBP2&nhICx)R8eWztavN4y%r^)3{zd&U6ydc+ zLl{#+O)~oZI|R9xKV>t|uXaHt-uf^qnmetquoqemz@c&*M5 z*70-03<}5!gNraQF&E<_2kbudci4UUwnjBT1*m{*!H_R)nzu#EE z>zpyPXUfgL-tUAlZ@uLp-irUC42q+bO;6DKa+W_uiv+HMG6Gyt17fjziqxDHgXENy zKgP%Jcs3Q>CO+OPJ{2ZN!b0>DgWKPscmKX}K=399=6HH;PL8%&9@qdDB5ghn4&A?A zFP2F8DB@uKDp7KY>FLW)*0{$R!d-+6ygAv}l%39cPxjZoMPe`;{t;o6m7VMBbAm`I zVwD9=J`y%O^UTrqY<+Te_VXJI{oq}I)v>D+8pW)5>fr{khKG=TE=lQA3yfEpSo7z~ z6)T9aRX8Qr2~zBW@N16rTN)g49~Pu_@o6Q+W8uAO`Bs7QuwG{r&(RBeK!&uTp@E5s z>4&o@@~H#3Fd6~ctxQm97*a_-69)$e zJG*^RTHeXV4yIOkt2*Wc>5l1(?VZR-^v1O1yV4KpV8R3MH&7sEl6Td8tE8)@s>-mf z@J4v}oU54LruVT^?@MCxfaQgbnELwqu@H>VGDp%PL_(atzMIbQ=;)IzE|ynM;uBfG zBdS&)^OW}#)6`T@K%v_djAc`}Go^by%#K@}xVX5lT#un!M{ZmX70Wf!%^mtFP=3cp zj|5)cCqQIEsFEl4^v2Ds(pa8wM`s3gw1F1V7G5=p?mtEadK>bRoyqJv!rbV_x=+7_ zufEjr?CyMKprtjS+avxoxf3D~e8-oQR0BWxcTL0Z@n#lBmjqK?2hr{A$dbFgdC|CC zo*(e%*fzyo20Ue&@;Kf`j@?`-bE{eWCiweJbD0N$j~o%B_F5~5FhUuBVqFxZ2J`9(7ZJ7kfy zy9`eklrRvs;6i#8=H)RkGNSn69~yFOHJ5#q=`1xNtzMeQIH(-wi_%ZWDwSM(+dOGxN1=3!o6b8DDlRh{BCS)EaNmM9jicXFM27p;S-u+9Nsi1C(!X3*ZG#vEAV?|yQX6uERnU?@Oo4&L4>YI%;oeonXLu4wSIUOx+ z+2^8eh5b9<3iURg-Qa5Y^2OA|1Onj2LupYCIzIql@Q8?d634XS6CX(Th$Y3v;USCO zzU}Dfh@i56EiF}6RtBR5K>u>%eXf<2Rna*39T059EImRE6X5?Wie|{)>t5(!t}Psa zPPb7P`0wM0a|Kv+2*suvyt&2+NoZ)Yv$8()Y`g+zV)<=FX(>KqBoFZqU-Tj6k&ia} zzTiKDguxISFoQKGh_$gz%Cp(@-&@9UVHAj<;@o*k6w{I4V5T?VZPQK66B(QMwgM4` z%1su=3!ac!y+_m!M*dE!@SIQ!%LpZZ{}XU@HJfD#o|*6hRP^G-3viiP1g}A*Pi_lH zinzjmLRNSLH8Sw<>dMN-rKukTf6t%eM-nH0Ti!p3CZ3UpRLB1>>SI=ZPAM!WaEBpM zT3WisbzXboj*t$71mI#mo@uvC zrXnTv*cfHidt|~Z#>x4t!45E2Dlnv5B-rR+{N9$Sl2cO$ZqLbBjV3&QE**5tZ?^b# z_~75arAqt~LQ8Awjs>^#^YeqzTRq*~@7}#j%7s<&(^9QBkp*Z7e2zx3{|OIzw}S~b zwzr4AerHo7)WbUvb;Dr?kzDQ&z1O$Oyu7^lctUWK;(lNKKO<#rcQ-e~ z8s`j9IL7I?5+-bPR7X?y`dL7jmjvP=xdMJ|hoog#BAi3RbpHhe{=ZsLLPJ9jf@0ks zJb1ud?*G&q+c|~-4{1f)J~Knjcc+XmJ3G6gJM0Cocx6$M!*xW3mS||p#LWD89}fVB zm0dr-Cg(V}Bwd_@9!L!UBys!p?M+X;*V@ELrbNg@5Pfh+eL{kN!+@C{i7mx`NY=*E&T(LBY*~Y-q`2sH6&CjGV6m~W zp^@;2JZDiaDcpgK5dgqoZ|hCs^(*qNM&8`Xe12H;zNRJ>qOyG9gY%J&nNCHr-~WCE z;84=TBAdb@7Zw(}wp<*+27R%Q%j|=_H}SuLwzBunHYzma(;zlX3=El&b4nsdC1vGi zfP|)lZ$hYKZ({>$V4MxU1QLm~5u5@?VY19v%wZKG8kndcy(PmHV*fqFGH|%Pd4oEW zN{j^P4d9)rD%%E4s&?Wl9Hf)eZ-9cIV&&8^Rtl=F^mC2i(B~L_?@o>;&%($ z_OIqUKd2OFdlx+FAvhZgXyzJMYoD5uU}f#9%4RVTWD(P3XMdlaO;Zy35xh247SMGp zBDx>|-Un>ri&g>G$bS9$0z%rLATKck{74TG)G+sJ&&s!gkdYiWHj8?M5rB<_xjtdA zJe5r-p}hLw@8WUx@Y0|9(I`I7_3qCAw3X<<0m?vXwVsoK4JDY_hB2U!w-Fg~CCxi~3& zn3W(Jtmp)XD`2-2)3$_>U~&9NiF0rRcYZ0*d}L-|__dTER};T*1#r}}XSgMy34nLy zoaP5Eu$-rzM4q5VQ-hMNMp4l|=~zhbJ*K~POTw}pecCB=^-eiPr&@b=cQouaCiU<~ zx00yYb~#|UIJmfP#!FOL1owZDWiq7oRpu{_yj2nJ>h87!y$J~kp=u~D2^R&t?D=)< z{qS15Ha9mR;jx!=2OIY9z|2fm#{w*Mx~^yeC%U*#RL3XF&wdf#vsnO;`&K?8@9;M| zc1?IxlY}YJ0q|vTT%RuPI%2>=n3$U0i(``> zA=)j+QaY}NWL10-t=38=38#a*Wua1HYrqWhLt0Djw@55zaK&*(7{Ow?W-?-W#@x*WgA((t0gZ#u_mi*^zkJH6>(x~)1E1r?MEZ-PHk@p2B0UyJx;ZsS;vl2x}Jp8d04f4W{ zd}+eFw(D0%S2_p6iDc1;A`zR|0Gk zos}FZn5oi19;*a?-4E2e#>QtWY38D0Vl&gzoH1QAgOpxfo(M`#5Tas7H3$*CQw^1o z{C^NpeGMC42RZ`%rgCsd3MTNXjc#F@!nB03U|P)m_9w1FG2&|cl=!l_M9Ng0*Zurw z|7`Bwr%Fsrgw%Cyl|#CuRT79l3<1t6q0qz289f9$&fzr>xYBC|D`r2G6SX3M)t=6k zgNC>Pv%ir(4zouQS95p@8`l6(atu_3;NYfSj5{c{_zfT=4p65Z>ec%5+7mQw(#*H9 z)OG+kfxG3Njbrr;8yh>1hXWV?nZg5UEX4K9R-4ajGnmP70U3u@u{K$Kv3nYm6m~w{{iXHwMi8fU{!h3qymqe`R}aXG~A`RMjG*@xZPpaO1x?B z3krU@<^Ez3V2N(vkjV3Wb(7T7+uO9p`4-@F4g?%z9T<&XfL2CD@m{&y2SoNM05x%h z(0{nk%2=Tnc?M(JTW^C081cc zkzx^$GWv5x&`W=Re*i-P&2s<>%6$y(D;IIFc{GIV0IaX}Zax8xL19)jRs|32wXh|l zfILB-rXiZmhIUClY3kJkGx)qBP7{$aF0_WFHnhsh-ffgNFby0}rGx((} zPF%lx{Ew>!i_wib%U^~_;mTQ}yz%Y^K0j5SW;$L1olHqlQ5duV-cIN>Qf!8&O{$Cr zKgBfM4H8G|jf{mJ2GBD!A%n2f&iaeR(gx$9~E6kWFGC?NA3*lX{!vbxvy z+tk_(!l>VkqjBXJi{)uj5<~OZfI@SdH%m)OPLGiiIJFXZ9wXp3*sOJWxP1<{LCE3e z=@KBA4qU_CSpfNwuC06Xsi@*=>FmFvC8R-9%FuM#yf9L)Y8YD8+Otu_`WNs^{T^?G z3Ffnc#Jf!VP6J72<}c@qDRlLInY#fO`e(D))Wt`DN^D+B@uGxOV) z7W!Q{_hWRUoO>(d=J0;UyGbYce&^MbXa!l!RijTx-}$a9)dmOfo*rdvTl1n2L~U6$vk zG9{`OQRQMVCVwNOmzDP4vw^Lrk*#8ry(`z}G7snHY)hz|px`JHs|0_nIdvxQI2<6M z>R}>vTIz!lqJR6(xDHtR-B!OCm$f%I#<(xdn>NgjRT<(eaGk#*iz(GKgY!=dHGY1!!aqCAQRji3B-B$YZjFntN20=DcTsvO%Bpnb#--z*oB1!fGktg3&9|bdELBu6VgB?g9&n%l*GjH z1eUi+W3SO;A%;jnA)#EEz-VHl3JVk@LwY}Y9H$b(b0lwpF0MASAeTX*t1^+joP&En%CnBtmkDI$7 z8chK^u|r5mXx@K~)+pK5&Mv99^uL5od!bgQ@CIPpJ!SkX;MRYoy%R0cndQPUvxRb_Ool`{qBOow^Sn#tKz`{_HZ>c#A$O zH#b43v!{osIP3X~7dPU%_*%{d4=+O0mJk;gk}~Zs zF~p~faePHG!A3^Yz+e)x?#4ej$ISal4PMf)$#h*^-H_Z>_JG|Ib#z6@#i{;#?fNfY zm?QW0_uVUDF=5L2W~g(`p;sZ=+VQLG<5D}VdX;%t6v`3^ymkh{bj1L3r*=qK6`7L) z$qL9$eW^Sha#PMnz|bh)lNZhU38@D|!=hDheM7^iXAng;02>Sr9fnBZAekE!6ikt` zKYtFrmQo28+nTK>V>}oToB!on3gOM9dFbml3t|a&og8O-`}gN+_9XZQGXb}CdDDh6 zMdJEal3rC*@TbftVl#?n1w&wJ`w1m{S_s+s%ANI|gW5OH8$xs`d7?S|wZFfUxeDlP$A`~|Nn@3O zn1P)SgDNOsY1FdKI|zTNUI?>=BwuEF{MMg8sl2AAQ}(%!^!5N9hm3>pP{MzbhjbjU z2Lb~EiXy<)$klxM#5`f7qobo?&ZEhhLYmC?$YImR&dyFxFKKV42Ih17Hcm^Y$O1$s z%Gg^!zdT6p&k}Qe?CfmtDDJ-9c*(to4xE~j}?epZ{T+2E5>}~g$NROi+g(>A~7ElgYwS1 z6&`+VZkBa*-R|vGzfMZs*V9AR=ea9^^(uUFZ631hL9E{^RC-^4Xe(KvYCTS!)-feqUeqn{RT)#tfvS zr2bNOJ-O6a06u)Z zyvQji^kR@W;+fl^%;v_%S*fWL5S&d+L=yuX)Hg7orJ?bmtnA|QY#VIN>+Wu4k1+_m zU&Tp+NdOQfMb0?+_OMUolru0*a&yZUI?>tL*?~8FaeAoWY1ZgR!We0OotE+|RPUc_ z3f$V-0#@u?;I<4G{|f*tre|gV^DCL186JL_k`hIo*ku)bd9o%hBOw8s^h-rWMNQ37 zmTR;B>A^;x`)l9rxhAiTQ2R7XmF0QDNc6tIIR&{I6eC zW0jE4$-u}$#uMn$i=_`gaSNA_N>@x=03UgGBtozfYyqSiMVLE*B_W>YGFu0o|EzOI zWAwT>^`?ls6A%w1(LW>6ZD=3HLhgVs3|eLSB{hiD5(4rSPXle)&TT^zIx+d2)K zpd$cW1wG)Wd_FsC;%KrAQ1W-o!OA@a&u%4bZ%B_FvC_q(&wgH8TXPauaR*XZrcH-T zFOaH8kj|nrKY!Bt-bn{WYkAA%bXQkY&yrS-^uvc;0`|Yc?@;WuW(Hw0oVVrn%B8GR zRhNKNzkCVoeRUh+miG^jo?5>2!A7pT%zcRjmt>>~bXlm*yz z@Yw6uT6^I9!3AuSmDSa2B&e6(GN3YQ6Y@%8k7pg6ouxgNpL&!fy?S8gAJw3xzW(>` z5s2rDay(7!E5|Gbin#s#ec*BKAh5h27#jXy&kaJ7B~1H#`}Pg&6TsNrDLPUZWz~=j zT2Zo%r;~AXb)ARPe0)5L7)}UB2M5@-Or~iu*O!W^=}$BCq9i z+M3z5g@&NY|LqJo;u&nmsF)afAQ9WWoPdKzyZ^hqMHw5ch)!?~WFwd&VH5!e>vxlW3=ijJ3rR@mKVF?s54S>*hx*QPG6C*7xEz8J(KYCkB!t`W}k&zK>Ecgr68pmLbcEe%y0a?Y)hs;rw z5i|pwu_GMz#Ej{+&5O};`-in3P$#G#1Z~+(V4%1!GKghMiZh?#mXdZBQ!57#q z3h$L1A+{FfkgmYh@Usw+=!*zkv{oU+SK~i~4MCjUJ7OIkc9_5CGyW(&qTzfUsy$W* zUtiPP7ZVAr9eu3m~nrdpXadCaX;%|N#etiAvMgTFp^Ed&S)`p_VF=|<6R!HOtIBH(98OxQIzeX zK>p%kug2hOp09VXU-;TAap^r|U*5y>OfbJWF|gpr`2biC+XQhxerWH)E2_!{bpB@!ksZm1_+^pM;A4C20UADZu*~qVwl+kPLsLVF5@oS|V5W{!c znpPM;$eo>Yj6U!ASv8#JOD|jZudRFFxFCJA{G&52QAW#;N!!f>ScZkH)prp++VM90 zvKPmSOjppbwX+KeQndVqM9KY(A46-eC4Id7zizg~2fkgJ@fn$KDR*=(oWS{9y&L~$ zNLKDyIW42XZRh;MVY%5f?#0Fz`!~%>pI^<`%}y=#v437z5Ry|@(<-PM4z?RU<9g&@ z#PgKP{&`th%+NU`1pUkQ1P5DA>ID^~mQ-eziXG?Woek>^PUb}8Sih#w_LZTXZ#cWB zz4Hx!$er4C?+Ke>Z!jKFX>|Hev=6ZixZ@HJqRNeLG;4oHMjJ37vGb492S5Uirx65x zRli^^QRW6E99a48OSB}&DHYkPvLXH9tL@n=>6Nlae)g7g?w9W?`4U2+N^TV`eCWG@ zoezR5zh^c_cQwPvE|k#k^*ZMkgY^ei{^zj7L3d4_p5a%$etqPxI57Ue zoO-|Zbzsqaul?TTe$+)Xt zni>VM@%yEe(UKJpvxZDEe#AGQoN_-i8eiEda>zE9N$XQzZ51K zKg%*T^HK?xeM+f!$lIp%#wyqYrgh6kSFgO%6P1 zg@qj-hhJ~RXr@fIPt3`4r-+Y23U}m|2#bT}ic8=2A@3*9UG!cC@BYwDsP{aZ*y}Pg zUh)%G44A$gTID%1z4fvEhCHj(KQ=6$1Mw=k@S|{9Vn$06);k!J)SF|0_zaODb$pMS zrp~9E3=aP>kDqK-RbmJ9(Uh`hK(uQ{)dac9qbIs->Bu+pb!Hv)_Zu zHuomP=S~OcnIk7k69|oucqN7>awIyuMFSUYN?3|>w@y!Xmm(hek9Ecn{k4pcSk=9s zQ}$Yh$-JAdiM-BgR1*g0^{?J*!9@sPxZ_RxA zX_T4umGQS&=y`&QTz0QyK-s3puV*R8s2hjx+*v~#t$l;~?O-37r=~R0H%#z3bZz(E zEphYMvUc8@B4f`bTTW7J=H}XcSQlwhQH5}{(=1Z5waXTFsyTxRz$orxHJu$f*YZ^6 zF8bu-6sP6O1b_UmK$MdHjT#4$nnm{u-%hCY`Wo1_2!o>jT|$DC5!~p&`Zp^Ryu)iO zb=G==>)YKLpQ9(ETyw9!p@JnccwkCsQkgWt4vV+GAd`DOa>Nul;d*&2VmuQOOI3zh zDlvX9EtrD0Z6-v4i%z!AcfaA~pOyFTR$iA|=wt_pN6}MNAG;^KW1M{DZ;h&<8^FrS zL(NED%j&4Hys1FM*l)f#>GSC%=8QCQc;I(Cdjfq-dBTKIQhrs)e$RW2=FZIfKdOA4 znj5V0$ijhyi?EoI4m>4i6!uteQ-&$@yzr$_#kk8RYq#%IQ^VP^H|ctreqJnnbTRzd z{DIjUpCdGPFf6ciFD~}Y$LzoOn;wHYT=^djWxvJpjHhcH_wbzcQ)&C=>_|5$kzGxO zar@Dfi&)l)lr^Tz=YaDk_p#N>x$z!ec&`)+`LhelIl`JI_ly!FpCnKHiA_#P;fb(v zvLDjXl6vWm%2=H{BsBc6-%1qA;=cTu(XHV;if3$F(fcg4gU^hbq%U2w@YKt7zo%U3 z6B%$2?;o~E2f1yx$>8kv7-ZZ^_B{BN+>;=*KgfAgB(M6FX>&N&;Em;XTROi2hE$%d zsmKi7kvaExxB(`4yDqS#Jp5VG^-|KSb`r5zC2=&LHSOI!9)sim-L{^C!8hTfEgh#v zk2lY9uNZq|>A8=CAH8x4J)^A!Ll8ex+v(dfU+4V=sW22a>^g%xkeNgC#?n)~MZ#qx zkc%%zPUz)JNmM8TL?HTB!Mw^%WgRT9^?b3a#ouTZdp{tL9qjwNwsn(04gz4a{ zj^#oGqJkaUwFq9JK!&D~c4HdNoe<8OMILEX2Hp3e&=s4pgc5>0-ZUXf{G<#vx#&zw z@rVy`=Pct$7xkp%>N*crG8@5LW-catTOYEY8hZlFX-MiJNu?5(CfrVq)?T@eC(~ibdiG_>!CT>@DoVlx4GTiiS5cgd3t-a5^d+8wM`g1km zB)9w50ce*R&hs>L!iW3x51xmQ7QYV(B((p_H1Cv>X4jvom9pmX@R7BP2(l=D)p15_ z!1LzGUo9>D(33RvIPf!Sooy*aX6kTCVR_>)>YEj~Cb&b>MBJ(@N~q*0xAChUfe?{vi8wv_QDavkm(Bd8DvRI$I~ z=Ot3vIpTQYMNlg2i=`2wLVLVd7?h(MV-}~D@qpF>BIMW$ERSP5(i(IkY(;Y_CMv}w=%EyOCgLtQxIuk9HxCjEC~Ozok#UstrtZiT&kz76xkQp@ zz~m8658-yG%k!;g_ZEVKufES3CipfTkXm<_PL;+czeMg%y1PmT@9l5Z%-;zP=}3$s z$DQa@D}Pa0I8E(#8Y&tR%D9_bC>y*d^v%MlCtJWt^!8ENEmzn0DG4V+`(dZ6z%^f3 z>1Khs#8l6XKt|eHSH>tNwvhR*{W~{@a@!`e0zU>#IQts0o_o(yXBt#}>Khv-dh_vB zTFsmT5_=%XesHbF!#rSv)q}ek*W_-?2lU?0XoAYtv!s-WQy-XdIMlk?(~8udomYU8@xg7m?pZ(R&jh zVmvrJ1lW#L)D9|u$6)eJxw02uwwtAZ8aDn%%?B#pVF$?F}_=We25A8bYo)Ox+Epvo2)_kU(;`GkZ%0l*5y5->l`1i)~~aif4eWtbt4-2`=J z1;InPa(v{3f9XHsK%xQml3~5&r>Q!9mfC^w4-c>!QZ2EiE5beE~l!Q~#4mv4IxXL_jjO{hjsewJ-z-NTx-k3@IM5}ifS({NRzxf113YyY z1r)m_6Y1MFpYLe^Pw+fy7l;wK=%|o_Y{HLv3`A`}w@vEY0Q~?UuJkVkAsOVcG-`@n zfWUVKzIyQSLJYk2p{h!6JRh5pCHWf^-x}0}fU@c9e+S!kz{Gz4@hVjN0o|I0rZi2k z?1rBO3bRH3<>>6GUF6ICtna+zC5D-^(gJbC`M`!;7@DenMCSd#&5b{HXg`KCXZ_CN$o~{C^J`)OV$BOkIlp5~-{jyDQk`!#@}pfXWJ zN-A*28W9P3F4Z&ATB&|0g8>K&-UyJ^S4ivq@9$4Qum1e`11ruPS>t@-GMFXL(7KhC zk?|1lsqzpeQPG;ZI!Z=z5)y&X%X0vOo5-DlThZY483f;nJUPgp0cY|T%A=J%$aa8& zy?y&up24un21jHF(DTXChY`e8pFT;sFQSjD%GwWRU!48xTiF9v|IbE$eb2z+Dv~Tm zKNW01TcD6pSXdYocl*DjN11txSuhSo%v_8FRF4>euP6<~Zuxg}oKdf5*GxZ4)7C;7r zq@o`aLQmw_>NZ$y*q2B-{UbyxWqOpY6+_6$N*WMDp&A+9F93yEXGO1JaJ5i9v{gHA z))a7WibE#&)C(jH=Xg#IUCCO#*)NZJsNx48S~~QyF+_vze!;tUM+XPw(R>mAye?iL+9A6L>V77;kk&sy(?CVp+4&Lp$dCD`@5ROHGh~}{?)3n(B z4f67=Hv#e@RPp7fwpvxb)69S>V0;Ez5UY?hcOF%IsEAKV%gkzXGYlG_wG;eBD1kzuaVem6=&` z$+2Pz1U1l#59Q^P+N6$)kaX>|5+Esm|GsB@{9dxt2%b^(E1z{!=adb2hl3(^S7#>& zIWA!g83hFlW7(tr^ewr1%Adb~dC74_NEB@|SWLMo-oJYX8$CPc_3L1uyMk^iXbj(^ z7|Y}Ai^RHL$kOnc2C(;sm&NVe++9lkkkJ11OAG0s-77U(SP&Ia>@t%$=Q57;pBuH6V*$E4fm&;cduk&A6Cbs4ftW}QVC17tKN(A?(3q(alb*EtslYq@?eL|_++X)8>)Go^n z^D^V1t<$E5TH3avNeRCdK%|p@$0`$~0$x5;;#W^1`Fe>B9qyf9!{iQWQD%wF6~lco zSQOPb*X{i0?c?vPYYhP0s$f2?i4y1RfsKe}Xm&b35?;uLU=W+v2b1tqa z4-$$snvezp{O#L6itCgR{}Z(!h8eMN!l*j0))Xy4e# z2x_DLwPDexLy;r@`k3x>)|zcdQ<5N|912{_cd2*S@kg3df8>FQfD6*1@OFsnZ@nJr zYB-B~E}37QKCrQ2sd|m;(+2=d9 zt{a9XXQXCpP$b|)Qb9lba^cO7N4hQVFL@9wrXl=9XmHyu&% z+uZK5RoJ$V(n4)N0>QJhyQ_d53`LdiC^{W)QS>SSgWODm_`eqmb-aA|$&N7+YQ!NM zqs0^FEy(=}M>+xRQALpeJZllGnI%f_kwUHmE7_y|nh(R+fy`)4jkT=H|3=|ouLLOIyM8S%}Z`PS~ z?1Qk}X=3g7uV*$5Co_ujlGu7*^0B7_OZ7~HZ5GZju^;DyWsq{}b5sCtU!jq1)ow-! z;bmoIP$QBFWSeRJ-%N=TXJL`Tl*z@Te$v?3&gEbs$A3;nBS0WOz`Y55?-E84qaG%J z98@bL7zO=J$?c8G(+|RUFk#aIqgx&(@?SMF07CAxA3R289F!Sg!a4)NAe$WK@|NYXqZV=*n=hv#M+kvbo#7NzD)& z>;HOkxtxj$lg4zZ@1^={Rd5%WI)Q4=1Vr!dC)adT&LK?@t zCoa6avJ!PX*!S?bS)TG$*7JHl>(DR{CEeyRlNP9`taNdXpr_KPva|a3p%yQ7S-31B zE2g=3mykK0GgSP~ng6v0L4*B*v~<`v5JTADf6>t)c(WNC3=Ztm0~-P8puN4gx?0q! zF^V9G?fkG?X7bNOv3-k30f;REJ?XNDh!&`wJH5&d1_Z3Z{9*niP9tG$No}@OifBCV z>`Xt*ZP5yO>G{J5%n>|Dgw6kgEmdgYy5~)t^|zX~+|}|0hzd`edF-C1SqRbnAg09u ziRm2+KHUT3lam4d{(v&@iEa<;73i*>4ngqRHQ;&)TVJc@Cm4rrDe!~OdnF~W!p5h4 z+(R8w9ceFygz^xfWMBrs$8|CY;?Ur+8r%s%l3EykeKcoYp)@%_vM=lx9SfsY!ZR6!TUK9MU0?q-jB0F* zn}NxRx3`K8+npEBnqAHjbRO2!SoYuieN&-F3hPrvw6($z2J)UFqL3^qCKj!=#9(Wn znj>Vv-yyPj>}siHO~5abVWgocWP9O4Foc4t31_%X9~g}i z1V@83{-XcJlxD%Hdm+Sue|~v61GEulfH~_Lp0kk+@=I2vLHVxQ8 zj*<&iMvi4yhP9#{_ldCpxhd2s8sEo8&ZNz-yMm9+Go+n8*O(4DAOJ#4xW_EFkbTFF z48#*qYp3EhBt}EIud2!ju3@PLdoYu!@<`RqGb~YjkUxk%D2D+CROfk=+03@g4?oKe zB7Xb+9b9Q(AD0~LYB1Kl8ym|UQqB5FXEydwxmci5TJXyh=W*J^!o2hzo6~Jyu`tD< zsqdenhi({ymr^<~1DYe=lA515)5|BmWfkJBaBoe+gQp#?bxdGunkNlLSdDFMQEEH- zJ)@$d5wBsIU5UZQC!*>xx1~p{K*f$6JxW`<$?S1DWhd$eas8O*A9#?*zyH3|T@dXb z5D~)NpB@Kz#do#+6FMd^a?i}T0!2FF;pL@Ac#)!nzu9~^sI{#PCTA_p=*Q5XBk0WH zyl*LKwgsX4MNiKz(uaSrWql+?U``Cz$p0aWLIDx}Inqmh{jGudot_29aSlZ|vhh@q z2btUHmNwxKzeAFA|2}cwK19@t39)vD5FT*I2_i?rUN?g9yUGqXV0uQ84uF36;xR?V zV!UjKfM6>(dUA96)vd@z^uKwgXm~jq8gB6!&xSw=z69g%VZigC*~P3CO26}`!(QyM zUyJIUzedg?{V>0qo?b|@=djkCcaqsGt4CL|caGafI^lz6>l{(kD2Dq6X5ps=rd3VN zba#^N9UH_5ZKmhW#hSE2L*P0Lkk0_bl!k{~atD@>N>(H7AHYw5lT(USMk+q?Ta)rA z*I9*R7oCRp@Qv~lepy@^XoPIxSe{UJdSr28fVHiy)XUJ{n06wRmd{0!cGOIAW={>% zMX0O*^Q(B2T<-a9o7ZOz>CGunMrL$XFH9;d4IpECyY~M5Sbyt9U(V3>7w}~-cb$&! zm_SQ#c6X1xal_)N-vVP)Gen~<$jJ$fP7V6pwv!;~Y7Y8~a`dQW-Ibc0oOj5%4t!rU z{(O%9-twuR61lanud=xKLgr_FGBlBg!LQt49FVfsTPC(Qfy11fbd(|`chrC%Lyv@u zAcCS9z?maDUw0WU)l zSTzY6Z{=6^jv0*Ym>8}L4qg~*78e)qVY^&)*4^BE0QU$H0A`W=+w~6~<#72Fr;n6OyO*rhdOh^RVO^u z(G8k7Veue&(dfL=(ew2u@=wH3cWuSM`qMJOFzZBOQj%mCPUJ-(zID+Jk`ZquBsP3Bxim2_z`2$O0>G)ZVjzr)z0f@_F*#Vv5<;s ze(M3jyg?=OLyOvud)&1IqJ)0esjc?7^#-S=6}qH)`cB4L84eXp&h!mk+BQtDB2)GQ z281}@W%liR{*9(bx?|jeqfzW3Z$s|og(D=rT|f0xh^yV>(2ceL?Wje@m*l!{Y?3_; zUkcUQMF5UHyT~#)TmD?eC1+ z28tKj)>T!Lziz+$%JTEVmB4!vq`gU+v4TY5!N2|jwR1GD+wQ_}bUujsIx~5U5l3hO zpLoU1MU>$D;P2m}dN&_fw4f|v{UiBCL_48jnRVCdAvIo(7^j(nov+-)SCDkYUwUb; z4BNNRdTV>BhIosrjdN*Ip6)bsHs`V+--kY~|egzPNBOi6(@S^75W3 z?|_95}Vd<4-A zwPY)Qd!UY0aevUr#{ApH);>FZ)^7Tx)JC5nlGT$`c_RYDBgIv%;J}LvouKI_?klE` zOrgl?+94CqNlS#`#5#Parl%kBHC#*w+PPU0%Yc^s+&jrjxz2gruj>vAak5G3)2Oha zDCqSNSMeN5S-Z|xe6Hrr&`>Y$Z8x<$PbTB9Pi}bI*uXc>_44I2r_~P}*fDuV<&3qx z;L$iF_l{-xuhunUzpQ?7s;L52ZJgip>65!ohOb!5*~VJ`x#us1hV}b>F!lwG@a_$2f32yu;}9aJXJiDgEgHnh_xrqh`SN+HXv@V#N>7L0 zul?H?P1P@jD`oj+U>bd6ZiM#QUY|AYWz#G?pP1r0r0-2Kkyibbg+fjU{6hno1gmW- zD-+3bdMRLBKI^^zq}?EOBJU0PTsmhx!|9PsVg#jp|9v_k%sRW*#Xxq6HNJwHFHM7z!p1-$`8G9efV$wv9ib;n zOT@T6olw2VY*gAxsOi|lPSQx=GeT;+R@hCI@e?RK~sDc0I^fzXQ6_Jp7S{nY4iOJya$MlQH*4O?CG!fth literal 0 HcmV?d00001 diff --git a/img/do_run.png b/img/do_run.png index 1519e3a830242820e0383701fb1081c5df2dc0d9..5b4ec41a8c05787df295f823204258f346db4966 100644 GIT binary patch literal 17950 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 literal 13773 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 diff --git a/img/for_run.png b/img/for_run.png new file mode 100644 index 0000000000000000000000000000000000000000..a1e30d790fef3ea49c8fc174ad90e6b508b71c8f GIT binary patch literal 25681 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 E0z3L@u>b%7 literal 0 HcmV?d00001 From 215478e2e532c394b27e1212bf1d37fe87e9d210 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Tue, 2 May 2017 20:04:02 +0800 Subject: [PATCH 195/379] update --- 4/loop.md | 3 +++ README.md | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/4/loop.md b/4/loop.md index 8359dc5..20facef 100644 --- a/4/loop.md +++ b/4/loop.md @@ -191,4 +191,7 @@ void zend_compile_for(zend_ast *ast) 运行时首先执行初始化表达式:init expression,然后执行`ZEND_JMP`跳到循环条件expression处,如果条件成立则执行`ZEND_JMPNZ`跳到循环体起始位置依次执行循环体、loop expression,如果条件不成立则终止循环,第一次循环之后就是:`循环条件->ZEND_JMPNZ->循环体->loop expression`之间循环了。 +### 4.3.4 foreach循环 + + diff --git a/README.md b/README.md index 936706d..732a899 100644 --- a/README.md +++ b/README.md @@ -37,7 +37,7 @@ * 第4章 PHP基础语法实现 * 4.1 运算符 * [4.2 选择结构](4/if.md) - * 4.3 循环结构 + * [4.3 循环结构](4/loop.md) * 4.4 跳转语句 * 第5章 内存管理 * [5.1 Zend内存池](5/zend_alloc.md) From 07507dd2f06a19a35262c362e86963a8b4b2b712 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Wed, 3 May 2017 18:41:05 +0800 Subject: [PATCH 196/379] fix error --- 2/zval.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2/zval.md b/2/zval.md index 3807501..dcd27d1 100644 --- a/2/zval.md +++ b/2/zval.md @@ -163,7 +163,7 @@ struct _zend_resource { 对象比较常见,资源指的是tcp连接、文件句柄等等类型,这种类型比较灵活,可以随意定义struct,通过ptr指向,后面会单独分析这种类型,这里不再多说。 #### 2.1.2.5 引用 -引用是PHP中比较特殊的一种类型,它实际是指向另外一个PHP变量,对它的修改会直接改动实际指向的zval,可以简单的理解为C中的指针,在PHP中通过`&`操作符产生一个引用变量,也就是说不管以前的类型是什么,`&`首先会将新生成一个zval,类型为IS_REFERENCE,然后将val的value指向原来zval的value。 +引用是PHP中比较特殊的一种类型,它实际是指向另外一个PHP变量,对它的修改会直接改动实际指向的zval,可以简单的理解为C中的指针,在PHP中通过`&`操作符产生一个引用变量,也就是说不管以前的类型是什么,`&`首先会创建一个`zend_reference`结构,其内嵌了一个zval,这个zval的value指向原来zval的value(如果是布尔、整形、浮点则直接复制原来的值),然后将原zval的类型修改为IS_REFERENCE,原zval的value指向新创建的`zend_reference`结构。 ```c struct _zend_reference { zend_refcounted_h gc; From 25b3255b530ffc4264eb0f5a6c5aedc7363ee324 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Wed, 3 May 2017 18:44:08 +0800 Subject: [PATCH 197/379] update --- 2/zval.md | 7 ------- 1 file changed, 7 deletions(-) diff --git a/2/zval.md b/2/zval.md index dcd27d1..afe479b 100644 --- a/2/zval.md +++ b/2/zval.md @@ -340,10 +340,3 @@ unset($a); ``` 具体的垃圾回收过程这里不再介绍,后面会单独分析。 -### 2.1.4 参考资料 - -[《Internal value representation in PHP 7 - Part 1》](https://nikic.github.io/2015/05/05/Internal-value-representation-in-PHP-7-part-1.html) - -[《Internal value representation in PHP 7 - Part 2》](https://nikic.github.io/2015/06/19/Internal-value-representation-in-PHP-7-part-2.html) - -[《PHP新的垃圾回收机制:Zend GC详解》](http://blog.csdn.net/phpkernel/article/details/5734743) From 5ce2169f72e7b0c6a5ee673de1467d5ecb2aa17d Mon Sep 17 00:00:00 2001 From: qinpeng Date: Thu, 4 May 2017 10:38:47 +0800 Subject: [PATCH 198/379] add foreach --- 4/loop.md | 38 ++++++++++++++++++++++++++++++++++++++ img/ast_foreach.png | Bin 0 -> 18639 bytes img/foreach_struct.png | Bin 0 -> 35422 bytes 3 files changed, 38 insertions(+) create mode 100644 img/ast_foreach.png create mode 100644 img/foreach_struct.png diff --git a/4/loop.md b/4/loop.md index 20facef..8a8255b 100644 --- a/4/loop.md +++ b/4/loop.md @@ -192,6 +192,44 @@ void zend_compile_for(zend_ast *ast) 运行时首先执行初始化表达式:init expression,然后执行`ZEND_JMP`跳到循环条件expression处,如果条件成立则执行`ZEND_JMPNZ`跳到循环体起始位置依次执行循环体、loop expression,如果条件不成立则终止循环,第一次循环之后就是:`循环条件->ZEND_JMPNZ->循环体->loop expression`之间循环了。 ### 4.3.4 foreach循环 +foreach是PHP针对数组、对象提供的一种遍历方式,foreach语法: +```php +foreach (array_expression as $key => $value){ + statement +} +``` +遍历arraiy_expression时每次循环会把当前单元的值赋给$value,当前单元的键值赋给$key,其中$key可以省略,$value前也可以加"&"表示引用单元的值。 + +foreach的语法规则: +```c +statement: + ... + //省略key的规则: foreach($array as $v){ ... } + | T_FOREACH '(' expr T_AS foreach_variable ')' foreach_statement + { $$ = zend_ast_create(ZEND_AST_FOREACH, $3, $5, NULL, $7); } + //有key的规则: foreach($array as $k=>$v){ ... } + | T_FOREACH '(' expr T_AS foreach_variable T_DOUBLE_ARROW foreach_variable ')' foreach_statement + { $$ = zend_ast_create(ZEND_AST_FOREACH, $3, $7, $5, $9); } + ... +; +``` +foreach在编译阶段解析为`ZEND_AST_FOREACH`节点,包含4个子节点,分别表示:遍历的数组或对象、遍历的value、遍历的key以及循环体,生成的AST类似这样: + +![](../img/ast_foreach.png) + +如果value是指向数组或对象成员的引用,则value对应的节点类型为`ZEND_AST_REF`。 + +相对上面几种常规的循环结构,foreach的实现略显复杂:$key、$value实际就是两个普通的局部变量,遍历的过程就是对两个局部变量不断赋值、更新的过程,以数组为例,首先将数组拷贝一份用于遍历(只拷贝zval,value还是指向同一份),从arData第一个元素开始,把Bucket.zval.value值赋值给$value,把Bucket.key(或Bucket.h)赋值给$key,然后更新迭代位置:将下一个元素的位置记录在`zval.u2.fe_iter_idx`中,这样下一轮遍历时直接从这个位置开始,这也是遍历前为什么要拷贝一份zval用于遍历的原因,如果发现`zval.u2.fe_iter_idx`已经到达arData末尾了则结束遍历,销毁一开始拷贝的zval。举个例子来看: + +```php +$arr = array(1,2,3); +foreach($arr as $k=>$v){ + echo $v; +} +``` +局部变量对应的内存结构: +![](../img/foreach_struct.png) +如果value是引用则在循环前首先将原数组或对象重置为引用类型,然后新分配一个zval指向这个引用,后面的过程就与上面的一致了。 diff --git a/img/ast_foreach.png b/img/ast_foreach.png new file mode 100644 index 0000000000000000000000000000000000000000..958bfaf4de4bee15fd805ed7c352c67a288de47c GIT binary patch literal 18639 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 literal 0 HcmV?d00001 From 614db6e85b07305c8b98e8b39e5ceb45286b49d3 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Thu, 4 May 2017 10:48:48 +0800 Subject: [PATCH 199/379] update --- 4/loop.md | 6 +++++- img/foreach_ref_struct.png | Bin 0 -> 40403 bytes 2 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 img/foreach_ref_struct.png diff --git a/4/loop.md b/4/loop.md index 8a8255b..3159141 100644 --- a/4/loop.md +++ b/4/loop.md @@ -231,5 +231,9 @@ foreach($arr as $k=>$v){ ![](../img/foreach_struct.png) -如果value是引用则在循环前首先将原数组或对象重置为引用类型,然后新分配一个zval指向这个引用,后面的过程就与上面的一致了。 +如果value是引用则在循环前首先将原数组或对象重置为引用类型,然后新分配一个zval指向这个引用,后面的过程就与上面的一致了,仍以上面的例子为例,如果是:`foreach($arr as $k=>&$v){ ... }`则: + +![](../img/foreach_ref_struct.png) + + diff --git a/img/foreach_ref_struct.png b/img/foreach_ref_struct.png new file mode 100644 index 0000000000000000000000000000000000000000..88836094d804d003022a7e9d46f331f4b42bfdb5 GIT binary patch literal 40403 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 literal 0 HcmV?d00001 From 82317e351c8a269eac4fdd1348b3e97e6ea0e733 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Thu, 4 May 2017 11:59:17 +0800 Subject: [PATCH 200/379] finish foreach --- 3/zend_prop.md | 4 ++-- 4/loop.md | 15 +++++++++++++++ img/foreach_ref_struct.png | Bin 40403 -> 40313 bytes img/foreach_run.png | Bin 0 -> 22905 bytes 4 files changed, 17 insertions(+), 2 deletions(-) create mode 100644 img/foreach_run.png diff --git a/3/zend_prop.md b/3/zend_prop.md index 61caf03..341cf06 100644 --- a/3/zend_prop.md +++ b/3/zend_prop.md @@ -75,9 +75,9 @@ found: ![](../img/zend_dy_prop.png) -> 这里不清楚将原有属性也插入properties的用意,已知用到的一个地方是在GC垃圾回收获取对象所有属性时(zend_std_get_gc()),如果有动态属性则直接返回properties给GC遍历,假如不把普通的显式定义的属性"拷贝"进来则需要返回、遍历两个数组。 +> __Note:__ 这里不清楚将原有属性也插入properties的用意,已知用到的一个地方是在GC垃圾回收获取对象所有属性时(zend_std_get_gc()),如果有动态属性则直接返回properties给GC遍历,假如不把普通的显式定义的属性"拷贝"进来则需要返回、遍历两个数组。 > -> 另外一个地方需要注意,把原属性"转移"到properties并不仅仅是创建动态属性时触发的,调用对象的get_properties(即:zend_std_get_properties())也会这么处理,比如将一个object转为array时就会触发这个动作: $arr = (array)$object; +> 另外一个地方需要注意,把原属性"转移"到properties并不仅仅是创建动态属性时触发的,调用对象的get_properties(即:zend_std_get_properties())也会这么处理,比如将一个object转为array时就会触发这个动作: $arr = (array)$object,通过foreach遍历一个对象时也会调用get_properties获取属性数组进行遍历。 成员属性的读取通过`zend_object->handlers->read_property`(默认zend_std_read_property())函数完成,动态属性的查找过程实际与`write_property`中相同: ```c diff --git a/4/loop.md b/4/loop.md index 3159141..c092e19 100644 --- a/4/loop.md +++ b/4/loop.md @@ -235,5 +235,20 @@ foreach($arr as $k=>$v){ ![](../img/foreach_ref_struct.png) +清楚了foreach的实现、运行机制我们再回头看下其编译过程: + +* (1) 编译"拷贝"数组/对象操作的opcode:`ZEND_FE_RESET_R`,如果value是引用则是`ZEND_FE_RESET_RW`,执行时如果发现数组或对象属性为空则直接跳出遍历,所以这条opcode还需要知道跳出的位置,这个位置需要编译完foreach以后才能确定; +* (2) 编译fetch数组/对象当前单元key、value的opcode:`ZEND_FE_FETCH_R`,如果是引用则是`ZEND_FE_FETCH_RW`,此opcode还需要知道当遍历已经到达数组末尾时跳出遍历的位置,与步骤(1)的opcode相同,另外还有一个关键操作,前面已经说过遍历的key、value实际就是普通的局部变量,它们的内存存储位置正是在这一步分配确定的,分配过程与普通局部变量的过程完全相同,如果value不是一个CV变量(比如:foreach($arr as $v["xx"]){...})则还会编译其它操作的opcode; +* (3) 如果foreach定义了key则编译一条赋值opcode,此操作是对key进行赋值; +* (4) 编译循环体statement; +* (5) 编译跳回遍历开始位置的opcode:`ZEND_JMP`,一次遍历结束时会跳回步骤(2)编译的opcode处进行下次遍历; +* (6) 设置步骤(1)、(2)两条opcode跳过的opcode数; +* (7) 编译`ZEND_FE_FREE`,此操作用于释放步骤(1)"拷贝"的数组。 + +最终编译后的结构: + +![](../img/foreach_run.png) + + diff --git a/img/foreach_ref_struct.png b/img/foreach_ref_struct.png index 88836094d804d003022a7e9d46f331f4b42bfdb5..ec1317318915d5554c38fc235f87e860b0af6c9b 100644 GIT binary patch literal 40313 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 literal 40403 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 diff --git a/img/foreach_run.png b/img/foreach_run.png new file mode 100644 index 0000000000000000000000000000000000000000..1372eb8613fbf941acd09bf925e69fc92fa22f3c GIT binary patch literal 22905 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 literal 0 HcmV?d00001 From bc4fca2c8d88f372337751e58c0be24d3ee17df0 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Thu, 4 May 2017 12:10:16 +0800 Subject: [PATCH 201/379] update --- 4/loop.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/4/loop.md b/4/loop.md index c092e19..5db3e00 100644 --- a/4/loop.md +++ b/4/loop.md @@ -249,6 +249,12 @@ foreach($arr as $k=>$v){ ![](../img/foreach_run.png) - +运行时的步骤: +* (1) 执行`ZEND_FE_RESET_R`,过程上面已经介绍了; +* (2) 执行`ZEND_FE_FETCH_R`,此opcode的操作主要有三个:检查遍历位置是否到达末尾、将数组元素的value赋值给$value、将数组元素的key赋值给一个临时变量(注意与value不同); +* (3) 如果定义了key则执行`ZEND_ASSIGN`,将key的值从临时变量赋值给$key,否则跳到步骤(4); +* (4) 执行循环体的statement; +* (5) 执行`ZEND_JMPNZ`跳回步骤(2); +* (6) 遍历结束后执行`ZEND_FE_FREE`释放数组。 From a5fe0f3385a448d80645cb6ce79431e07e4777cf Mon Sep 17 00:00:00 2001 From: qinpeng Date: Thu, 4 May 2017 13:14:30 +0800 Subject: [PATCH 202/379] update --- 4/loop.md | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/4/loop.md b/4/loop.md index 5db3e00..73cc6f1 100644 --- a/4/loop.md +++ b/4/loop.md @@ -235,26 +235,26 @@ foreach($arr as $k=>$v){ ![](../img/foreach_ref_struct.png) -清楚了foreach的实现、运行机制我们再回头看下其编译过程: +了解了foreach的实现、运行机制我们再回头看下其编译过程: -* (1) 编译"拷贝"数组/对象操作的opcode:`ZEND_FE_RESET_R`,如果value是引用则是`ZEND_FE_RESET_RW`,执行时如果发现数组或对象属性为空则直接跳出遍历,所以这条opcode还需要知道跳出的位置,这个位置需要编译完foreach以后才能确定; -* (2) 编译fetch数组/对象当前单元key、value的opcode:`ZEND_FE_FETCH_R`,如果是引用则是`ZEND_FE_FETCH_RW`,此opcode还需要知道当遍历已经到达数组末尾时跳出遍历的位置,与步骤(1)的opcode相同,另外还有一个关键操作,前面已经说过遍历的key、value实际就是普通的局部变量,它们的内存存储位置正是在这一步分配确定的,分配过程与普通局部变量的过程完全相同,如果value不是一个CV变量(比如:foreach($arr as $v["xx"]){...})则还会编译其它操作的opcode; -* (3) 如果foreach定义了key则编译一条赋值opcode,此操作是对key进行赋值; -* (4) 编译循环体statement; -* (5) 编译跳回遍历开始位置的opcode:`ZEND_JMP`,一次遍历结束时会跳回步骤(2)编译的opcode处进行下次遍历; -* (6) 设置步骤(1)、(2)两条opcode跳过的opcode数; -* (7) 编译`ZEND_FE_FREE`,此操作用于释放步骤(1)"拷贝"的数组。 +* __(1)__ 编译"拷贝"数组/对象操作的opcode:`ZEND_FE_RESET_R`,如果value是引用则是`ZEND_FE_RESET_RW`,执行时如果发现数组或对象属性为空则直接跳出遍历,所以这条opcode还需要知道跳出的位置,这个位置需要编译完foreach以后才能确定; +* __(2)__ 编译fetch数组/对象当前单元key、value的opcode:`ZEND_FE_FETCH_R`,如果是引用则是`ZEND_FE_FETCH_RW`,此opcode还需要知道当遍历已经到达数组末尾时跳出遍历的位置,与步骤(1)的opcode相同,另外还有一个关键操作,前面已经说过遍历的key、value实际就是普通的局部变量,它们的内存存储位置正是在这一步分配确定的,分配过程与普通局部变量的过程完全相同,如果value不是一个CV变量(比如:foreach($arr as $v["xx"]){...})则还会编译其它操作的opcode; +* __(3)__ 如果foreach定义了key则编译一条赋值opcode,此操作是对key进行赋值; +* __(4)__ 编译循环体statement; +* __(5)__ 编译跳回遍历开始位置的opcode:`ZEND_JMP`,一次遍历结束时会跳回步骤(2)编译的opcode处进行下次遍历; +* __(6)__ 设置步骤(1)、(2)两条opcode跳过的opcode数; +* __(7)__ 编译`ZEND_FE_FREE`,此操作用于释放步骤(1)"拷贝"的数组。 最终编译后的结构: ![](../img/foreach_run.png) 运行时的步骤: -* (1) 执行`ZEND_FE_RESET_R`,过程上面已经介绍了; -* (2) 执行`ZEND_FE_FETCH_R`,此opcode的操作主要有三个:检查遍历位置是否到达末尾、将数组元素的value赋值给$value、将数组元素的key赋值给一个临时变量(注意与value不同); -* (3) 如果定义了key则执行`ZEND_ASSIGN`,将key的值从临时变量赋值给$key,否则跳到步骤(4); -* (4) 执行循环体的statement; -* (5) 执行`ZEND_JMPNZ`跳回步骤(2); -* (6) 遍历结束后执行`ZEND_FE_FREE`释放数组。 +* __(1)__ 执行`ZEND_FE_RESET_R`,过程上面已经介绍了; +* __(2)__ 执行`ZEND_FE_FETCH_R`,此opcode的操作主要有三个:检查遍历位置是否到达末尾、将数组元素的value赋值给$value、将数组元素的key赋值给一个临时变量(注意与value不同); +* __(3)__ 如果定义了key则执行`ZEND_ASSIGN`,将key的值从临时变量赋值给$key,否则跳到步骤(4); +* __(4)__ 执行循环体的statement; +* __(5)__ 执行`ZEND_JMPNZ`跳回步骤(2); +* __(6)__ 遍历结束后执行`ZEND_FE_FREE`释放数组。 From dab2e7116376289f8e3b48eeec3b622352edb778 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Thu, 4 May 2017 15:18:10 +0800 Subject: [PATCH 203/379] update --- 4/loop.md | 8 ++++++++ README.md | 6 ++++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/4/loop.md b/4/loop.md index 73cc6f1..38ab0cc 100644 --- a/4/loop.md +++ b/4/loop.md @@ -257,4 +257,12 @@ foreach($arr as $k=>$v){ * __(5)__ 执行`ZEND_JMPNZ`跳回步骤(2); * __(6)__ 遍历结束后执行`ZEND_FE_FREE`释放数组。 +PHP中还有几个与遍历相关的函数: + +* current() - 返回数组中的当前单元 +* each() - 返回数组中当前的键/值对并将数组指针向前移动一步 +* end() - 将数组的内部指针指向最后一个单元 +* next() - 将数组中的内部指针向前移动一位 +* prev() - 将数组的内部指针倒回一位 + diff --git a/README.md b/README.md index 732a899..2d0ec8d 100644 --- a/README.md +++ b/README.md @@ -35,10 +35,12 @@ * [3.4.7 类的自动加载](3/zend_autoload.md) * [3.5 运行时缓存](3/zend_runtime_cache.md) * 第4章 PHP基础语法实现 - * 4.1 运算符 + * 4.1 表达式运算 * [4.2 选择结构](4/if.md) * [4.3 循环结构](4/loop.md) - * 4.4 跳转语句 + * 4.4 中断及跳转 + * 4.5 include/require + * 4.6 try-catch * 第5章 内存管理 * [5.1 Zend内存池](5/zend_alloc.md) * 5.2 引用计数 From 3b5fcd41e416614bfda29a9cf19619857762b3e9 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Thu, 4 May 2017 17:13:29 +0800 Subject: [PATCH 204/379] add break --- 4/break.md | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ 4/loop.md | 4 ++++ 2 files changed, 55 insertions(+) create mode 100644 4/break.md diff --git a/4/break.md b/4/break.md new file mode 100644 index 0000000..90b0ffd --- /dev/null +++ b/4/break.md @@ -0,0 +1,51 @@ +## 4.4 中断及跳转 +PHP中的中断及跳转语句主要有break、continue、goto,这几种语句的实现基础都是跳转。 + +### 4.4.1 break与continue +break用于结束当前for、foreach、while、do-while 或者 switch 结构的执行;continue用于跳过本次循环中剩余代码,进行下一轮循环。break、continue是非常相像的,它们都可以接受一个可选数字参数来决定跳过的循环层数,两者的不同点在于break是跳到循环结束的位置,而continue是跳到循环判断条件的位置,本质在于跳转位置的不同。 + +break、continue的实现稍微有些复杂, + +```c +void zend_compile_break_continue(zend_ast *ast) +{ + zend_ast *depth_ast = ast->child[0]; + + zend_op *opline; + int depth; + + if (depth_ast) { + zval *depth_zv; + if (depth_ast->kind != ZEND_AST_ZVAL) { + zend_error_noreturn(E_COMPILE_ERROR, "'%s' operator with non-constant operand " + "is no longer supported", ast->kind == ZEND_AST_BREAK ? "break" : "continue"); + } + + depth_zv = zend_ast_get_zval(depth_ast); + if (Z_TYPE_P(depth_zv) != IS_LONG || Z_LVAL_P(depth_zv) < 1) { + zend_error_noreturn(E_COMPILE_ERROR, "'%s' operator accepts only positive numbers", + ast->kind == ZEND_AST_BREAK ? "break" : "continue"); + } + + depth = Z_LVAL_P(depth_zv); + } else { + depth = 1; + } + + if (CG(context).current_brk_cont == -1) { + zend_error_noreturn(E_COMPILE_ERROR, "'%s' not in the 'loop' or 'switch' context", + ast->kind == ZEND_AST_BREAK ? "break" : "continue"); + } else { + if (!zend_handle_loops_and_finally_ex(depth)) { + zend_error_noreturn(E_COMPILE_ERROR, "Cannot '%s' %d level%s", + ast->kind == ZEND_AST_BREAK ? "break" : "continue", + depth, depth == 1 ? "" : "s"); + } + } + opline = zend_emit_op(NULL, ast->kind == ZEND_AST_BREAK ? ZEND_BRK : ZEND_CONT, NULL, NULL); + opline->op1.num = CG(context).current_brk_cont; //所在循环层 + opline->op2.num = depth; //要跳出的层数 +} +``` + +### 4.4.2 goto diff --git a/4/loop.md b/4/loop.md index 38ab0cc..19ce394 100644 --- a/4/loop.md +++ b/4/loop.md @@ -45,6 +45,8 @@ void zend_compile_while(zend_ast *ast) //(1)编译ZEND_JMP opnum_jmp = zend_emit_jump(0); + + zend_begin_loop(ZEND_NOP, NULL); //(2)编译循环体statement,opnum_start为循环体起始位置 opnum_start = get_next_op_number(CG(active_op_array)); @@ -59,6 +61,8 @@ void zend_compile_while(zend_ast *ast) //(4)编译ZEND_JMPNZ,用于循环条件成立时跳回循环体开始位置:opnum_start zend_emit_cond_jump(ZEND_JMPNZ, &cond_node, opnum_start); + + zend_end_loop(opnum_cond); } ``` 编译后opcode整体如下: From 69b8a5bf4d017807049392909e0e3fc2d3f6dfee Mon Sep 17 00:00:00 2001 From: qinpeng Date: Thu, 4 May 2017 19:15:22 +0800 Subject: [PATCH 205/379] update break --- 4/break.md | 39 ++++++++++++++++++++++++++++++++++++++- img/loop_op.png | Bin 0 -> 43239 bytes 2 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 img/loop_op.png diff --git a/4/break.md b/4/break.md index 90b0ffd..beffd83 100644 --- a/4/break.md +++ b/4/break.md @@ -4,7 +4,44 @@ PHP中的中断及跳转语句主要有break、continue、goto,这几种语句 ### 4.4.1 break与continue break用于结束当前for、foreach、while、do-while 或者 switch 结构的执行;continue用于跳过本次循环中剩余代码,进行下一轮循环。break、continue是非常相像的,它们都可以接受一个可选数字参数来决定跳过的循环层数,两者的不同点在于break是跳到循环结束的位置,而continue是跳到循环判断条件的位置,本质在于跳转位置的不同。 -break、continue的实现稍微有些复杂, +break、continue的实现稍微有些复杂,下面具体介绍下其编译过程。 + +上一节我们已经介绍过循环语句的编译,其中在各种循环编译过程中有两个特殊操作:zend_begin_loop()、zend_end_loop(),分别在循环编译前以及编译后调用,这两步操作就是为break、continue服务的。 + +在每层循环编译时都会创建一个`zend_brk_cont_element`的结构: +```c +typedef struct _zend_brk_cont_element { + int start; + int cont; + int brk; + int parent; +} zend_brk_cont_element; +``` +cont记录的是当前循环判断条件opcode起始位置,brk记录的是当前循环结束的位置,parent记录的是父层循环`zend_brk_cont_element`结构的存储位置,也就是说多层嵌套循环会生成一个`zend_brk_cont_element`的链表,每层循环编译结束时更新自己的`zend_brk_cont_element`结构,所以break、continue的处理过程实际就是根据跳出的层级索引到那一层的`zend_brk_cont_element`结构,然后得到它的cont、brk进行相应的opcode跳转。 + +各循环的`zend_brk_cont_element`结构保存在`zend_op_array->brk_cont_array`数组中,实际这个数组在编译前就已经分配好了,编译各循环时依次申请一个`zend_brk_cont_element`,`zend_op_array->last_brk_cont`记录此数组第一个可用位置,每申请一个元素last_brk_cont就相应的增加1,parent记录的就是父层循环在`zend_op_array->brk_cont_array`中的位置。 + +示例: +```php +$i = 0; +while(1){ + while(1){ + if($i > 10){ + break 2; + } + ++$i + } +} +``` +循环编译完以后对应的内存结构: + +![](../img/loop_op.png) + +介绍完编译循环结构时为break、continue做的准备,接下来我们具体分析下break、continue的编译。 + +有了前面的准备,break、continue的编译过程就比较简单了,主要就是各生成一条临时opcode:ZEND_BRK、ZEND_CONT,这条opcode记录着两个重要信息: +* __op1:__ 记录着当前循环`zend_brk_cont_element`结构的存储位置(在循环编译过程中CG(context).current_brk_cont记录着当前循环zend_brk_cont_element的位置) +* __op2:__ 记录着要跳出循环的层级,如果break/continue没有加数字,则默认为1 ```c void zend_compile_break_continue(zend_ast *ast) diff --git a/img/loop_op.png b/img/loop_op.png new file mode 100644 index 0000000000000000000000000000000000000000..ed0995b6ce56f446d66f6e57488abdb89e5194d7 GIT binary patch literal 43239 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 Date: Thu, 4 May 2017 20:30:29 +0800 Subject: [PATCH 206/379] finish break --- 4/break.md | 90 +++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 68 insertions(+), 22 deletions(-) diff --git a/4/break.md b/4/break.md index beffd83..79a25cb 100644 --- a/4/break.md +++ b/4/break.md @@ -53,35 +53,81 @@ void zend_compile_break_continue(zend_ast *ast) if (depth_ast) { zval *depth_zv; - if (depth_ast->kind != ZEND_AST_ZVAL) { - zend_error_noreturn(E_COMPILE_ERROR, "'%s' operator with non-constant operand " - "is no longer supported", ast->kind == ZEND_AST_BREAK ? "break" : "continue"); - } - - depth_zv = zend_ast_get_zval(depth_ast); - if (Z_TYPE_P(depth_zv) != IS_LONG || Z_LVAL_P(depth_zv) < 1) { - zend_error_noreturn(E_COMPILE_ERROR, "'%s' operator accepts only positive numbers", - ast->kind == ZEND_AST_BREAK ? "break" : "continue"); - } - + ... depth = Z_LVAL_P(depth_zv); } else { depth = 1; } + ... + + //生成opcode + opline = zend_emit_op(NULL, ast->kind == ZEND_AST_BREAK ? ZEND_BRK : ZEND_CONT, NULL, NULL); + opline->op1.num = CG(context).current_brk_cont; //break、continue所在循环层 + opline->op2.num = depth; //要跳出的层数 +} +``` +`zend_compile_break_continue()`到这一步完成整个break、continue的编译还没有完成,因为`CG(active_op_array)->brk_cont_array`这个数组只是编译期间使用的一个临时结构,break、continue编译生成的opcode:ZEND_BRK、ZEND_CONT并不是运行时直接执行的,这条opcode在整个脚本编译完成后、执行前被优化为 __ZEND_JMP__ ,这个操作在`pass_two()`中完成,关于这个过程在《3.1.2.2 AST->zend_op_array》一节曾经介绍过。 - if (CG(context).current_brk_cont == -1) { - zend_error_noreturn(E_COMPILE_ERROR, "'%s' not in the 'loop' or 'switch' context", - ast->kind == ZEND_AST_BREAK ? "break" : "continue"); - } else { - if (!zend_handle_loops_and_finally_ex(depth)) { - zend_error_noreturn(E_COMPILE_ERROR, "Cannot '%s' %d level%s", - ast->kind == ZEND_AST_BREAK ? "break" : "continue", - depth, depth == 1 ? "" : "s"); +```c +ZEND_API zend_op_array *compile_file(zend_file_handle *file_handle, int type) +{ + //语法解析 + zendparse(); + + //AST->opcodes + zend_compile_top_stmt(CG(ast)); + + pass_two(op_array); + ... +} +``` +```c +ZEND_API int pass_two(zend_op_array *op_array) +{ + ... + + opline = op_array->opcodes; + end = opline + op_array->last; + while (opline < end) { + switch (opline->opcode) { + ... + case ZEND_BRK: + case ZEND_CONT: + { + //计算跳转位置 + uint32_t jmp_target = zend_get_brk_cont_target(op_array, opline); + ... + //将opcode修改为ZEND_JMP + opline->opcode = ZEND_JMP; + opline->op1.opline_num = jmp_target; + opline->op2.num = 0; + + //将绝对跳转opcode位置修改为相对当前opcode的位置 + ZEND_PASS_TWO_UPDATE_JMP_TARGET(op_array, opline, opline->op1); + } + break; + ... } } - opline = zend_emit_op(NULL, ast->kind == ZEND_AST_BREAK ? ZEND_BRK : ZEND_CONT, NULL, NULL); - opline->op1.num = CG(context).current_brk_cont; //所在循环层 - opline->op2.num = depth; //要跳出的层数 + + op_array->fn_flags |= ZEND_ACC_DONE_PASS_TWO; + return 0; +} +``` +从上面的过程可以看出,如果opcode为:ZEND_BRK或ZEND_CONT则统一设置opcode为`ZEND_JMP`,新opcode的op1记录的是break、continue跳到opcode的位置,这个值根据编译期间的`zend_brk_cont_element`计算得到,首先从op1、op2取出break、continue所在循环的zend_brk_cont_element结构以及要跳过的层级,然后根据`zend_brk_cont_element.parent`及层级数找到具体要跳出层的`zend_brk_cont_element`结构,从这个结构中获得那层循环判断条件及循环结束的opcode的位置。 +```c +static uint32_t zend_get_brk_cont_target(const zend_op_array *op_array, const zend_op *opline) { + int nest_levels = opline->op2.num; //跳出的层级:break n; + int array_offset = opline->op1.num;//break、continue所属循环zend_brk_cont_element的存储下标 + zend_brk_cont_element *jmp_to; + do { + jmp_to = &op_array->brk_cont_array[array_offset]; + if (nest_levels > 1) { + array_offset = jmp_to->parent; + } + } while (--nest_levels > 0); + + return opline->opcode == ZEND_BRK ? jmp_to->brk : jmp_to->cont; } ``` From 411273290d79a10a1e220667edb36a38d8bae8cb Mon Sep 17 00:00:00 2001 From: qinpeng Date: Thu, 4 May 2017 20:43:30 +0800 Subject: [PATCH 207/379] add goto --- 4/break.md | 9 +++++++++ img/break_run.png | Bin 0 -> 21295 bytes 2 files changed, 9 insertions(+) create mode 100644 img/break_run.png diff --git a/4/break.md b/4/break.md index 79a25cb..7de3da9 100644 --- a/4/break.md +++ b/4/break.md @@ -130,5 +130,14 @@ static uint32_t zend_get_brk_cont_target(const zend_op_array *op_array, const ze return opline->opcode == ZEND_BRK ? jmp_to->brk : jmp_to->cont; } ``` +上面那个例子最终执行前的opcode如下图: + +![](../img/break_run.png) + +执行时直接跳到对应的opcode位置即可。 ### 4.4.2 goto +goto 操作符可以用来跳转到程序中的另一位置。该目标位置可以用目标名称加上冒号来标记,而跳转指令是 goto 之后接上目标位置的标记。PHP 中的 goto 有一定限制,目标位置只能位于同一个文件和作用域,也就是说无法跳出一个函数或类方法,也无法跳入到另一个函数,可以跳出循环但无法跳入循环,多层循环中通常会用goto代替多层break。 + + + diff --git a/img/break_run.png b/img/break_run.png new file mode 100644 index 0000000000000000000000000000000000000000..db1a9c4f0b88196984724a10582343b5c0f2b224 GIT binary patch literal 21295 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

roR1m=dM5!-3(ugPjD)F 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 NbN8M`wVHj@zX2N7&^iDB literal 0 HcmV?d00001 From 978086adb5738d8bfd4bc036bc57bd53f40304a2 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Thu, 4 May 2017 20:46:18 +0800 Subject: [PATCH 208/379] update img --- img/break_run.png | Bin 21295 -> 23759 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/img/break_run.png b/img/break_run.png index db1a9c4f0b88196984724a10582343b5c0f2b224..1d62d8c3c8266997d996e4c61e1e37b56c71190a 100644 GIT binary patch literal 23759 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 Vq-j=QG|(f5;7`@%QL?6i{{t-VNO}MO literal 21295 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

roR1m=dM5!-3(ugPjD)F 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 NbN8M`wVHj@zX2N7&^iDB From e06123054cfecbc4f099323aed97096c2f98ee11 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Fri, 5 May 2017 15:18:14 +0800 Subject: [PATCH 209/379] add break --- 4/break.md | 73 +++++++++++++++++++++++++++++++++++++++++++++++++++++- README.md | 2 +- 2 files changed, 73 insertions(+), 2 deletions(-) diff --git a/4/break.md b/4/break.md index 7de3da9..71431f5 100644 --- a/4/break.md +++ b/4/break.md @@ -136,8 +136,79 @@ static uint32_t zend_get_brk_cont_target(const zend_op_array *op_array, const ze 执行时直接跳到对应的opcode位置即可。 +```` +在多层循环中break、continue直接根据层级数字跳转很不方便,这点PHP可以借鉴Golang的语法:break/continue + LABEL,支持按标签break、continue,根据上一节及本节介绍的内容这一个实现起来并不复杂,有兴趣的可以思考下如何实现。 +```` + ### 4.4.2 goto -goto 操作符可以用来跳转到程序中的另一位置。该目标位置可以用目标名称加上冒号来标记,而跳转指令是 goto 之后接上目标位置的标记。PHP 中的 goto 有一定限制,目标位置只能位于同一个文件和作用域,也就是说无法跳出一个函数或类方法,也无法跳入到另一个函数,可以跳出循环但无法跳入循环,多层循环中通常会用goto代替多层break。 +goto 操作符可以用来跳转到程序中的另一位置。该目标位置可以用目标名称加上冒号来标记,而跳转指令是 goto 之后接上目标位置的标记。PHP 中的 goto 有一定限制,目标位置只能位于同一个文件和作用域,也就是说无法跳出一个函数或类方法,也无法跳入到另一个函数,可以跳出循环但无法跳入循环(可以在同一层循环中跳转),多层循环中通常会用goto代替多层break。 + +goto语法: +```php +goto LABEL; + +LABEL: + statement; +``` +goto与label需要组合使用,其实现与break、continue类似,最终也是被优化为`ZEND_JMP`,首先看下定义一个label时都有哪些操作: +```c +statement: + ... + + | T_STRING ':' { $$ = zend_ast_create(ZEND_AST_LABEL, $1); } +; +``` +label的编译过程非常简单,与循环结构的编译类似,编译时会把label插入`CG(context).labels`哈希表中,key就是label名称,value是一个`zend_label`结构: +```c +typedef struct _zend_label { + int brk_cont; //当前label所在循环 + uint32_t opline_num; //下一条opcode位置 +} zend_label; +``` +brk_cont用于记录当前label所在的循环,这个值就是上面介绍的每个循环在`zend_op_array->brk_cont_array`数组中的位置;opline_num比较容易理解,就是label下面第一条opcode的位置。到这里你应该能猜得到goto的工作过程了,首先根据label名称在`CG(context).labels`查找到跳转label的`zend_label`结构,然后jmp到`zend_label.opline_num`的位置,brk_cont的作用是用来判断是不是goto到了另一层循环中去。label具体的编译过程: +```c +void zend_compile_label(zend_ast *ast) +{ + zend_string *label = zend_ast_get_str(ast->child[0]); + zend_label dest; + + //编译时会将label插入CG(context).labels哈希表 + if (!CG(context).labels) { + ALLOC_HASHTABLE(CG(context).labels); + zend_hash_init(CG(context).labels, 8, NULL, label_ptr_dtor, 0); + } + + //设置label信息:当前所在循环、下一条opcode编号 + dest.brk_cont = CG(context).current_brk_cont; + dest.opline_num = get_next_op_number(CG(active_op_array)); + + if (!zend_hash_add_mem(CG(context).labels, label, &dest, sizeof(zend_label))) { + zend_error_noreturn(E_COMPILE_ERROR, "Label '%s' already defined", ZSTR_VAL(label)); + } +} +``` +goto的编译过程: +```c +void zend_compile_goto(zend_ast *ast) +{ + zend_ast *label_ast = ast->child[0]; + znode label_node; + zend_op *opline; + uint32_t opnum_start = get_next_op_number(CG(active_op_array)); + + zend_compile_expr(&label_node, label_ast); + + //如果当前在一个循环内则有的情况下是不能简单跳出循环的 + zend_handle_loops_and_finally(); + //编译一条临时opcode:ZEND_GOTO + opline = zend_emit_op(NULL, ZEND_GOTO, NULL, &label_node); + opline->op1.num = get_next_op_number(CG(active_op_array)) - opnum_start - 1; + opline->extended_value = CG(context).current_brk_cont; +} +``` +goto初步被编译为`ZEND_GOTO`,其中label名称保存在op2,extended_value记录的是goto所在循环,如果没有在循环中这个值就等于-1,op1比较特殊,从上面编译的过程分析,它的值等于goto之间的opcode数,goto只编译了一条`ZEND_GOTO`哪来的其他opcode呢?这种情况就是goto在一个循环中,上一节介绍的循环结构中有一个比较特殊:foreach,它在遍历前会新生成一个zval用于遍历,这个zval是在循环结束时才被释放,假如foreach循环体中执行了goto,直接像普通跳转一样跳到了别的位置,那么这个zval就无法释放了,所以这种情况下在goto跳转前需要先执行这些收尾的opcode,这些opcode就是上面`zend_handle_loops_and_finally()`编译的,具体的细节这里不再展开,有兴趣的可以仔细研究下foreach编译时`zend_begin_loop()`的特殊处理。 + +后面的处理就与break、continue一样了,在`pass_two()`中`ZEND_GOTO`被重置为`ZEND_JMP`,具体的处理过程在`zend_resolve_goto_label()`,比较简单,不再赘述。 diff --git a/README.md b/README.md index 2d0ec8d..29a81fb 100644 --- a/README.md +++ b/README.md @@ -38,7 +38,7 @@ * 4.1 表达式运算 * [4.2 选择结构](4/if.md) * [4.3 循环结构](4/loop.md) - * 4.4 中断及跳转 + * [4.4 中断及跳转](4/break.md) * 4.5 include/require * 4.6 try-catch * 第5章 内存管理 From 7cb468723e78034f1f88060240c0ed39a4a03b09 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Fri, 5 May 2017 15:19:41 +0800 Subject: [PATCH 210/379] update --- 4/break.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/4/break.md b/4/break.md index 71431f5..e6d8b7b 100644 --- a/4/break.md +++ b/4/break.md @@ -136,9 +136,9 @@ static uint32_t zend_get_brk_cont_target(const zend_op_array *op_array, const ze 执行时直接跳到对应的opcode位置即可。 -```` -在多层循环中break、continue直接根据层级数字跳转很不方便,这点PHP可以借鉴Golang的语法:break/continue + LABEL,支持按标签break、continue,根据上一节及本节介绍的内容这一个实现起来并不复杂,有兴趣的可以思考下如何实现。 -```` +> __Note:__ +> +> 在多层循环中break、continue直接根据层级数字跳转很不方便,这点PHP可以借鉴Golang的语法:break/continue + LABEL,支持按标签break、continue,根据上一节及本节介绍的内容这一个实现起来并不复杂,有兴趣的可以思考下如何实现。 ### 4.4.2 goto goto 操作符可以用来跳转到程序中的另一位置。该目标位置可以用目标名称加上冒号来标记,而跳转指令是 goto 之后接上目标位置的标记。PHP 中的 goto 有一定限制,目标位置只能位于同一个文件和作用域,也就是说无法跳出一个函数或类方法,也无法跳入到另一个函数,可以跳出循环但无法跳入循环(可以在同一层循环中跳转),多层循环中通常会用goto代替多层break。 From 59f69ae76317a8dbe9d906b98216e64a8344062d Mon Sep 17 00:00:00 2001 From: qinpeng Date: Fri, 5 May 2017 18:10:36 +0800 Subject: [PATCH 211/379] update executor --- 3/zend_executor.md | 3 +++ 4/include.md | 8 ++++++++ img/symbol_cv.png | Bin 0 -> 18172 bytes 3 files changed, 11 insertions(+) create mode 100644 4/include.md create mode 100644 img/symbol_cv.png diff --git a/3/zend_executor.md b/3/zend_executor.md index f24a192..d589492 100644 --- a/3/zend_executor.md +++ b/3/zend_executor.md @@ -209,6 +209,9 @@ static zend_always_inline void i_init_execute_data(zend_execute_data *execute_da } } ``` +`zend_attach_symbol_table()`的作用是把当前作用域下的变量添加到EG(symbol_table)哈希表中,也就是全局变量,函数中通过global关键词获取的全局变量正是在此时添加的,EG(symbol_table)中的值间接的指向`zend_execute_data`中的局部变量,两者的结构如下图所示: + +![](../img/symbol_cv.png) #### (3)执行opcode 这一步开始具体执行opcode指令,这里调用的是`zend_execute_ex`,这是一个函数指针,如果此指针没有被任何扩展重新定义那么将由默认的`execute_ex`处理: diff --git a/4/include.md b/4/include.md new file mode 100644 index 0000000..5edcee2 --- /dev/null +++ b/4/include.md @@ -0,0 +1,8 @@ +## 4.5 include/require + + +调用文件的变量范围将全部被包含文件所继承,具体实现: + +include文件在attach_symbol_table()时如果发现要插入的全局变量已经存在,则会将新的全局变量的value指向原value,然后将全局变量更新为新的全局变量。 + +include执行完成return时zend_detach_symbol_table()时会将所有的全局变量的value拷到EG(symbol_table)中(CV->symbol table),原调用文件重新attach,这样会把include文件中的全局变量移到当前文件,如果include中修改了原文件的全局变量,此时也会将更新后的value重新赋给原文件的变量(symbol table -> CV)。 diff --git a/img/symbol_cv.png b/img/symbol_cv.png new file mode 100644 index 0000000000000000000000000000000000000000..7af9c20237eaa3abf599055ef1a6394f847a09dd GIT binary patch literal 18172 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 literal 0 HcmV?d00001 From d9ee349de8f27a5e68afb3e1bf80c6cfb0611720 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Fri, 5 May 2017 18:13:46 +0800 Subject: [PATCH 212/379] update --- README.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 29a81fb..a58ccba 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,9 @@ # PHP7内核剖析 -(更新中...) -文中涉及代码版本:php-7.0.12 +```` +(持续更新中...) 代码版本:php-7.0.12 + +原创内容,转载请注明出处! +```` ## 目录: * 第1章 PHP基本架构 From c83992cd7c05b82e31a3340586669c6b1aa96e37 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Sat, 6 May 2017 10:13:20 +0800 Subject: [PATCH 213/379] update --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index a58ccba..13b5c41 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ # PHP7内核剖析 ```` -(持续更新中...) 代码版本:php-7.0.12 +__原创内容,转载请注明出处!__ -原创内容,转载请注明出处! +(持续更新中...) 代码版本:php-7.0.12 ```` ## 目录: From aa125b0708e9909810e088ab63ced0717edb7c35 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Sat, 6 May 2017 10:14:17 +0800 Subject: [PATCH 214/379] update Read --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 13b5c41..d1ae006 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ # PHP7内核剖析 ```` -__原创内容,转载请注明出处!__ +原创内容,转载请注明出处~ -(持续更新中...) 代码版本:php-7.0.12 +代码版本:php-7.0.12 ```` ## 目录: From 84d585a52e277d315a6113d6ffe19c4bf4d2b8e0 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Sat, 6 May 2017 16:48:32 +0800 Subject: [PATCH 215/379] update --- 4/include.md | 99 +++++++++++++++++++++++++++++++++++++++++++++++- img/include.png | Bin 0 -> 15169 bytes 2 files changed, 98 insertions(+), 1 deletion(-) create mode 100644 img/include.png diff --git a/4/include.md b/4/include.md index 5edcee2..faeba70 100644 --- a/4/include.md +++ b/4/include.md @@ -1,7 +1,104 @@ ## 4.5 include/require +在实际应用中,我们不可能把所有的代码写到一个文件中,而是会按照一定的标准进行文件划分,include与require的功能就是将其他文件加载进来,比如在面向对象中通常会把一个类定义在单独文件中,使用时再include进来,类似其他语言的包的概念。 +include与require没有本质上的区别,唯一的不同在于错误级别,当文件无法被正常加载时include会抛出warning警告,而require则会抛出error错误,本节下面的内容将以include说明。 -调用文件的变量范围将全部被包含文件所继承,具体实现: +在分析include的实现过程之前,首先要明确include的基本用法及特点: + +* 被包含的文件将继承include所在行具有的全部变量范围,比如调用文件前面定义了一些变量,那么这些变量就能够在被包含的文件中使用,反之,被包含文件中定义的变量也将从include调用处开始可以被被调用文件所使用。 +* 被包含文件中定义的函数、类在include执行之后将可以被随处使用,即具有全局作用域。 +* include是在运行时加载文件并执行的,而不是在编译时。 + +这几个特性可以理解为include就是把其它文件的内容拷贝到了调用文件中,类似C语言中的宏(当然执行的时候并不是这样),举个例子来说明: +```php +//a.php +$var_1 = "hi"; +$var_2 = array(1,2,3); + +include 'b.php'; + +var_dump($var_2); +var_dump($var_3); + +//b.php +$var_2 = array(); +$var_3 = 9; +``` +执行`php a.php`结果显示$var_2值被修改为array()了,而include文件中新定义的$var_3也可以在调用文件中使用。 + +接下来我们就以这个例子详细介绍下include具体是如何实现的。 + +![zend_compile_process](../img/zend_compile_process.png) + +前面我们曾介绍过Zend引擎的编译、执行两个阶段(见上图),整个过程的输入是一个文件,然后经过`PHP代码->AST->Opcodes->execute`一系列过程完成整个处理,编译过程的输入是一个文件,输出是zend_op_array,输出接着成为执行过程的输入,而include的处理实际就是这个过程,执行include时把被包含的文件像主脚本一样编译然后执行,接着在回到调用处继续执行。 + +![](../img/include.png) + +include的编译过程非常简单,只编译为一条opcode:`ZEND_INCLUDE_OR_EVAL`,下面看下其具体处理过程: +```c +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INCLUDE_OR_EVAL_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + //include文件编译的zend_op_array + zend_op_array *new_op_array=NULL; + + zval *inc_filename; + zval tmp_inc_filename; + zend_bool failure_retval=0; + + SAVE_OPLINE(); + inc_filename = EX_CONSTANT(opline->op1); + ... + + switch (opline->extended_value) { + ... + case ZEND_INCLUDE: + case ZEND_REQUIRE: + //编译include的文件 + new_op_array = compile_filename(opline->extended_value, inc_filename); + break; + ... + } + ... + + zend_execute_data *call; + + //分配运行时的zend_execute_data + call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_CODE, + (zend_function*)new_op_array, 0, EX(called_scope), Z_OBJ(EX(This))); + + //继承调用文件的全局变量符号表 + if (EX(symbol_table)) { + call->symbol_table = EX(symbol_table); + } else { + call->symbol_table = zend_rebuild_symbol_table(); + } + //保存当前zend_execute_data,include执行完再还原 + call->prev_execute_data = execute_data; + //执行前初始化 + i_init_code_execute_data(call, new_op_array, return_value); + //zend_execute_ex执行器入口,如果没有自定义这个函数则默认为execute_ex() + if (EXPECTED(zend_execute_ex == execute_ex)) { + //将执行器切到新的zend_execute_data,回忆下execute_ex()中的切换过程 + ZEND_VM_ENTER(); + } + ... +} +``` +整个过程比较容易理解,编译的过程不再重复,与之前介绍的没有差别;执行的过程实际非常像函数的调用过程,首先也是重新分配了一个zend_execute_data,然后将执行器切到新的zend_execute_data,执行完以后再切回调用处,如果include文件中只定义了函数、类,没有定义全局变量则执行过程实际直接执行return,只是在编译阶段将函数、类注册到EG(function_table)、EG(class_table)中了,这种情况比较简单,但是如果有全局变量定义处理就比较复杂了,比如上面那个例子,两个文件中都定义了全局变量,这些变量是如何被继承、合并的呢? + +上面的过程中还有一个关键操作:`i_init_code_execute_data()`,关于这个函数在前面介绍`zend_execute()`时曾提过,这里面除了一些上下文的设置还会把当前zend_op_array下的变量移到EG(symbol_table)全局变量符号表中去,这些变量相对自己的作用域是局部变量,但它们定义在函数之外,实际也是全局变量,可以在函数中通过global访问,在执行前会把所有在php中定义的变量(zend_op_array->vars数组)插入EG(symbol_table),value指向zend_execute_data局部变量的zval,如下图: + +![](../img/symbol_cv.png) + +而include时也会执行这个步骤,如果发现var已经在EG(symbol_table)存在了,则会把value重新指向新的zval,也就是被包含文件的zend_execute_data的局部变量,同时会把原zval的value"拷贝"给新zval的value,概括一下就是include文件中的变量会继承、覆盖调用文件中的变量,这就是为什么被包含文件中可以直接使用调用文件中定义的变量的原因。include文件在`zend_attach_symbol_table()`完成以后EG(symbole_table)与zend_execute_data的关系: + +![](../img/include_2.png) + +> 注意:这里include文件中定义的var_1实际是替换了原文件中的变量,也就是只有一个var_1,所以此处zend_array的引用是1而不是2 + + + +体实现: include文件在attach_symbol_table()时如果发现要插入的全局变量已经存在,则会将新的全局变量的value指向原value,然后将全局变量更新为新的全局变量。 diff --git a/img/include.png b/img/include.png new file mode 100644 index 0000000000000000000000000000000000000000..b894cfa95738ff2c0e3e9bee07b8740ced7d2764 GIT binary patch literal 15169 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 literal 0 HcmV?d00001 From 3e4e6334d9ea2dd4796d4ed9e91fa20ebe9ca445 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Sat, 6 May 2017 16:56:48 +0800 Subject: [PATCH 216/379] update --- 4/include.md | 2 +- img/include_2.png | Bin 0 -> 31223 bytes 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 img/include_2.png diff --git a/4/include.md b/4/include.md index faeba70..32dd23e 100644 --- a/4/include.md +++ b/4/include.md @@ -90,7 +90,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INCLUDE_OR_EVAL_SPEC_CONST_HAN ![](../img/symbol_cv.png) -而include时也会执行这个步骤,如果发现var已经在EG(symbol_table)存在了,则会把value重新指向新的zval,也就是被包含文件的zend_execute_data的局部变量,同时会把原zval的value"拷贝"给新zval的value,概括一下就是include文件中的变量会继承、覆盖调用文件中的变量,这就是为什么被包含文件中可以直接使用调用文件中定义的变量的原因。include文件在`zend_attach_symbol_table()`完成以后EG(symbole_table)与zend_execute_data的关系: +而include时也会执行这个步骤,如果发现var已经在EG(symbol_table)存在了,则会把value重新指向新的zval,也就是被包含文件的zend_execute_data的局部变量,同时会把原zval的value"拷贝"给新zval的value,概括一下就是被包含文件中的变量会继承、覆盖调用文件中的变量,这就是为什么被包含文件中可以直接使用调用文件中定义的变量的原因。被包含文件在`zend_attach_symbol_table()`完成以后EG(symbole_table)与zend_execute_data的关系: ![](../img/include_2.png) diff --git a/img/include_2.png b/img/include_2.png new file mode 100644 index 0000000000000000000000000000000000000000..2c136fd91c50037377aa4cfec340f4b0020a4111 GIT binary patch literal 31223 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 literal 0 HcmV?d00001 From dd78ab24da39833b3adf43ee1101789264b0c1af Mon Sep 17 00:00:00 2001 From: qinpeng Date: Sat, 6 May 2017 17:34:08 +0800 Subject: [PATCH 217/379] update --- 4/include.md | 34 +++++++++++++++++++++++++++++++++- img/include_3.png | Bin 0 -> 32627 bytes img/include_4.png | Bin 0 -> 26132 bytes 3 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 img/include_3.png create mode 100644 img/include_4.png diff --git a/4/include.md b/4/include.md index 32dd23e..0484310 100644 --- a/4/include.md +++ b/4/include.md @@ -96,9 +96,41 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INCLUDE_OR_EVAL_SPEC_CONST_HAN > 注意:这里include文件中定义的var_1实际是替换了原文件中的变量,也就是只有一个var_1,所以此处zend_array的引用是1而不是2 +接下来就是被包含文件的执行,执行到`$var_2 = array()`时,将原array(1,2,3)引用减1变为0,这时候将其释放,然后将新的value:array()赋给$var_2,这个过程就是普通变量的赋值过程,注意此时调用文件中的$var_2仍然指向被释放掉的value,此时的内存关系: +![](../img/include_3.png) -体实现: +看到这里你可能会有一个疑问:$var_2既然被重新修改为新的一个值了,那么为什么调用文件中的$var_2仍然指向释放掉的value呢?include执行完成回到原来的调用文件中后为何可以读取到新的$var_2值以及新定义的var_3呢?答案在被包含文件执行完毕return的过程中。 + +被包含文件执行完以后最后执行return返回调用文件include的位置,return时会把***被包含文件中的***全局变量从zend_execute_data中移到EG(symbol_table)中,这里的移动是把value值更新到EG(symbol_table),而不是像原来那样间接的指向value,这个过程由`zend_detach_symbol_table()`完成: +```c +ZEND_API void zend_detach_symbol_table(zend_execute_data *execute_data) +{ + zend_op_array *op_array = &execute_data->func->op_array; + HashTable *ht = execute_data->symbol_table; + + /* copy real values from CV slots into symbol table */ + if (EXPECTED(op_array->last_var)) { + zend_string **str = op_array->vars; + zend_string **end = str + op_array->last_var; + zval *var = EX_VAR_NUM(0); + + do { + if (Z_TYPE_P(var) == IS_UNDEF) { + zend_hash_del(ht, *str); + } else { + zend_hash_update(ht, *str, var); + ZVAL_UNDEF(var); + } + str++; + var++; + } while (str != end); + } +} +``` +完成以后EG(symbol_table): + +![](../img/include_4.png) include文件在attach_symbol_table()时如果发现要插入的全局变量已经存在,则会将新的全局变量的value指向原value,然后将全局变量更新为新的全局变量。 diff --git a/img/include_3.png b/img/include_3.png new file mode 100644 index 0000000000000000000000000000000000000000..f5227fa8af88057f33e8cea714fef820be3ddb89 GIT binary patch literal 32627 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%0Da8yol&Jm0VLgjrF@(A!|JM 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 M$Z_@8s#drD7e`dp00000 literal 0 HcmV?d00001 diff --git a/img/include_4.png b/img/include_4.png new file mode 100644 index 0000000000000000000000000000000000000000..765de7a8c9311ce9eee9cca236fffc394d6aa96b GIT binary patch literal 26132 zcmce;WmHvf_%^r!5d=vI=`Jbh4r!3??vUX1in`&N=M;#GTiD-8)oKUJ?Zf9|?jW6lp0jWe9?uhaeatL|E`nOQ^;LI6XIh zFDV8+KK;vR$&Ul?yl{}xa)uz(?x+7S@${$!5JU<|i@j6zNZnuZ)Kt-!hmN^2T&4!A8Z72fe<81htU54(zg=7NcdsfciI zVGNQ?^I}p0a_pig|qseT&Gc%lgd;}0G5${x+|Kr2` z?c>c}`P|&x^71l-j*Sfut*)-FM>jS$1_eDcFfeFD$Hm3XRFo1bEi3c8J*aQGFmsV{ zb#;}M4Zr(dQc}{_C#4oi#ATP-S!@@tNUK|KN0c%g84&>wp`oEcNpForEJP)wz8dWz zib&ykdwWw*P&6uZOiaX%ZpHb08r?d(_7N2o<>IOz!A?s~rb9>Mb!SK)MMFm38zXy~ zRE+=@4vq|EEH=G*#hgv!0Sz151j&)S4hDM zY5Y55*6*Zx4Z%GNh>+S&k&%(#zkd%Sym~kP0<4afme#2pot2uNUg?0{;o)IgS{j6o zgQKpf2tgv5(aoBTx76h1Yx{H6#Kgp`$u_-_L|q|h{+CPc>4LsU5Zv>Zq>t1zPX_@$ z{`~yBpwAULWXg({GE7bN3<05Bv+@(F&CW#bDNCPem1qbm{PX8-9fJ~51ctny(3K^q z%a0v+sr}m_CZ1nWV5I;Y^)M^MS z5iAsYKW1MjMY(o%ZRHh#Xo)2&i7rw~LG$a=r%zA!sisRGrP+bMhJWN$`y!S#n8+MA z6SKa)4g>c*9G_$Nd}k7>u$ikO6a75qZEkM9xw#1&P+VNxiPvZ*Dx#_R`d*bhW(>Zr zM1X|_11c#k-EjVr@b6$DUuKitv@hEC_Fq4)nwFNOrRAK{=$}7^e0)tY6q2w3inK3L zP^cthE(r<5714rBo(6^d^65x@Yt#wWeJ4H#E(-`Jo5hIF`S$owGTYHoQ@%q+OiWBJ zVQ~JbH#IdiF~3JNLr6$S9KGDc#6(thcE0=%8H0*f=;(j`{89YxclPENPO#fIAd4naXdnX=&i!9izd=e_P} zVIVJH+KjVb#j?QIV|AZF;KmvJcp?Qf?Jm#AreJcCgGRS>w6!0A8i7qXw~U|Ju@;9zlS zY3^t?&}E=GZ$=KyY;0t?(q9u0Y;A0Ge8nI*chH#bRhFWR9T*rG8&f=;0?YjScM`+n z`J@8$)_myo#FvRSe}Cer#Psy?9ES;KN_50;Xw9|t_3n<2WE3Jr#li@@7xFyq1|#tEEp93-o789*^g1tSZf*tw!pJ4yb5+sY>;p{TIlhUBiIe!t zcNXG_OnO-wjSUSgm&@J+d&8 zsSqQen^p$q=F|;gwR-UI@IX>_BPFp*smZ&6c6ss>CojmkzR{1~UtbrS7wXI9(#u_v zo<^Ur;&ua45Lr`GGc`38`ice>pZ!Y-9V4S{@nbG9qSMyWyu;Jewav|`#L;9iQdmWY zD{cOso;(6&YhXQ0KLQKr!GB|EWJD(L&GqJd=hVzi75uVvG#M*Q`kKQEOKV&A+7|n( ziDWct*9=BbG^;70sE3CK(7x*i5_EK7iMKU(El;M?A5T8<&l#A{DB6n`4ZgRW5G56r z?NXy!>tNvM*23@KSGTt-4bJ%)8HQsS@A!$MY);S5Ddjl8o&e!=LG9Q&OJp{XA7E!^ z2dWI@BhH>7lSYP&+2Ea?o?db0fN9mm-fR>hPwaV{ho|S<{Ct^a<=RDxw8K8)glAGD zY0$S9XlOL07?+1j6ejq6cuM3k(S^gvNJ!=*snTxpa&qw``7fCBL=d1DsT%jAWuPMi z12Q)gudS`Ey%d6zH#gFOdVCZUM@{{CG;LL&Ag6By_7Rp6dXpR2KkvokP+*C;%D z{v3EORaz{3e0=>Tx6+c5{llfE_2^eL^4&c>%dNhAVEO;;&z*nKpkifXQ&CYlJ3W0v zPv2itdio5uBM<>iL{xNVM;X}InB-(ULPA1JOk*1x8#A+wgM+08BX+Q*JN!7}O0vBH z=o2pe{r#m6Of>mA6J?~Bp~M1SIS!1Wvefjnv>6(ogM+7MX5Qp5e5VF3JF;S}CO42F8{St87AJb!F?JkIjh0lNvqKhE1yyUY+7a8~?$B7}b1nB@f zjY!u0_Q{F-ug>^l4y5EqUYwIkE+J`WG8oG6`rBX8mGe@{&sw6<-^0kJ885UAbmn-=)CJw7DGcW=5s4teUel{XO5)qtyZa0LG&8d!xl9C_UHRhZ} z=H!qk38Us|G8zy!5#c^=zTfN%`Yt_T$3JDE$s`pJV3HYM^X3MUR?#m^Fli>8Dqc$Nym;Ljya@1U( zM@F7KdL=bFy(XtQ?!izE`$gVI-+Ay2{f7Nl(3Q_*LhrQNr$7uy_#u8&T>h8-Pp`i- ztVe2ot;?PbbI`Hx+Vz);XtU*FaQBjh3OWIfWYqYw;=8tF3BK4R`CUGpV+*_@YiffHxNBZSNvRv-IJ|aB zK_bBtnTG)q7|p6m5Ve}8dsc~4W#O9WCw1*JiG%bfap6}~ak1O}LyHQsN$6&Tufsa z!?QYOI*7s~Zj{TG?zT3Ff%!~7KFQ(mG?xVP)ksVC;MeRC8ehu@nVRW) zI+PnnTq=9*1$tv^C2MRuH}Fp&#>9J?fjKnxX4<#;9n2(MPntnjzb*587~Sn~e> z-^Ju*%b2pho!j^*7fe7iQjp7YpkZ|x!annc0}|7%PISS2c{29C7=N&_6Li){= zHs0uSMpGZE!9uIWE1$A6bEV|Kmf5ARZ|Tu=X`eY&OVI+P@6J+f(QFpzkiZZW#)XDB)ox4Zp0s6!&POUXj& z)i3Hcj%%mH*;tvK_-u(3#tVJCpGLO8HbD+;BF&2?WOKPD;N$CtLrqc(E3?(IG)N!5`RQqU{DQCCE&F&PrYBr|(`-Ql!u*j>M+Lo$A?Qnso8rzqEmBIiYgD-bto1cZ>d7r%M4 z;uD%c9y&qoVTSSq0lfYU?*G4auC5{v`j!b<$cP~p64imo2VLZg(NhHU|K{wG$qZ8A z<{@0NDU|=lry^TVOybRp1Q{zx%GDE>S74HLliGkVfG$^bn1YGKpY_)W3@zznY+~J% zwc42qz%HJGgbS?V8Cz0h3JE94@by@;D6{1u@gQ`o&%kB;hh{vD>syEX%OFLrb`UuJ z=g$Aft^cpi%;(~WbfQWggoREkp8TBK}f8TpC$}}|5qk^l? zwagSMHqqpM1Y$KdA}RN$8|Q?dRwJb8C0$tPMWp$a>-!?SB|_YlK|w*04QYp-LK3O3 z92|lcyg{h#ci6S?V207kG72OfZsUkoWTXcnPkWtd_vxD63i-*fjdWEbPdI>V4?@So zo7f6X{i{$h@|c2G z2sk)6Z|1x}=GY%cL%)*$O4TzRAPrreoqZza=6Sm$(PHGQXV*qXM&vPHMz;W5Q0!;J z^^`Q`#J;ENyi(~kjwFdSn5*^wI^EIRyVVy%VO6>Yk~1sDHbzgwR9?Lmdd$y#$Wzl64AB(VVg>(^2^`v(U*7e0b*03b5js;GF&D@Vv` z`lX@4)7I7&U_3B?b|&+euqv&d%V{h21wERy6Hz@VVrMA28xQu+v5~B zg@uJXb+!wiU*fIp@9(d!X6{NZFoI-4M2hMtf~c+2e)8nL$==iqYLCUXPLBNIN#cKZ z0#+#^A|e@8Oof}5x98U{YyeN;;_7H>GUzo_YknItlN{k68Zs5|lR z&-S*an%b{bhoYh)5a>q|@jZvU|Lr%p>|mykj`sJHg%I*Mb&rgoLIZEd6ve30axLUH04}syYVODynKzq|HeL>$iS%&+u*b@5DzkF zkhRCrC@j}nIp=!=XQc@Dze}0$$+BqjS zCr9m+L`Fsisb3t2QQOqiRE+wO@y#3UDpP46pXR0}K4^V&^Yr?T&;78^l$C}i|6rj$ zZmG^@4i@tC^t9o;{atCYH(Op`SEsIQ4+K(84SO!VWbUWqUw{^smX?|r8?QH+pppp6 zZs8%_bKAmKJ8#Ly4nqMA4cE<{XZkd_Fc5$NW2D3qex#;i)lpMYmKe0PR#i=mj2w1{ zzJl7f&i?-W%gD&sUunu^V6ZY9`cCdiY+Z#1!*jfkJ(|CKL4cgmJ{LPuBsmbhbJC^~;wJ9AFeT z&+^^_cLZ*>x3|aVXfwEqcq$$GhDs`T;@h`xOHJ-^`5;NnP3(;#8C`XFIEnI)b_p8X zi2W7=fYel;xEhOSQGlcMNmhdmv2VSWi1+#$7N+f|gEf@GRbJ{lkMta(misP-!%a9c zoWiB{B5%^l+8RJYW~_5pCx3ydkjBYk1XGhr>^H4SO-&68LvkwTtJEwR*g!i~_dSh? zEd{&q5(&wx6kUze@9qjH5m3$8^zo-zeEkY81)wch$SLj5i3en8Y}~o(V7K^le79fp z0*;3e)sk*p_z7vLaQkH;^G~bU!_hr>G7^{*>^6_RnNshgmdnkNAIK1}DaMr^lX-F} zoVHo+Ki!YgV!QguvLzyv1prjs1mvz%zvX+^s)x6CoNm4vm}=hcFHAyI8dla*APvfe zHAO{M0Kg$)%oJ5G)rN;`ICTj4&{@FD5TtV_?(Xi2HOh-_Swpy%Jw!`4=zoI@{a)v~ zdQ>n)$X^iZ{`CtiPgIF+%?Bk{*V>pE3_RYkB6*SmC9liF($-D@KIF?LPlUqxUvDG= zWSg#J-KpVyB2#T;rK5v`;&QI*{_je#F8ZxLT7LCONlA`>d-{*4g@kLTF9x`30eoEN zb}$dJekPr|{V1UaQeXNv36pkj$z%E!7YQM-1Wm@jkoKpnpZvlOR-x(}bi{2kSIE%F zh{bJR^VO?Y6Mr*gm<5MBI##9j-I3^lNlJ~l`_5qhyCQSpp&95~^5_g-trP%&<3YjK8 z`@6OV8TLh!E#Y8W24#h9S}0a%P{LVdt4nGu?9t_+Tbwh{`5REM-A!PaN6m}!4i+@2tBpN zT2tK+_R5Vd00vT;L=3nUC8d~M3pqVC0IT85%ZPnzPUmymhXQC6(tw&FK%1lKqkm7p z;sQH6=f3P|0dQQ%VYM^ZY%t-(gFje7@}V#y0)=NCSS-{RFD&bU!M=oT2S$WMz)Mw4 zZDV!yozl19VEDwri12V1XJ-OdQ^cLYxJUAS|Jr$^p3crsU8~KH54SFY0BPZ}7$KZq z9wbHpZr=qaIV9kvkc*4U`M-a5*5@00(WBymC2N|)TR&@RVKx|Og&#niu=iB^+8ivS( zo{mR=;H@`LvrW&=T9}%;6o`w#gmhh>^pf(kC)d#4oL_t-4J0#Yl-qC3HVyoMn!&oBPBe z!`j|EfM%8zA-hhc@;I{>Rp$ZonwKXbO}_T$&scWrTTmksdbs+#F_^f+VbU9^*W$(D z+wb+>d2?vzfr%643DB`*NtVSSB-GW_wJ|jOv$wb4MEr^A{I57!-v+tB!0vSM;NT#( zIx(=>H1)wXlq(_`mZq#)g9_1#2Dl4NN3AI-DFnpC4;=_3kg%#M7DU@G?gb)#^a*ti z4h}GG<-%{n<{_UyyL||^qG33>zCD^&Gog`9Fqjklu5o{Nx4XNGr5@`@6W*QOlH}Dp z@`KMEY;?jNkR~bXAYKOTnlD)epw4k#D8Y>#CE z`Bmzb!hk<|NpLb!fw5aA&gN?LsDaiy)&G0p>1djkvqG^P&l3NN!?;_wTZ0eGh-I#T z_dno8fHm3&crUtKlJ!2$`bQ2?tVA@TX+$9Eq-&;~Xjf}DmIvF&XEBZz}@ z%({(P@LtseD`vMX);<}s*)@u|^AzDuu-;xCAwVFI1P(pVq=TfXz~mS?aQ@TI7rPsq zhOK+=HWs4bygyD2IXv$Wz|_D1UcY`_;Nh=YyE|E*UR}*LsdTREd-KnXHz?AmdhRM% zsjR%tH%||75@X5baoN5z#~B3Wbh@cRM!Z2xU^nrg==0z^I=2h8p_IR+uN@R2^Z&?k|MXi-Q3*V-T6SpL^7#FI>qspXq*+mz`uU|vf<==^G4>n+?0?n z%LJ5Rg}c10x{VzrB%VJlZDeHRX!>;3`T51|OG93qAbs3C3hhlG>rjQu&V-#^rQ}di zc{y6kzutyr;isF7GEBgL@x|TTc(Iy_#qV&R@Mpfava*5#hRv;~ zI5+|f*n$*sJ6yz4fNoCB&cX#y%YF=Qj8lCB|5?yomW!RlPeKa8kTGRs`OR^~{FnlAAv@s$|q7E2QL^8eUR~A_ZWV9KLXJlnRw;D{%98Z|fzaQwh6aA*i zNYBgH`=?u_tm{~w0yh~!AKu5Ujv{8sPePJTAsJavekU14jE#d+RPIBS^l*%^D+3bi zrpC+i_>~o|r6KyOdq+7ZD_Cf;)px6Jl@_XSuOZ@_A%vb8NP7&#oso7$G#boM ziSXB%d7Zd++~zd@!v$c{y#k>Ts0u*8fk$6#aGq8L;0M|y#uP^agKPdHd_bkiuuv*n zAVV}q!Yc---S!0bGpv|ZCS%+9G}e|RiEoX^i7})JVq^^iUk>0ET&F%MDg^9&8QI-D z>;4ohkBr0HKkL04F8r`Fb3lOi;$@*)z3=ypjSYJB64L(a{a2gZK~D0hHRfuHyY)G|PY+SFP`CM-Ew%hU6Es!(M#U5Er1H!(I=#9ob7@)uk> zzo!#$*w7ac%eteV+}~buSas^6sOidbaIA{DKVe})zo2oOIp8YC+#3&Pb100I@Z&dXgYo;Kys`708&06k420AQq`BtiGrvwOv65e+5`C(*en)V4 zOcf&qVmJZdX+Z{S_hj7Q+1-|7?CL;i_$k2N7!|y=0qzb0Bm>~#_^X_N83lO_SPKxz z*kVuY!0D)|s@8a2>}F(S*tNb)VNYs7t<;oVaqSx#viaK+vE+aZYkpJhcduqYn2?9Z z);L0n+>Kyta6Vh~?-EW~H^c1y4Uz|h0A1D_2RUQ{Sx>bWgaAEAZCTc z#Kl8@t(CoL$aT|K)=FO99zPGPHH2vit~GpjCd0?)!E%%e-i%I`w*OR7k!UaP#5y=q z=K0vnuV!W8={>17DgIHoUAqD@Hj!4M#6(1<;Hz$Kp$mKZGK;r2SE9Mar3`;^vRAgG zimU6=S+W%cK+L2jH`dpo000o=EsfwdR#tCzp$Xj`ccEeLa&U6C`dnA}ygoTOL0WzB ztX$VYzQ8FXDoSAxZo{!bSNTilM%e(G2gt6cHK|XcX0Uo3BG+RP%P{6 z7w)%G+sTJ}MeU-?jl=^DMoc9N3HIw-xb#t8Co%hj`OT~}exs!p@<4nEg=E2WamRoRGj*QhnYl9m-Xc#} z*LYZEjVy2u7M4fp;yHi*^J!)SSU~R@)XVkt^!3XsP62j;@$^{f zqhXQM-mp+O$qKt+!1CSof$Gqf3bQhT)rHm7jkPkC)+81-Jaa*2>2f71-mS{Uaxk=F~eSm*8 zHu46?>oRHd>I@r6A*jT8OY`xL1`;+iJ6q)^<}gF*?ooDgE3uxX4YSg2)(k95ndJvj2-Ds2UeHq* z0t&i@CTz^kKXsWV$z0-COnM+;5QtFJ?)e|X?9JD1nkgt8pXYE@mKh|js4#PDf{G!e z$&B;eJ`oS#>;8|>slZM z&d!AX*G4Q6xWM9_cH=$UG!B?BLr=NIcq+mqiTGA-em=m~K$^tE%gc%#DBoJin};m) zBU3a4z>y#}DZaSDr#f$a`0nInEKOOGMXv7214UQj-YnF&Ez&T_dy>gjTU2)&w`5Dg z1U!i~u0esSyBSrVDU?y~%~c%8oUW$&4D!Ndjvc|rzgYJ6GVn)X)`wSy<+FBqoyJ(B zMH)$Kxxp9%bu2D9x=9mv^Y^DyLEZGF>Q?^A#LNRG_f+MUcV=M4i81;6uVxau2h z#Akkfenli7K<0RO*lO4TtD&JW+>Bl_+e=c7rELH~0bWNfo19T)J-~oySBVi(6~DJ( z=%Z0EGD0UpNlQb2UGURF7!Y7SR*E~d$K&iR?@DgIbzkH#u zHbRM0Y(2>K_AMeR>c5K%IeB?vKDUzHt^zq(*`KrP1P+I`k zQSGQUncLCW(XkSg)6%|WF#Xwp=ipG(Ls3^Bws2==)~rPWy9A*lb^L<=^a&71H;Fns zNf}YX!@t*uiB(um4*JDaynW4$?&F(Tg}Hx_qS4b0rJ&T+l_Cg7Syoql;;fHLqkC-}ss4<{Fwz%AAtLv}a2?>|g?& zvK>!iL7Ekr1lp&?%@{O8=FVJPUY^cjouIzBe($g?k!PMS43gY2446y|t2c}7?d=N- z-UHw0{>%T*0rT(&{Z@QVjz)Q1KC3uU#}-%mL&!@Q6O+DS+mSb^KRUYpZrH)VFsJZt zcaTs>ifC(}jf9|nY!NUuhlPGGh#DEC=&{+x^pjFPBiFtqK3tgfVK$?nC@8ijW)|6! zU<8@JeoUI1=i<-G9%@49_v5rt8;W&OghgS<=rKl@ThMbo?#HF%$t_gkW$OW=ej6z( zOd=w=hc!N4Ubhc-8S}M2W@5cdT}^1Wu|f8^`!Ei|aJS8&WMGW|o?NN9xU*l~+WG*> z7Z+Y$Ns%s~G*D3XoFZETpWr2m!Q9qCy#W)#Ghuz=*LWR2_=b6Ux6eX8 zE-87#h#j90Ru}S2Usif>@Ro;XC*&gimi2WkFK`V&{Wn37);^K@9>f5QBYEv5d5?D; z6SEdA;|9KJfaE*9u*=HIDzfu28iEXg1pr9K;i2G%F;dOyP5-Ol9ZU+z&ih;D^yl#J z6wx7JdHFL~79)|pki^6`LKr#bF-Ag01W9_V1*g6KxPx8>1BS2gKtL~w?%Yx-i8-Fe z*Lo2}$Eglg_#O0URSRv`714KJ3JB>{`W;9FU-a~(_Pq+}315X1KA-!W?$h{TjdE}X zY0MZT3P6&F`}`I0Aws zp|+M&b2jgJGR}Ktb_}vsbZVW`K55&r7VZMOaBM4^4O{OzJ0nRItsj{dD%INRO zTisTw(r2dss-`>n>E~2yZ_G8xE&;(}ckB>tE zRmS3Hh8WQCaX>V>gR`}tjF=)YW&hzD}V0@mc>=oJsRjaoq&ws5#?dck2 zF58-}+eEK_@3q4~89#LsG)tIqs>R4LHD5(telEAqu6EW@`ROJ**dVu~;#bVqr*QEO z%{^WUf_yf-+64s2IO}+blxWeRXRsC3*2LlqyX!^L(heu&5R|^Mi5e4ATGHzx7UFt7 z@IARYe>hbjg3yC^^NSCepEcJbK&A6dA}9FTgdFGpMGv!C`2VSQb6$?{shSw}?Pwg; zfNL*&Wl>%2v^DhOTJ369LLxBE|AX^x=3})-R9UgvkPFBYh6Y6!%CQIf`y2f3y+Dma zmO2nuMRN^4TFN4tkHDqO;4@YHZv3~q>)oHP)V6!Og)gbeTj1beGRPQ8HmDO+i~PZ0 z+4ol-eSRU`PpJk5BVRZQz|Rj_bB!aWCuNbIZ3}{$|5fW*O@sgCnkq z%^qWAGuoS($tNJ|i|0H4C0GuKM78!|!|UapZDl1Ttel&W@EX?&T>H=*iK^-%iQwH5 z$DWU@oMbAmquUwo!WQo+CkK(zWzFHN^7v7db?ZFIzwMZyonsh%7fX#g$Cjq=Sh%<# zF;}((WLRHc0WEuDV}LpS1hEIvwqoxLhM4yct=sds*bJ5W@Nw_s0QLwMf|k3xI?f#$ zs>*KTutDEeV|a*tBze-*wlp!NIQ`qy_8}@1fsFeP6Oo;k$k8>p*4jXe&9sl6t3+vR z-lmATHpZga)N;E4$?fB@iy>)5m!`cZxK)ODH7&Wj|=P^8r=C&e7 z8BVC}=KdD!CD`5jsj25eLf}KKC=#xbq;bGiwxSFaS-$!MXLW4oRI*&EBgao%F;}u? z3}tW=1}FA=-6fS+rgB%-YrZ5`%0HT({q?QJ)P)bwd}K;WX#AL)r6ytw-isR${g$55 zP*=~@zpFg7B=VGDhJ>A&vhey;V?jw{NsA6NVsJ?k@w(6^4o-*Rt?(h~NGc{8s;Mcl znU5)4$jB^fwtUCu{|O*pj~guLfz_9n!^7bo7%Vfh7WV_=`+qv3nwr@y0@9NB7DFFc z*#dE2$aL*aLu2$Tm4HH@=lJ)fdihM7UyIR&)xeOfkl;gvR`r9df_+V`S-lI8C(NJYHF~MH?!q?25k>MBZRM6vM&D}DC#Vr4K+N~F}!6Qr~#KtErI^vH| zz-1|o5>~wTeO}uN4*gze*XNe^8Zs_S(8Z4hKvjT;2Dd}QFhpcO>^*XeD@DW^=yORv zgx@hUMe-l`-f^p{KOFUvz+{Yfe#$CXZgQJGTAcgyH`{*|7Mi-fg$vO4Z18hBeVmw( z`YRb2g{C#PHC z_I6LNQEV0wYx;wcQk$*LUrCbw#~th1p+sw9!EXLms{gh&Ulvq>t{Rf;0U7y&nLtbl zKL(yjH(v9Ru(Qzi_0>#|5(Q)a-BF&~y&7ODc$emZ=SQ4+4 zs-=s(_cE^37l*&tO*)il=)t@nl7+VKjsL*zMG2k1d2`;qmZxzmaM5;K)<0EqGOg3f zQJ%^s*}AS@Sy}WNT>O&- ziEs&18>-pnz9n!I&>tHgO1f0oqQ>1yQ1|q^zad`q-(PM)z=AH;6tcr$?*9HG^4eOc z_XqVB3b_z>+jT@3VNg2-h56cAj^y8dCu_eN{yYBmM$x2zd}x%u0Y*TXAP}1#$`~!S z4C;s^dd}xYTN2|xFIjd}o38t2vb^^Fw02p}EUir}ny8UVQ!TX9+TeZ3Tx~H}PHkOa z)TP;W|D0K0JG=DYv9HAh9Rm63WFt4xiRS4^ZVi1PPoU&?REl8xx!t3BCWp^~Y>=jw zLaM3R3*nZV54}QmD|#FErwS(qEv;8N9vc*3vrB|GciR{9 zh=n_NH0DI5_Z?UOf33Rxww)bQa`YCR`kVQ=dm8#;%SGoGYCwY*?!rR+xmm z6MJU%;cBrf(70L)1*Jtk&2)N(6Bv~bmUADh7d}|u4!oZ{H7_j-enR?B)z2{~LN*qg zDGg4)#B{YP@VJ++ef05uF0N!fTdvvU7yJh1?%;7qD*3dg_`WSQGPk{8`E+q^sgr_lYwO+Hy=`GJNyNfXShHbjJo+Qmi-gA*9pjz+zZSo%kNVd= z35@=J*Hlk>oC`t`XVCYS@%bf8fPQ~JilAVL#pv?y0*~}Cb&eAcBvEw~a&mkc1-qKs z(v`Z>S@)G4HPvlwEcTJ4%*5pWqEcH{j{Bqfl?fxb_A|>#RWC`e*RD&|pu0ereEiD` znwsFmL|lL}Vg4&64boSMOHTG%m|Yceced87T90UZY#9y5^EDsZwl+HH*-Ecpj9_K4 zOy!$3>_x3gd1pvE-6mvatlVZ92NV=++RaeXNut>xe!eW(HIkX}1h?4$0RiWEGE4U8 zH@Z1 z`JKHG7_4)byUQWG1lfP5?PFs%x$iI7Sikp#TiVHF7JL@}nx^n$es7+`<1}Y{yfSn! z*IW9*{mLOQF;U;|!I_3;pgRXR0A;89f%wsUx$Lj;{_}6W-At5X{EUpUbE$x-#KC#& zAISQfxo3QTmOj;V#L1v7W=y(qE+h4UhyDe*wzMRu_<$}anD)LtLU0GV z8AV1uhg4K1L3iLQ#?7z8LqoDsQrn%AZ-}Nr9U73t0D#$&Uo1rl*meNFb~Q80mFj1A z{y~Kqn!s$ZtiB4W|4*%maYfCb2u_@woD2g4vpSI9qLRGn^SAnJp0F&J=N);_>#2$l zF&&3XEu-l)TSq-Jd5BhPPAS^5WKzjVibV%AsdzPGAB^5q9Gw+A_apg|M0+o zm8XY;!*Lk4-eVjWHFaKg$nmvLrlQB6_K%Uow18BgCqB<86wumQ3=g_LGZndSr%$E_ zh`1d{0V)vJI!i8sA0;wmbklY8l8QNhHBP~cipG7RY4+ZWiV_mO?k;5@z(q z1O*4@=H|w9FoEjmru%N4uxUv@5GX*(nJqU^Sj#NVGk}LYyu1MBIF1mTr~;ZV?d;^y zsx0ftp@On9R7AvR=CI~m&i0Qf~qN2mU7C5P^tUlgs4k1-C_W%;J} z*)R+o0xMCFgf;%#fF1PLljghtdeBo;6z=&L%K>^3!Ke-r3dZz75s}rX^O=(}F5~io;A(S7Y z-x3o+Su=I&5R7AOEsLK5BUH?JYlNyitD<6TX^9A0XNxV%X7tbUssR@ObwqGYD?8p# ziW-Hb@K7ooY;Do7OZVg?fb#&QRTeabZm0v0G^$MTfiF#0TLb`Ef*!{K4Bj3dV5p|% z=JN{+AoFYb`E#sk81MiYG_|y1f*Tt*Z@cZ58sk+jueZ|Ul+poz4iLe@!ow-AL6>Up z$=_c0{omtiv-#+Gd3ivaa?=wM6DLt#gNiTU2$9u->w(MDGFt&69uS9hO#tHo_TBdO zHj{!RD3$-)$!c@AO`djSR&CTsxr7<@r zBZCwWWyr}pS62L|3Y1ReFkE(pOEfFVDJdy=dFLl5o#(2|PPIP$_(6o16dNBuefnut z{i*8`^(Exw>EEK{8(5Z3?b7{nL2pr#p^fpvrc3cF>>AP3rWoprY4 zaCMaoGZfI|5<$t%byxM8-b8?(AG9IH#>EW}5A)r_rty1bReTOt+|dTT=YaSLBpUP{ z7OR(f4Nu6*$yv0bgTg5ZiGn>joQuByA4K+*0aOw!JW&-5jmwqChs%ovhv%9~NZ$+XLx z09kOdO@AyE>_<{?TbJ^hS{h5_m`51U&iiC;KrcUF(*i1XbaeEn&|@k)O|%o(Q$7KO z(AwGy9s3sXhpUM$4ZtYX<}`GPl%jkJv_ZGy`I7qzHWpS5UxSsN9#K@UN}4QKPYqSo zzN5I*R9PWVY>l^%6wwnml2YMvaC3|N@`Y5+EJyk!1h!hj|0_8;Ik?J{9nbB*12~A4 zyRfc~lbl@SVF48~Er|t;VPJ2|%k6=102)0YTf)J?y~4!w;7_}e$UWa#P*^C>nY8k~ zIXB~d7StFnv(pDkn>4aX!n}6C!izmL-rue~+BMMNHDVADyjKtak}U47FPp;2NJ%O7 zkR$)RvPe)tT3?@-PKFd63_MN>FcaGVTXZ5!lxY&s-gCm>>r5>z`~RNwodOPG8?Z@L zcSrt@DXMzf+A`!%9C5r&kv3tq*wBCg;EVik(3zQ;Z)`v_FOVE^3JN}=JNo0^SJ}-i zEfnPBn3$M=c?JwJsO=*`LXUUOpjkJhjB<2vke->DhAWK<>qZoY6db^Y(9yks0CnG! zAJ{u>0Cj>eK)ZTjtjhv|9&ST!ii8m_&`T9C(IC)554Ii>mf(!8J_TLIp!?az))sWW zo}Qk9hXQEVi3WZCd~16b)UG^oDgHdS3jucE;q?9cIJgPWoxm}4or#yiS0iWH}G-r*YeFX5b4-bK@2V`&4 zM_@Z|Zg0WRf#H!&dfU;{v-zhZ5U?3aii@4y+?E@hX*^xm8_kpv1*Cn<%&0<>@4{T2 zoV;$%3!9pnKtlpx_{PU$|A>G`K;Yx!b6>L8l9f#A-Z}$o0P35zwv17|XUE5YPxkQe z08ANhds0$Tfaap;uebk zh{ad?#Cj?;y{-(1cAx}aUef+#&FhP@^&ThSX@L1v>t!g@mW<~D73Wywz;gYTqGoo` zC)9m3>SE?IKXj3u>*(l6%C-H|``NQ+Vq#*)9{j9iC=H(%S5}1h`4uj@5TwtJRcVRb^Czm4E+2c@rOu2x_kL(1#o7i)a>mN4#7hS+N z=y{9VHLWu%sgF^?N%0*3y(yB-%(KH@^M(uuh+aUrBmS4Gi+G?X-sEjsoDz$D8=L9O z{to!OUs~wORS{~q zkxppC=aQC|mh^JPQhGIP!)|87UYusWWnz+PcDf(Ok3T)D;6SHqvuS8=p`JMq?uwqi znDhCwD0U(i=NSaD1^0aY=4a5J(9z+MZ2rl$PjJr*@C=f&yqM9c9beEeLXH`_?I?b( z@rf8$++qkA`*WqzI)9f{#*z~xRM7CGsKGnIbTK44F9>=KQXi@qUpR)2TSURNgObJN zP;Yqcl@6DxmjKPtX%rs3(8~8V!)2#(s?(J42%e@c(bii|c<58TEo?yjif1u_h;p%; z&d7pQu1VbmDp}A}5smzPUQ3QL9R%o|1y#AVM)4|r{Vs$9daKI6 zR?c8dy;$+PWrRR~OHtvSH#Qm)vK`D5R-fVtUyo#;@;y>fMX$SH{4SkU<@RC^8OoRM zwz)CZ0q|#&-yO!BSJPD@c!0;y_j{N*d?IJr(hksk3z*;yw1!Fy4~|xW$9^6WM}2R$kHYlL!G|7L_TJ%jf20Iwro5nDMu>I z`ZxEE!(b}p*3cj2`S|mibbg^*O76E)-}sy!GxcoMtZdmrQC;tzAwyTQZ4cs-cKqGj zj||J%8HH6_Hyk_H%FzM!OPcrEhOq&{BHEFb&1=0zUGcX{f#jjb(%Mi)9EArc7C z=o)m(zVG5&kMrxaRkHN{P7*Emci&!6>doG9q2$`yEYBrZS^hs-y6$i)|M!24kRnlu zkd-7eq;Tw2RtlM!g(5{p$|!r3O2|q^8Of$>g>1?y%IISgA|*0@uhaMU{LytT=jn{+ zd5`;ktrG(8=2?*og(XF$iK4=5J!N!0cZMw@q>fLln+UX2JWTfB@x{>hT~9d??rYkj zY7If+?VDmW?Ebe!Gi9Eqr;}tJhlYM?Y5rI zI{&B5xLZGxmrvTKus5K` z(_|gMb-3DvezQxDaj=l-ywz{9$x2E8@%Jbvlwr#)Fe2+ zJLUqw(M&~>dgb7&Trai+hF&)=slRE4y%Q{RhoYL{a3S+s-$4K}N>5K;bgBKAsHmlc zL;%BC(lzh+r(l*L63saopjg8uGT&dM9!*j4JM7V}$&Sy=K1KqsxPPV#8BM9^>0i89 z(z#U9YY=(wgg@B`K&~a`qD&5j{{qwVMQWsPOIVLJeKYsriuk$Szc?9CP9$FZhox8P z3q+qr+wvS_IwZ6>>^c&!dw6)D@0C`7Wsw>xU#q?xW5^?hhK6t!n6~4`j}Nl>%_>cL ze+%|~<2fB`aat|Xp?ab7srg?rPN}V9H!l+%ybhn%seDj;DSGQ$+V0#Pi$nQIsL%Pf z^f8pi#%{w6WnEyz$pG;>2=kZDP3YFDL z7b0JB$aK1SJe{q!`*cU=@y)Rx+X*MG%X+n>PcNsn@|>TvOZ^D+)(sMDb@fK*oe`hY zWfRDt#7ZM`rFc6_y+Bm6et%gjwN<4vQEa2-wWGUy`522h`+JioTh|sF_0n$ko#PvP z>1pZsE`|Sc*-FN5`s3M@`3to=Ui$^PEabersi>$xaxYZ>CFvDXQ&XX<>XEv~p+w^b z1$!pNrt|k(v{xeT-HQ?03J}D~tg{c5*B6&g!;it7C5R5OE$Sz~V+oZUA0HpBjW(>W z*GVFwb{6q(c?*!w!rugE7F0fQ^weAd7v7PSZ5=cbH5(QQ<`nTvwz?!{ z7{;x+IoQa)&(GhdEyQKU(UCDAK0@eRs54r+9O zcqZc{6054KpH3U$Mj=f?I;Yic;lmKMS7_@vDO!XtD*EwbQT825G?I0AW3fT*6vbUH zWuV1{N5?N6lR1@3>r->+gpxSKn%C%ZG#~z;Lh2a|AWI5>e6*VYM zX=~Hr!=<|;LrhRmtD(YMOo#iStk3$BY5x6Ck<45B&}6-rJ+mWS4`f0Q)8pu9r~bm{ zIXMy23i|&G|JYeOafLl7!-^zWW#HK#7ZRs`T5pdI#jECj8VYyHBZ^(Sv-DeTaMEy5 z`XxzbK0ocS*Eo}580u4&qPO}X3m+H13U3DXTiytTMUS9wX!!4o@;?X2q}FPj4;84x z+q>IrpC=`mBk9KYq}TG+YmYoV?IdFgzm+$aR+VjD?&R(2l~&@^w-pF6V55osD4;J) zD-aNF-N66M;0gIl=uIoP z_En!sulPH>W;=Q7Hw0sjP9`R~y3+*A-I8(EgOM~T)i+tE%&nT+@2D# z$2Dz(6`VEKc20g=F|`Uo7eGdc84+L4_0jTQSNJB%rEKXMy8_wglKg)c8MWQ~d17o) z;GnK%X+!;3njwm36_o%To$-YQkv+7HGSo{}*`ZZcRiUAwXS3?vI3Fk)zabgJcA(`T zO-yzI>wyEeyu8p|H4QJp=Uf<7|95Q-8%CVzn;Uf+=p-Z>nPG;2fBBT9{nw#I^0XX1ekYr z(a{+kD1&=DKAtsB>(a%Gl0mi%to{$zHwE^D0i1#?UOQPXDK!(gG43uP9O-9xh0@YK z$UajuamTtQ)A?Z`iA>GJOYlXVTJRmcCuK>gY`mAYp&^_Z*GXSjmBZB3^rhVSUt4E1w~=81%nqPyZ1qr1NTok-sCeM{+Jm8)s>(c`SJdkep>SBvyGre+CG zD&fQD&rO!1==jk$ym9P5=IZ)0B*`2LEx zTnG)1I@D9MdChp(s?ljUDBp8B@8XT@9n2?df6Dxj>s)`4V};k=rmwD^Q8g;#SQ<#5 zv7@B4^ihy;yqR!@{FyPAlZ2fcw^>-Tru9vp=0>qe9O8>=o*$~xj4wgn6&w^<=Q4iJ z56Vd3UN_)Q!p;nr?Z=NsGhF@;qN0#sm{aaKi=7BAU?5MuhP{`Cj0@9KQ|}I~e+xbs zK6@h9LyE~hj#!Tg}L6o&k&l+D$tZ5X>~2Ylut?wL)O z?DR94E^)MT9a8L?l_F$@UyO~Z{wu|J#@J`oy8qDd z$|qkpRhNSAT{L;ZWhTzePi4M*jTriQKK9TUSpqS({i#gQ`Q`sK=|J7|Uf+)}gT_%Z z1v4|Y;JSX8&m$X0ubs#~cv*rYQvLF_HGOF2z{&?JVVaq+vy;%JTq6t~|M_uX~6>ri=7&=c5- z9XPp)T!Nk_do+kzp0uvK@j83DG*esQt+p{m|DL`3M6R3EmnOEBCf=I;9epmaU&e+z z{IuL(BGt%jP(^D@g@OLw^ZI+Q$gg4$*`?b#(}u6loc8W|OB8(3U!T*$%E1Au*UhU4 zJ7@6=m$I*YeTG^3n6#IY$m)1!yCNIefxV7q>gv);AG)!@|OV4lAbNQxyWw2vP(Ee+fi7ANP;O88nfs9`NA zG&vs;%GPV}ba`F>_V0J6J1>@>@;U*-xU~0Lu?jb;d1}9jiA!BND9JP%@wKyKcGMwl z!R7k(luia#)@*OVjn=U~Op@Ieq6{j@;=>AYJ5O6f}Pzpo3 z4B6i|3tlB2Wj-gmY>Hwj0@N&|l3sa~osCUnMcc-PhecB9ca-H?Vs-*X0uI=cu{kL7 z1Y_?gN1ev5YeD299g4p~A-wk2F*tixX@I%;)ieFbNA!Gb_0o(+_xB48ZZ79tC=!r= z4HwY;`#J!ZrHzMJ1)X85tS59VZ8N z=VX^Oc-D7MDcL^ImEY)TX$f1F(iR5tglvq0v^1XJx{uYD{c->WyD`hf9O?zuM5B#Mn(dP!jH+! zq>zV#f|Ksw_YtXAN;|9Jn?0&T)vEg6%Veb z(s|v)nP~Ws@IiQ17dCbg5f46RW_O7BZr<*iNO6U;wl3&;a&o3CZQy@^uWZ?>5G$&| z+f{tQkN(@|-D%IiEHZ1wWVOrAX15H)&m6TnK+)WhSDh_&aWk~}*mJ*`tzYLo#YBQw zuamdTbF5w8%Bzu^UTq%JExJK;QL*8ni__uWLkkOWv&ezCI7SwhY49jhQyPY6&xZ?k zQ;JN~Fo0xAb87R9V+&HrOUy!j2W+dlF>b3G;%ovXgRhK4Xhs-i7v3pWO`K6^D&CL&6$3Y0^%w_&I&d^QH&CFy7Rmt`@ka8NJB)~uTPf?AG z(l>7=MS|QyASQFd2jr=XLS&=KMeuCJA6kvJz;g*&e1jFDi z9gw=JpX3<&VgCoBWcJ?eU0g6H531j&{on~0yj(;L z`Hp2i@Y#VM;g*RNGCeLP_4=Jlz5R4$+ls|(#oy5QPj`7ZwYSJEZLFAk%dePc zGB`~*8!hKjsOp6exfykuia&C_P)>6Iv8&Vn@M99DFlH~P{0-0yyr=z+*&5mAc4$c3CXM3l)ec` z*Es4# z(5T@-`lt7ejfW*Af5FG=>2W~fc=q1VYF9BGEGU@GIAKg)9)0RqjTCBaaVe?8$-K6l zAp@RErn>atydD{hlvh+VOAtN9SkM2B-zL3CJ$JCL=^20Y=|bTKB-IqFdwF^$5+h&E z%Q9D9{X!~p8y5Dm_SM!Z0QLvy&B7S|AlLFhs5>ZBo4@&tG?cJNqHgt3`0ZL|hKQDw z@NFNg7(y&S`HW(@7y8to(yDII|vjUcNoYF$`rwUnobcje~MBT z(<6=k*H$)IX9@XBBpJWXXH%qckRTZ=V;{6*gj(O)&iV>XE*P~X_+u%|MHGI7MYRGN zA0MMKNH4K*T!h7g`{5J@Ah2Zvx)%w`e3!n{#PF!KUh|pr_}=qo&y#Pwp=$5y>nSG* zX?jRB{f(*$8Prm`y1L)9SPs($T7NcC(Y)>Gn1if<^@ab!07jhiZt+~{A;gd(z27$@ zyatObH5HXCkqA~PNJyPZC`|h1k?0n1X#a8r%90NemRDAe?xAI`R)DXbwB6=5gB>{p zF>@tCeV6?_2>AsCDbyV=?*%i@ie=}*VJjNC{0=ETQSodafuT zAV5pN>{Y*&f^dYDhI@+@j}4E0%^KTBH|@3gx_r!=*9Y;+VfxPnM#nz^3d?#e&@M1e>SqV=)3omBqw zOf1gues3dqMdzo0bb^(mCpUayZq9pi{buj(v>;2EcR?cgyLX)nJUkI3={FuyP?*2& zYBWOcZD+;*LhG%eLI58tkxMiBMMwP7k_+0DHGA|%V0bWrz;_!N?JrYI(ib?i5^aV^ z36?t#6B0Bx@58$KxvwwgF^zH^K_N@uXLEIu@T1Sv`J|LT*;#o64Ws7?degexzHP1iBuRk&7pajj=AOa z)>2eraKe=vy+xvQ%`JUH;XaRjLGOk|RECdm1{7l^>an*xNJ`p3=0|q609voj8Ff`v z#5?gwNE8^k|`nHjLq zU={~JBH`nsJnSu0V>)&}9f7^iT6R<18K?0&Bnu=a(zia@Jz!bu+$@c%9uj-_ydS4# z0)Rp1tCK9pPC$8y#PTdIf+cuoFvg;yKOkR3A`l1R!5tpjz|_LRW2j*|Cn*$e-9i&x zrj)`!LkVuncJgrY?Ly19cTvF72EJ2VdC0kIDhb|YL9jjAM{ouj6{NcR=W6Kf@qa5S zE{?Z+I-_}xIQcAAORopF2CAtWzl0=N|ByKqU;7>+u(r8_hD$k3Uw}-(%}am)5c-h` zB_Um8N@avV*!F<*8v$pJ0Pei7}O@|qP|%29OM2^$?jp@p81Usyvi9F>}r9bH2ErJ{aVv8YPB=+W?*Gu@EzsgB&#|G-9s|G@XE7I_=40U%auiYp%s`7Hf zN^||XSU-?)G%)_|;q07uh98&1#m$X)ZKM_=QAz@K!V0(9 zee8)3A1ZP@NV6r+zb+V%=W0ZXNQ~!}6CpnpNf2=7>GCe*UYG9Eet(I5(_C@BGINmoNzAS47m z!AHRGqN1WgLhS}~{%FUkJU)FW67EZ6EIC9j|M+oYt6@5{$>EsMYre#F^%msH4VQ5) z&n*4;!5L){bXFi51!cP5laU<0N8oTZG-w=-=(T?Ov=Y6M|L$M>B9ltDub;7C41}~O zA|pH%>5mzl;N_(>CF>y-P2Y57mFyXtTUyqTFtD7|aKh!V7IBs2vx%87$rimxOZ&OCdEN88<1+aznZn6~e|NPft`2m3<}Wlh z^?v?l>RmO(qGM@;3SSVzF@~K~b)B8M!^Zm&P5ok8W?L0r+*8}pPP^^?poP@ejZR(N zquF63c4q=W5Mg9fYX0svcLHZy%N8)AGuLLce*f=I(e;W_kUFU*)$`51Mc0RrF_pa6=o4?Rej`JL65fOl)kjsB4~|WnpI@ z?CpIn^f>j$>?$*!t_#A`q+YGQUWJK?RC9s}TJo%f@y`1&xEh+OJ%Z|d2f=M4m=Hw^ za8!K(=dW*4j%y7IF;Xo{zIDb)DIed3R!1@Vzr{9)!`{Imj(Dpyh<{x?fxWCSIP43{{iDSx3B;J literal 0 HcmV?d00001 From c1d7f21db1666ba5a71fd68df8fc991920d6f2b6 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Sat, 6 May 2017 18:05:08 +0800 Subject: [PATCH 218/379] update --- 4/include.md | 33 ++++++++++++++++++++++++++++++--- img/include_2.png | Bin 31223 -> 35452 bytes img/include_3.png | Bin 32627 -> 36203 bytes img/include_4.png | Bin 26132 -> 27975 bytes 4 files changed, 30 insertions(+), 3 deletions(-) diff --git a/4/include.md b/4/include.md index 0484310..04b64b1 100644 --- a/4/include.md +++ b/4/include.md @@ -102,7 +102,34 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INCLUDE_OR_EVAL_SPEC_CONST_HAN 看到这里你可能会有一个疑问:$var_2既然被重新修改为新的一个值了,那么为什么调用文件中的$var_2仍然指向释放掉的value呢?include执行完成回到原来的调用文件中后为何可以读取到新的$var_2值以及新定义的var_3呢?答案在被包含文件执行完毕return的过程中。 -被包含文件执行完以后最后执行return返回调用文件include的位置,return时会把***被包含文件中的***全局变量从zend_execute_data中移到EG(symbol_table)中,这里的移动是把value值更新到EG(symbol_table),而不是像原来那样间接的指向value,这个过程由`zend_detach_symbol_table()`完成: +被包含文件执行完以后最后执行return返回调用文件include的位置,return时会把***被包含文件中的***全局变量从zend_execute_data中移到EG(symbol_table)中,这里的移动是把value值更新到EG(symbol_table),而不是像原来那样间接的指向value,这个操作在`zend_detach_symbol_table()`中完成,具体的return处理: +```c +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS) +{ + ... + if (EXPECTED((ZEND_CALL_KIND_EX(call_info) & ZEND_CALL_TOP) == 0)) { + //将include文件中定义的变量移到EG(symbol_table) + zend_detach_symbol_table(execute_data); + //释放zend_op_array + destroy_op_array(&EX(func)->op_array); + + old_execute_data = execute_data; + //切回调用文件的zend_execute_data + execute_data = EG(current_execute_data) = EX(prev_execute_data); + //释放include文件的zend_execute_data + zend_vm_stack_free_call_frame_ex(call_info, old_execute_data); + + //重新attach + zend_attach_symbol_table(execute_data); + + LOAD_NEXT_OPLINE(); + ZEND_VM_LEAVE(); + }else{ + //函数、主脚本返回的情况 + } +} +``` +`zend_detach_symbol_table()`操作: ```c ZEND_API void zend_detach_symbol_table(zend_execute_data *execute_data) { @@ -132,6 +159,6 @@ ZEND_API void zend_detach_symbol_table(zend_execute_data *execute_data) ![](../img/include_4.png) -include文件在attach_symbol_table()时如果发现要插入的全局变量已经存在,则会将新的全局变量的value指向原value,然后将全局变量更新为新的全局变量。 +接着是还原调用文件的zend_execute_data,切回调用文件的include位置,在将执行器切回之前再次执行了`zend_attach_symbol_table()`,这时就会将原调用文件的变量重新插入全局变量符号表,插入$var_2、$var_3时发现已经存在了,则将局部变量区的$var_2、$var_3的value修改为这个值,这就是$var_2被include文件更新后覆盖原value的过程,同时$var_3也因为在调用文件中出现了所以值被修改为include中设定的值,此时的内存关系: + -include执行完成return时zend_detach_symbol_table()时会将所有的全局变量的value拷到EG(symbol_table)中(CV->symbol table),原调用文件重新attach,这样会把include文件中的全局变量移到当前文件,如果include中修改了原文件的全局变量,此时也会将更新后的value重新赋给原文件的变量(symbol table -> CV)。 diff --git a/img/include_2.png b/img/include_2.png index 2c136fd91c50037377aa4cfec340f4b0020a4111..bdbdd5845e9b61c5d5415037a230e094fa347c05 100644 GIT binary patch literal 35452 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 JOJq#m{~rzb={^7e literal 31223 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 diff --git a/img/include_3.png b/img/include_3.png index f5227fa8af88057f33e8cea714fef820be3ddb89..37e505661b290ab86bc1daa40909ef2060276624 100644 GIT binary patch literal 36203 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%0Da8yol&Jm0VLgjrF@(A!|JM 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 M$Z_@8s#drD7e`dp00000 diff --git a/img/include_4.png b/img/include_4.png index 765de7a8c9311ce9eee9cca236fffc394d6aa96b..461bbb77b551735dd4e7398d2c917e9586259f89 100644 GIT binary patch literal 27975 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 CH-+l} literal 26132 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 From c4723747819cde6c10e757b6e7161a589bbbdaf9 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Sat, 6 May 2017 18:14:50 +0800 Subject: [PATCH 219/379] update --- 4/include.md | 2 ++ img/include_5.png | Bin 0 -> 26895 bytes 2 files changed, 2 insertions(+) create mode 100644 img/include_5.png diff --git a/4/include.md b/4/include.md index 04b64b1..3881fed 100644 --- a/4/include.md +++ b/4/include.md @@ -161,4 +161,6 @@ ZEND_API void zend_detach_symbol_table(zend_execute_data *execute_data) 接着是还原调用文件的zend_execute_data,切回调用文件的include位置,在将执行器切回之前再次执行了`zend_attach_symbol_table()`,这时就会将原调用文件的变量重新插入全局变量符号表,插入$var_2、$var_3时发现已经存在了,则将局部变量区的$var_2、$var_3的value修改为这个值,这就是$var_2被include文件更新后覆盖原value的过程,同时$var_3也因为在调用文件中出现了所以值被修改为include中设定的值,此时的内存关系: +![](../img/include_5.png) + diff --git a/img/include_5.png b/img/include_5.png new file mode 100644 index 0000000000000000000000000000000000000000..fca08e35281d1aef48e4438c9bdcfc52bf9738f4 GIT binary patch literal 26895 zcmdRWWmr{f)a{ZIX%JDmyQC!~q&D4MN;gPIhop3ON{4heibx7bN_TfR+}HCx_y4`m z{dM>89QN6;7i-UV));e4LlosD(NPFcAP7R2f{7_Z5Zp9)zKskA{_EY}DhIwG8OlhC zL686b$!;r*1Ft-@hiN%N5XR4c|2|1z#2|zqGDu2HMAbEYFT+Du_WH4Bkz=bxm8C3I z+dzyZ?9Gf^-yip}{gxezFWx@!7Ie2C+Vo^OhwPp%cbJ5WzxFdM@is z=u3v|M+QqmssmrZpB;q%-=8>nBfyC`ro|^EF_uTCrOhfk&fxm^JkrRl<=mm)TwNI( z8^aPCTUr{HxFn-lWL*B409LA^qOy8$keQy21~oM`g@lBB`t%7pI@=ywX!D5UTV7tK zl}~^D`ZZZ$jp^@`vooSM_GG-j`}^5BIr9`A?@os^_+9EBdu(iNZRO=7Ri&h*`+o$Y zPFvTn)E~B8W@cpQsjI8UgxH8yjJpA|N<;pqb6d*}3f7x84RfJ-zwFb6tIXLGQb(7mVsxH#gi3 z`*l`RhDJtH<$9%_aVsk;&byPmyu4akTJ%MD1Ozu*e{x4hl^s$O6F(g-iEyW7#Ku

^e8fw55e0shzz3+MTBh4eR1 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 literal 0 HcmV?d00001 From 098bc4db2bce1eed9070401f192d9f96e0425017 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Sat, 6 May 2017 18:32:56 +0800 Subject: [PATCH 220/379] finish include --- 4/include.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/4/include.md b/4/include.md index 3881fed..f2f92f7 100644 --- a/4/include.md +++ b/4/include.md @@ -163,4 +163,6 @@ ZEND_API void zend_detach_symbol_table(zend_execute_data *execute_data) ![](../img/include_5.png) +这就是include的实现原理,整个过程并不复杂,比较难理解的一点在于两个文件之间变量的继承、覆盖,可以仔细研究下上面不同阶段时的内存关系图。 +最后简单介绍下include_once、require_once,这两个与include、require的区别是在一次请求中同一文件只会被加载一次,第一次执行时会把这个文件保存在EG(included_files)哈希表中,再次加载时检查这个哈希表,如果发现已经加载过则直接跳过。 From 2b528b5487580a533f6f06c0525b5dd3b599308c Mon Sep 17 00:00:00 2001 From: qinpeng Date: Sat, 6 May 2017 18:34:06 +0800 Subject: [PATCH 221/379] update --- README.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index d1ae006..2e56dd3 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,6 @@ 代码版本:php-7.0.12 ```` - ## 目录: * 第1章 PHP基本架构 * 1.1 PHP简介 @@ -42,8 +41,8 @@ * [4.2 选择结构](4/if.md) * [4.3 循环结构](4/loop.md) * [4.4 中断及跳转](4/break.md) - * 4.5 include/require - * 4.6 try-catch + * [4.5 include/require](4/include.md) + * 4.6 异常捕获 * 第5章 内存管理 * [5.1 Zend内存池](5/zend_alloc.md) * 5.2 引用计数 From 8bee455af839d1baed54c855873fe916808074c9 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Sat, 6 May 2017 18:36:44 +0800 Subject: [PATCH 222/379] update --- 4/include.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/4/include.md b/4/include.md index f2f92f7..8df3fd2 100644 --- a/4/include.md +++ b/4/include.md @@ -1,5 +1,5 @@ ## 4.5 include/require -在实际应用中,我们不可能把所有的代码写到一个文件中,而是会按照一定的标准进行文件划分,include与require的功能就是将其他文件加载进来,比如在面向对象中通常会把一个类定义在单独文件中,使用时再include进来,类似其他语言的包的概念。 +在实际应用中,我们不可能把所有的代码写到一个文件中,而是会按照一定的标准进行文件划分,include与require的功能就是将其他文件包含进来并且执行,比如在面向对象中通常会把一个类定义在单独文件中,使用时再include进来,类似其他语言中包的概念。 include与require没有本质上的区别,唯一的不同在于错误级别,当文件无法被正常加载时include会抛出warning警告,而require则会抛出error错误,本节下面的内容将以include说明。 From b2f40ce7c6327d2a7959c4ee54b71fdf642544ae Mon Sep 17 00:00:00 2001 From: qinpeng Date: Sun, 7 May 2017 16:14:00 +0800 Subject: [PATCH 223/379] add exception --- 4/exception.md | 72 ++++++++++++++++++++++++++++++++++++++++++ img/exception_ast.png | Bin 0 -> 22049 bytes img/exception_run.png | Bin 0 -> 53837 bytes 3 files changed, 72 insertions(+) create mode 100644 4/exception.md create mode 100644 img/exception_ast.png create mode 100644 img/exception_run.png diff --git a/4/exception.md b/4/exception.md new file mode 100644 index 0000000..6bb1327 --- /dev/null +++ b/4/exception.md @@ -0,0 +1,72 @@ +## 4.6 异常处理 +PHP的异常处理与其它语言的类似,在程序中可以抛出、捕获一个异常,异常抛出必须只有定义在try{...}块中才可以被捕获,捕获以后将跳到catch块中进行处理,不再执行try中抛出异常之后的代码。 + +异常可以在任意位置抛出,然后将由最近的一个try所捕获,如果在当前执行空间没有进行捕获,那么将调用栈一直往上抛,比如在一个函数内部抛出一个异常,但是函数内没有进行try,而在函数调用的位置try了,那么就由调用处的catch捕获。 + +接下来我们从两个方面介绍下PHP异常处理的实现。 + +### 4.6.1 异常处理的编译 +异常捕获及处理的语法: +```php +try{ + try statement; +}catch(exception_class_1 $e){ + catch statement 1; +}catch(exception_class_2 $e){ + catch statement 2; +}finally{ + finally statement; +} +``` +抛出异常的语法: +```php +throw exception_object; +``` +try表示要捕获try statement中可能抛出的异常;catch是捕获到异常后的处理,可以定义多个,当try中抛出异常时会依次检查各个catch的异常类是否与抛出的匹配,如果匹配则有命中的那个catch块处理;finally为最后执行的代码,不管是否有异常抛出都会执行。 + +语法规则: +```c +statement: + ... + | T_TRY '{' inner_statement_list '}' catch_list finally_statement + { $$ = zend_ast_create(ZEND_AST_TRY, $3, $5, $6); } + ... +; +catch_list: + /* empty */ + { $$ = zend_ast_create_list(0, ZEND_AST_CATCH_LIST); } + | catch_list T_CATCH '(' name T_VARIABLE ')' '{' inner_statement_list '}' + { $$ = zend_ast_list_add($1, zend_ast_create(ZEND_AST_CATCH, $4, $5, $8)); } +; +finally_statement: + /* empty */ { $$ = NULL; } + | T_FINALLY '{' inner_statement_list '}' { $$ = $3; } +; +``` +从语法规则可以看出,try-catch-finally最终编译为一个`ZEND_AST_TRY`节点,包含三个子节点,分别是:try statement、catch list、finally statement,try statement、finally statement就是普通的`ZEND_AST_STMT_LIST`节点,catch list包含多个`ZEND_AST_CATCH`节点,每个节点有三个子节点:exception class、exception object及catch statement,最终生成的AST: + +![](../img/exception_ast.png) + +具体的编译过程如下: + +* (1) 向所属zend_op_array注册一个zend_try_catch_element结构,所有try都会注册一个这样的结构,与循环结构注册的zend_brk_cont_element类似,当前zend_op_array所有定义的异常保存在zend_op_array->try_catch_array数组中,这个结构用来记录try、catch以及finally开始的位置,具体结构: +```c +typedef struct _zend_try_catch_element { + uint32_t try_op; //try开始的opcode位置 + uint32_t catch_op; //第1个catch块的opcode位置 + uint32_t finally_op; //finally开始的opcode位置 + uint32_t finally_end;//finally结束的opcode位置 +} zend_try_catch_element; +``` +* (2) 编译try statement,编译完以后如果定义了catch块则编译一条`ZEND_JMP`,此opcode的作用时当无异常抛出时跳过所有catch跳到finally或整个异常之外的,因为catch块是在try statement之后编译的,所以具体的跳转值目前还无法确定; + +* (3) 依次编译各个catch块,如果没有定义则跳过此步骤,每个catch编译时首先编译一条`ZEND_CATCH`,此opcode保存着此catch的exception class、exception object以及下一个catch块开始的位置,编译第1个catch时将此opcode的位置记录在zend_try_catch_element.catch_op上,接着编译catch statement,最后编译一条`ZEND_JMP`(最后一个catch不需要),此opcode的作用与步骤(2)的相同; + +* (4) 将步骤(2)、步骤(3)中`ZEND_JMP`跳转值设置为finally第1条opcode或异常定义之外的代码,如果没有定义finally则结束编译,否则编译finally块,首先编译一条`ZEND_FAST_CALL`及`ZEND_JMP`,接着编译finally statement,最后编译一条`ZEND_FAST_RET`。 + +编译完以后的结构: + +![](../img/exception_run.png) + + +### 4.6.2 异常的抛出与捕获 diff --git a/img/exception_ast.png b/img/exception_ast.png new file mode 100644 index 0000000000000000000000000000000000000000..3ae4a3f5c472a35ad77359f0b1befd68395a2346 GIT binary patch literal 22049 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∋#+@4*``EsYzu7Yq`F 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 TcXweMKoCV)HJLBcrhfki%l{Yi literal 0 HcmV?d00001 From e285375e65b29bd31974261a825227ebb8fc3915 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Sun, 7 May 2017 16:28:41 +0800 Subject: [PATCH 224/379] update --- 4/exception.md | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/4/exception.md b/4/exception.md index 6bb1327..76ace2e 100644 --- a/4/exception.md +++ b/4/exception.md @@ -18,10 +18,6 @@ try{ finally statement; } ``` -抛出异常的语法: -```php -throw exception_object; -``` try表示要捕获try statement中可能抛出的异常;catch是捕获到异常后的处理,可以定义多个,当try中抛出异常时会依次检查各个catch的异常类是否与抛出的匹配,如果匹配则有命中的那个catch块处理;finally为最后执行的代码,不管是否有异常抛出都会执行。 语法规则: @@ -49,7 +45,7 @@ finally_statement: 具体的编译过程如下: -* (1) 向所属zend_op_array注册一个zend_try_catch_element结构,所有try都会注册一个这样的结构,与循环结构注册的zend_brk_cont_element类似,当前zend_op_array所有定义的异常保存在zend_op_array->try_catch_array数组中,这个结构用来记录try、catch以及finally开始的位置,具体结构: +* __(1)__ 向所属zend_op_array注册一个zend_try_catch_element结构,所有try都会注册一个这样的结构,与循环结构注册的zend_brk_cont_element类似,当前zend_op_array所有定义的异常保存在zend_op_array->try_catch_array数组中,这个结构用来记录try、catch以及finally开始的位置,具体结构: ```c typedef struct _zend_try_catch_element { uint32_t try_op; //try开始的opcode位置 @@ -58,15 +54,23 @@ typedef struct _zend_try_catch_element { uint32_t finally_end;//finally结束的opcode位置 } zend_try_catch_element; ``` -* (2) 编译try statement,编译完以后如果定义了catch块则编译一条`ZEND_JMP`,此opcode的作用时当无异常抛出时跳过所有catch跳到finally或整个异常之外的,因为catch块是在try statement之后编译的,所以具体的跳转值目前还无法确定; +* __(2)__ 编译try statement,编译完以后如果定义了catch块则编译一条`ZEND_JMP`,此opcode的作用时当无异常抛出时跳过所有catch跳到finally或整个异常之外的,因为catch块是在try statement之后编译的,所以具体的跳转值目前还无法确定; -* (3) 依次编译各个catch块,如果没有定义则跳过此步骤,每个catch编译时首先编译一条`ZEND_CATCH`,此opcode保存着此catch的exception class、exception object以及下一个catch块开始的位置,编译第1个catch时将此opcode的位置记录在zend_try_catch_element.catch_op上,接着编译catch statement,最后编译一条`ZEND_JMP`(最后一个catch不需要),此opcode的作用与步骤(2)的相同; +* __(3)__ 依次编译各个catch块,如果没有定义则跳过此步骤,每个catch编译时首先编译一条`ZEND_CATCH`,此opcode保存着此catch的exception class、exception object以及下一个catch块开始的位置,编译第1个catch时将此opcode的位置记录在zend_try_catch_element.catch_op上,接着编译catch statement,最后编译一条`ZEND_JMP`(最后一个catch不需要),此opcode的作用与步骤(2)的相同; -* (4) 将步骤(2)、步骤(3)中`ZEND_JMP`跳转值设置为finally第1条opcode或异常定义之外的代码,如果没有定义finally则结束编译,否则编译finally块,首先编译一条`ZEND_FAST_CALL`及`ZEND_JMP`,接着编译finally statement,最后编译一条`ZEND_FAST_RET`。 +* __(4)__ 将步骤(2)、步骤(3)中`ZEND_JMP`跳转值设置为finally第1条opcode或异常定义之外的代码,如果没有定义finally则结束编译,否则编译finally块,首先编译一条`ZEND_FAST_CALL`及`ZEND_JMP`,接着编译finally statement,最后编译一条`ZEND_FAST_RET`。 编译完以后的结构: ![](../img/exception_run.png) +抛出异常的语法: +```php +throw exception_object; +``` +throw的编译比较简单,最终只编译为一条opcode:`ZEND_THROW`。 ### 4.6.2 异常的抛出与捕获 +上一小节我们介绍了exception结构在编译阶段的处理,接下来我们再介绍下运行时exception的处理过程,exception的处理过程相对比较复杂,为容易理解,下面将只对主要处理进行说明。 + + From a4d90d08e9fa4419331f9424c84f4aaf2fea20a5 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Sun, 7 May 2017 16:41:26 +0800 Subject: [PATCH 225/379] add exception --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 2e56dd3..dd108b9 100644 --- a/README.md +++ b/README.md @@ -42,7 +42,7 @@ * [4.3 循环结构](4/loop.md) * [4.4 中断及跳转](4/break.md) * [4.5 include/require](4/include.md) - * 4.6 异常捕获 + * [4.6 异常处理](4/exception.md) * 第5章 内存管理 * [5.1 Zend内存池](5/zend_alloc.md) * 5.2 引用计数 From 8801ff165e17142061717665c1e8a109b1fb4519 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Tue, 9 May 2017 15:58:55 +0800 Subject: [PATCH 226/379] update --- 4/exception.md | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/4/exception.md b/4/exception.md index 76ace2e..fc65826 100644 --- a/4/exception.md +++ b/4/exception.md @@ -64,13 +64,21 @@ typedef struct _zend_try_catch_element { ![](../img/exception_run.png) -抛出异常的语法: +异常的抛出通过throw一个异常对象来实现,这个对象必须继承>自Exception类,抛出异常的语法: ```php throw exception_object; ``` throw的编译比较简单,最终只编译为一条opcode:`ZEND_THROW`。 ### 4.6.2 异常的抛出与捕获 -上一小节我们介绍了exception结构在编译阶段的处理,接下来我们再介绍下运行时exception的处理过程,exception的处理过程相对比较复杂,为容易理解,下面将只对主要处理进行说明。 +上一小节我们介绍了exception结构在编译阶段的处理,接下来我们再介绍下运行时exception的处理过程,这个过程相对比较复杂,简单的概括,整体的处理流程如下: + +* (1) 检查抛出的是否是object,否则将导致error错误; +* (2) 将EG(exception)设置为抛出的异常对象,同时将当前stack(即:zend_execute_data)接下来要执行的opcode设置为`ZEND_HANDLE_EXCEPTION`; +* (3) 执行`ZEND_HANDLE_EXCEPTION`,查找匹配的catch: + ** (3.1) 首先遍历当前zend_op_array下定义的所有异常捕获,即`zend_op_array->try_catch_array`数组,然后根据throw的位置、try开始的位置、catch开始的位置、finally开始的位置判断判断异常是否在try范围内,如果同时命中了多个try(即嵌套try的情况)则选择最后那个(也就是最里层的),遍历完以后如果命中了则进入步骤(3.2)处理,如果没有命中当前stack下任何try则进入步骤(4); + ** (3.2) 到这一步表示抛出的异常在当前zend_op_array下有try拦截(注意这里只是表示异常在try中抛出的,但是抛出的异常并一定能被catch),然后根据当前try块的`zend_try_catch_element`结构取出第一个catch的位置,将opcode设置为zend_try_catch_element.catch_op,跳到第一个catch块开始的位置执行,即:执行`ZEND_CATCH`; + ** (3.3) 执行`ZEND_CATCH`,检查抛出的异常对象是否与当前catch的类型匹配,检查的过程为判断两个类是否存在父子关系,如果匹配则表示异常被成功捕获,将EG(exception)清空,如果没有则跳到下一个catch的位置重复步骤(3.3),如果到最后一个catch仍然没有命中则在这个catch的位置抛出一个异常(实际还是原来按个异常,只是将抛出的位置转移了当前catch的位置),然后回到步骤(3); +* (4) 当前zend_op_array没能成功捕获异常,需要继续往上抛:回到调用位置,将接下来要执行的opcode设置为`ZEND_HANDLE_EXCEPTION`,比如函数中抛出了一个异常没有在函数中捕获,则跳到调用的位置继续捕获,回到步骤(3);如果到最终主脚本也没有被捕获则将结束执行并导致error错误。 From da37442b78ee1850c6163e6d9a346114af5db4b8 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Tue, 9 May 2017 17:07:48 +0800 Subject: [PATCH 227/379] update --- 4/exception.md | 36 ++++++++++++++++++++++++++++-------- img/exception_run_2.png | Bin 0 -> 37048 bytes 2 files changed, 28 insertions(+), 8 deletions(-) create mode 100644 img/exception_run_2.png diff --git a/4/exception.md b/4/exception.md index fc65826..bf23a2f 100644 --- a/4/exception.md +++ b/4/exception.md @@ -71,14 +71,34 @@ throw exception_object; throw的编译比较简单,最终只编译为一条opcode:`ZEND_THROW`。 ### 4.6.2 异常的抛出与捕获 -上一小节我们介绍了exception结构在编译阶段的处理,接下来我们再介绍下运行时exception的处理过程,这个过程相对比较复杂,简单的概括,整体的处理流程如下: +上一小节我们介绍了exception结构在编译阶段的处理,接下来我们再介绍下运行时exception的处理过程,这个过程相对比较复杂,整体的讲其处理流程整体如下: -* (1) 检查抛出的是否是object,否则将导致error错误; -* (2) 将EG(exception)设置为抛出的异常对象,同时将当前stack(即:zend_execute_data)接下来要执行的opcode设置为`ZEND_HANDLE_EXCEPTION`; -* (3) 执行`ZEND_HANDLE_EXCEPTION`,查找匹配的catch: - ** (3.1) 首先遍历当前zend_op_array下定义的所有异常捕获,即`zend_op_array->try_catch_array`数组,然后根据throw的位置、try开始的位置、catch开始的位置、finally开始的位置判断判断异常是否在try范围内,如果同时命中了多个try(即嵌套try的情况)则选择最后那个(也就是最里层的),遍历完以后如果命中了则进入步骤(3.2)处理,如果没有命中当前stack下任何try则进入步骤(4); - ** (3.2) 到这一步表示抛出的异常在当前zend_op_array下有try拦截(注意这里只是表示异常在try中抛出的,但是抛出的异常并一定能被catch),然后根据当前try块的`zend_try_catch_element`结构取出第一个catch的位置,将opcode设置为zend_try_catch_element.catch_op,跳到第一个catch块开始的位置执行,即:执行`ZEND_CATCH`; - ** (3.3) 执行`ZEND_CATCH`,检查抛出的异常对象是否与当前catch的类型匹配,检查的过程为判断两个类是否存在父子关系,如果匹配则表示异常被成功捕获,将EG(exception)清空,如果没有则跳到下一个catch的位置重复步骤(3.3),如果到最后一个catch仍然没有命中则在这个catch的位置抛出一个异常(实际还是原来按个异常,只是将抛出的位置转移了当前catch的位置),然后回到步骤(3); -* (4) 当前zend_op_array没能成功捕获异常,需要继续往上抛:回到调用位置,将接下来要执行的opcode设置为`ZEND_HANDLE_EXCEPTION`,比如函数中抛出了一个异常没有在函数中捕获,则跳到调用的位置继续捕获,回到步骤(3);如果到最终主脚本也没有被捕获则将结束执行并导致error错误。 +* __(1)__ 检查抛出的是否是object,否则将导致error错误; +* __(2)__ 将EG(exception)设置为抛出的异常对象,同时将当前stack(即:zend_execute_data)接下来要执行的opcode设置为`ZEND_HANDLE_EXCEPTION`; +* __(3)__ 执行`ZEND_HANDLE_EXCEPTION`,查找匹配的catch: + * __(3.1)__ 首先遍历当前zend_op_array下定义的所有异常捕获,即`zend_op_array->try_catch_array`数组,然后根据throw的位置、try开始的位置、catch开始的位置、finally开始的位置判断判断异常是否在try范围内,如果同时命中了多个try(即嵌套try的情况)则选择最后那个(也就是最里层的),遍历完以后如果命中了则进入步骤(3.2)处理,如果没有命中当前stack下任何try则进入步骤(4); + * __(3.2)__ 到这一步表示抛出的异常在当前zend_op_array下有try拦截(注意这里只是表示异常在try中抛出的,但是抛出的异常并一定能被catch),然后根据当前try块的`zend_try_catch_element`结构取出第一个catch的位置,将opcode设置为zend_try_catch_element.catch_op,跳到第一个catch块开始的位置执行,即:执行`ZEND_CATCH`; + * __(3.3)__ 执行`ZEND_CATCH`,检查抛出的异常对象是否与当前catch的类型匹配,检查的过程为判断两个类是否存在父子关系,如果匹配则表示异常被成功捕获,将EG(exception)清空,如果没有则跳到下一个catch的位置重复步骤(3.3),如果到最后一个catch仍然没有命中则在这个catch的位置抛出一个异常(实际还是原来按个异常,只是将抛出的位置转移了当前catch的位置),然后回到步骤(3); +* __(4)__ 当前zend_op_array没能成功捕获异常,需要继续往上抛:回到调用位置,将接下来要执行的opcode设置为`ZEND_HANDLE_EXCEPTION`,比如函数中抛出了一个异常没有在函数中捕获,则跳到调用的位置继续捕获,回到步骤(3);如果到最终主脚本也没有被捕获则将结束执行并导致error错误。 +这个过程最复杂的地方在于异常匹配、传递的过程,主要为`ZEND_HANDLE_EXCEPTION`、`ZEND_CATCH`两条opcode之间的调用,当抛出一个异常时会终止后面opcode的执行,转向执行`ZEND_HANDLE_EXCEPTION`,根据异常抛出的位置定位到最近的一个try的catch位置,如果这个catch没有匹配则跳到下一个catch块,然后再次执行`ZEND_HANDLE_EXCEPTION`,如果到最后一个catch仍没有匹配则将异常抛出前位置opline_before_exception更新为最后一个catch的位置,再次执行`ZEND_HANDLE_EXCEPTION`,由于异常抛出的位置已经更新了所以不会再匹配上次检查过的那个catch,这个过程实际就是不断递归执行`ZEND_HANDLE_EXCEPTION`、`ZEND_CATCH`;如果当前zend_op_array都无法捕获则将异常抛向上一个调用栈继续捕获,下面根据一个例子具体说明下: +```php +function my_func(){ + //... + throw new Exception("This is a exception from my_func()"); +} + +try{ + my_func(); +}catch(ErrorException $e){ + echo "ErrorException"; +}catch(Exception $e){ + echo "Exception"; +} +``` +my_func()中抛出了一个异常,首先在my_func()中抛出一个异常,然后在my_func()的zend_op_array中检查是不是能够捕获,发现没有,则回到调用的位置,再次检查,第1次匹配到`catch(ErrorException $e)`,检查后发现并不匹配,然后跳到下一个catch块继续匹配,第2次匹配到`catch(Exception $e)`,检查后发现命中,捕获成功。 + +![](../img/exception_run_2.png) + +具体的实现过程还有很多额外的处理,这里不再展开,感兴趣的可以详细研究下`ZEND_HANDLE_EXCEPTION`、`ZEND_CATCH`两条opcode以及zend_exception.c中具体逻辑。 diff --git a/img/exception_run_2.png b/img/exception_run_2.png new file mode 100644 index 0000000000000000000000000000000000000000..4d8369d7bc68e31787f1709cac93e11d70619e8b GIT binary patch literal 37048 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 Thk1}5f!A|!`DaC<2JikKX`HEs literal 0 HcmV?d00001 From 675eb803f33dfd8c33d72bbb074f6bc57803f7f3 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Tue, 9 May 2017 17:55:58 +0800 Subject: [PATCH 228/379] finish exception --- 4/exception.md | 78 ++++++++++++++++++++++++++++++++++++++++++++++++- img/throw.png | Bin 0 -> 12265 bytes 2 files changed, 77 insertions(+), 1 deletion(-) create mode 100644 img/throw.png diff --git a/4/exception.md b/4/exception.md index bf23a2f..cb0adeb 100644 --- a/4/exception.md +++ b/4/exception.md @@ -81,7 +81,9 @@ throw的编译比较简单,最终只编译为一条opcode:`ZEND_THROW`。 * __(3.3)__ 执行`ZEND_CATCH`,检查抛出的异常对象是否与当前catch的类型匹配,检查的过程为判断两个类是否存在父子关系,如果匹配则表示异常被成功捕获,将EG(exception)清空,如果没有则跳到下一个catch的位置重复步骤(3.3),如果到最后一个catch仍然没有命中则在这个catch的位置抛出一个异常(实际还是原来按个异常,只是将抛出的位置转移了当前catch的位置),然后回到步骤(3); * __(4)__ 当前zend_op_array没能成功捕获异常,需要继续往上抛:回到调用位置,将接下来要执行的opcode设置为`ZEND_HANDLE_EXCEPTION`,比如函数中抛出了一个异常没有在函数中捕获,则跳到调用的位置继续捕获,回到步骤(3);如果到最终主脚本也没有被捕获则将结束执行并导致error错误。 -这个过程最复杂的地方在于异常匹配、传递的过程,主要为`ZEND_HANDLE_EXCEPTION`、`ZEND_CATCH`两条opcode之间的调用,当抛出一个异常时会终止后面opcode的执行,转向执行`ZEND_HANDLE_EXCEPTION`,根据异常抛出的位置定位到最近的一个try的catch位置,如果这个catch没有匹配则跳到下一个catch块,然后再次执行`ZEND_HANDLE_EXCEPTION`,如果到最后一个catch仍没有匹配则将异常抛出前位置opline_before_exception更新为最后一个catch的位置,再次执行`ZEND_HANDLE_EXCEPTION`,由于异常抛出的位置已经更新了所以不会再匹配上次检查过的那个catch,这个过程实际就是不断递归执行`ZEND_HANDLE_EXCEPTION`、`ZEND_CATCH`;如果当前zend_op_array都无法捕获则将异常抛向上一个调用栈继续捕获,下面根据一个例子具体说明下: +![](../throw.png) + +这个过程最复杂的地方在于异常匹配、传递的过程,主要为`ZEND_HANDLE_EXCEPTION`、`ZEND_CATCH`两条opcode之间的调用,当抛出一个异常时会终止后面opcode的执行,转向执行`ZEND_HANDLE_EXCEPTION`,根据异常抛出的位置定位到最近的一个try的catch位置,如果这个catch没有匹配则跳到下一个catch块,然后再次执行`ZEND_HANDLE_EXCEPTION`,如果到最后一个catch仍没有匹配则将异常抛出前位置EG(opline_before_exception)更新为最后一个catch的位置,再次执行`ZEND_HANDLE_EXCEPTION`,由于异常抛出的位置已经更新了所以不会再匹配上次检查过的那个catch,这个过程实际就是不断递归执行`ZEND_HANDLE_EXCEPTION`、`ZEND_CATCH`;如果当前zend_op_array都无法捕获则将异常抛向上一个调用栈继续捕获,下面根据一个例子具体说明下: ```php function my_func(){ //... @@ -100,5 +102,79 @@ my_func()中抛出了一个异常,首先在my_func()中抛出一个异常, ![](../img/exception_run_2.png) +上面的过程并没有提到finally的执行时机,首先要明确finally在哪些情况下会执行,命中catch的情况比较简单,即在catch statement执行完以后跳到finally执行,另外一种情况是如果一个异常在try中但没有命中任何catch那么其finally也是会被执行的,这种情况的finally实际是在步骤(3)中执行的,最后一个catch检查完以后会更新异常抛出位置:EG(opline_before_exception),然后会再次执行`ZEND_HANDLE_EXCEPTION`,再次检查时就会发现没有命中任何catch但命中finally了(因为异常位置更新了),这时候就会将异常对象保存在finally块中,然后执行finally,执行完再将异常对象还原继续捕获,下面看下步骤(3)的具体处理过程: + +```c +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_HANDLE_EXCEPTION_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + //op_num为异常抛出的位置,根据异常抛出前最后一条opcode与第一条opcode计算得出 + uint32_t op_num = EG(opline_before_exception) - EX(func)->op_array.opcodes; + + uint32_t catch_op_num = 0, finally_op_num = 0, finally_op_end = 0; + + //查找异常是不是被try了:找最近的一层try + for (i = 0; i < EX(func)->op_array.last_try_catch; i++) { + if (EX(func)->op_array.try_catch_array[i].try_op > op_num) { + //try在抛出之后 + break; + } + in_finally = 0; + //异常抛出位置在try后且比第一个catch位置小,表明这个try有可能捕获异常 + if (op_num < EX(func)->op_array.try_catch_array[i].catch_op) { + //第一个catch的位置 + catch_op_num = EX(func)->op_array.try_catch_array[i].catch_op; + } + //当前try有finally + if (op_num < EX(func)->op_array.try_catch_array[i].finally_op) { + finally_op_num = EX(func)->op_array.try_catch_array[i].finally_op; + finally_op_end = EX(func)->op_array.try_catch_array[i].finally_end; + } + if (op_num >= EX(func)->op_array.try_catch_array[i].finally_op && + op_num < EX(func)->op_array.try_catch_array[i].finally_end) { + finally_op_end = EX(func)->op_array.try_catch_array[i].finally_end; + in_finally = 1; + } + } + + cleanup_unfinished_calls(execute_data, op_num); + + //异常命中了try但没有命中任何catch且那个try定义了finally:需要执行finally + //catch_op_num >= finally_op_num是嵌套try的情况,因为finally是检查完所有catch、更新异常抛出位置之后再执行的 + //所以检查完内层try再检查外层循环时会出现这种情况 + if (finally_op_num && (!catch_op_num || catch_op_num >= finally_op_num)) { + zval *fast_call = EX_VAR(EX(func)->op_array.opcodes[finally_op_end].op1.var); + + cleanup_live_vars(execute_data, op_num, finally_op_num); + if (in_finally && Z_OBJ_P(fast_call)) { + zend_exception_set_previous(EG(exception), Z_OBJ_P(fast_call)); + } + //临时将EG(exception)转移到finally下,执行完finally再抛出 + Z_OBJ_P(fast_call) = EG(exception); + EG(exception) = NULL; + fast_call->u2.lineno = (uint32_t)-1; + ZEND_VM_SET_OPCODE(&EX(func)->op_array.opcodes[finally_op_num]); + ZEND_VM_CONTINUE(); + }else{ + //这个是善后处理,因为异常抛出后后面的opcode将不再执行,但有些情况下还需要把一些资源释放掉 + //比如前面我们介绍goto时提到的foreach中是不能直接跳出的,throw也是类似 + cleanup_live_vars(execute_data, op_num, catch_op_num); + ... + if (catch_op_num) { + //匹配到catch(但不一定命中),跳到catch处执行ZEND_CATCH进行判断 + ZEND_VM_SET_OPCODE(&EX(func)->op_array.opcodes[catch_op_num]); + ZEND_VM_CONTINUE(); + } else if (UNEXPECTED((EX(func)->op_array.fn_flags & ZEND_ACC_GENERATOR) != 0)) { + ... + } else { + //当前zend_op_array下已经没有匹配到的try了,如果异常仍没有被捕获则将在zend_leave_helper_SPEC()将异常抛给prev_execute_data继续捕获 + ZEND_VM_TAIL_CALL(zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); + } + } +} +``` + 具体的实现过程还有很多额外的处理,这里不再展开,感兴趣的可以详细研究下`ZEND_HANDLE_EXCEPTION`、`ZEND_CATCH`两条opcode以及zend_exception.c中具体逻辑。 +### 4.6.3 内核的异常捕获 + + diff --git a/img/throw.png b/img/throw.png new file mode 100644 index 0000000000000000000000000000000000000000..dad445eb08ae7193dcdacad4f9b02796c229a626 GIT binary patch literal 12265 zcmb7qby!y2yXFQIP^6LWmhNsz>2452x}-Y z%^!1}vxHaJ?7jAiC+_=RPne354C+(Drw|08%E?NqK@i*!_<0=}9(-!11muJN5KZM} zB%%9St>nDrPzYFGkegD*`;u9_&=8T(7LtYg#E&E}n<+|a z$#wD)pP3dteLt8p;)Yk3aS)w5o?t_sEcfHu+sB7CK9$qKyyr8g#n8Z()HoM;Fvb`y zb}fP!GR10W5iUh=4VpT$1hN%Lz8?6CfC3DeBF{C&8dE}chi#HFIA+SESPGe=o{570r+?kQyEB}%FU63p3^!4cp@3msNn{Gw*Jb~W0ToTn$j_;g z2gj&(=>3Dy0Hgis3A@LGy20Sd@!vHze(#7h8L4~i`aP8?Qi-r>+vH)RnH4+ z_f^Zf!ljVUbi5L*&wq9@dAqlMLa{KtUux)U z$~`ye%i`#uTKyvm_xh~yH6+Vl-&T3F#dWUxa`%y0w0W37wM-wa#eA;Ejh3@1l_Bz>m4ZGmb^ z$c$LnDLD?I{qCav*B@omTv50H_0(?dOJ-V>^kM$$%ODu&4SIcoWTTH)FDep6Z3^iu zv(ua%ieqi(%y6ctqz>!&9xVRQ9iRAR0*tqy3^6#bhIL?Iu%KZ$ZCQwxM`7I1Nf5UqLY~w8GS~O;>_|>+p8!g1eb>od8 zoRXjA5Hgb#z9Y$DcX`ZM_D031zVj0#*5>holsio!<+DCpztFexYHT#S+w40PcvLP_ z^!@vGA6&>Wi<|X)-s(8%*k_%YGFZiC_f+f`Fzb1XyMVx;E_u3E9uH(jcHkL974g=r z>zhModO|jt$sT!#N{vX*h)?TVqZE=C7`8l2-WS)8dztUF*5D>3DfB`y8L8Ptt#6UD zNkcM*jLPSpfQM(%v3-48*v{v-8jQjxUkuKyXBbwFW)n?4^RheqdNZ$-3~bax+m>rf z!%^r~)@bEK#Axnq7Wiw0Q+Qdlv6$P&k)}Le8@u)CI2~%krjkt8t_Gb(Q1!o&!&b&5 z_z}FgsVOD!<%Ln7;*1TE{vTs;o<-@>3l@VgG67;J$JD)mc-CL&wkKhWbSz9=ul&zW z+qSD9MXH;RO{r60nT6imAzB{s99i4yR{RIU>v-p(bn2a}aw7{96Y(U^1*IOzDlfxB zusYxHj65$BwNoZM$=C6%1nnzLy|k42vTsAQSz6ewU1r0o^VGF>hI=G!%!&^d6h+)V z?a@b!#9eaEpuufvur^kg@T(P_R_D^WVk<^h*=EaFTQfkvW@oEN2Ua) zTU%QnEVh)Dmi~%*y!D=RAthWz`Q+a~Cy*n&cx=T$&@NMVcXXObLZ>fA>6rgZAB2d0seg)A zo2!C1WreAh)rg9WBelN1Zbgl=%4zZ=_+CUarTMgAaf6vGIS6B0RYM-8Q>ohF&~}IJ zPA(ywj>r=3dS%NNjIq4}0_GTsnVH8!e7fJv^0RIcGnc-~tWTMudP{DGq45gla(xd4 zNbmh|nWo4ot)X81gUR7b|BjVF-)IKJRSrp?l|*^Mr7MQE&VlwbWUD7Uxc-uW8tH;gYWmCSk{_T-}m9@HyR=GrAKFzD8eML+x506Z+Oh|?a|SLzkoEt~1@ zge@p0HMW(JC(Sl?ZnzJ)#_qss^v+K0htOtwx`@vuc%98fso3>$($Ax>n|Grbi4{mJ% z^pQ0j{M$jXwum))f!ZFNgVws_$=5eY%Hb7?gSWWd_YF*WnH zCU<=55Th!uO86c7Co(clDtcu{(hMg{(XhYvUwx+U%xs8A<>phYRkf|YzyRTjP<30HvgU?g*z1nMOn(-QB>wW}(9lG9oIyIAU+^IiMb9 zP_Efh^V=7+k55UC&mZa;5>m=vdiPlpQ6Bdf`lRhZVJO>0?QC%Hqe`7;kW+&J6K?;y z6NJxeZy+H7KbM`&0|GzichA$a4v4WjqTjnb{J&7btH z781tmU@p8;y+(Yf{SFg<||t}d7Evjw&fO#XIA3Syz{&tQ&wNukL1Q@BZRkUVel*8eF(jd(w4 zWA#NQf|&c=cEnHNcQ1E?RV$l_iI*rtlv6lR1C-{gPk@2mvZ+cA4BheYaE%PWL$A&4 zhk~u^lP;J`THTXDFpL)?msL=(6>ifmNMtS2Xk_KCZgJOUN^{*9AaKp)R2wf)UVqvZOE^Fee_~?wWTQ~3bG$$6M zf^GwSeZ`$VyV@WOrk(E2R8MhM!og){A~VVge1QD}OkI(h#Yu7#?_>aE1CE{1o*N!> z#l^Oanm;?VLMl;c(a~>O$ax_c7&FT?q7@FCRa!xlxI(JUyL|rSIzg z`ExmI1K}b=QWkqc5e8!A=B5pZm8%;YU2e$8Fa%|3R}^n@%jxpLwv-fnyP%7L6*3hZ zG-$k5yd3pO^x}6n99d(0JKPa$*3`cyf{&PgIH#fgx#UNkigtNs1CwR;I2AnH-7IJs zWCB=s>#@RrF3pwSzY%?xw#{F*fo=0Mi-(u$Jisk6FGYr;9Z zCN}gPz$I%??9wgqy*hm%rK+4I@)+XC4izUvny-}gpD#?ZYh|*B|v$|){D47EVXW5nh!EDy9u=i|BQ{s-+6`YvC4+>}J zA*Za%ymkP(#y_GnwldP8ggPXK$p~m@s`dMBTwj&HdNq#%0e{g`97LQ6h{?#f?ILnm zTU(QqlX)e_p zw~gnELNQJe12`@09OZ}RMk|WO_nHd0`|aDV-`_n6MQpQA*7k4)I1=}O!Ous5mM}}? z_ITh$f3k5eV>1CkH79^`PN>YBRJZ1%+E#Q!pubb&mi>bK{N^8@9indK4Sr;UpMJ-p zDV*U#Ja))F>xr$@&C`3q`W-K!<$|oV{e?27`;Doh`S**1BF_h^TMgw56MYR zha`1!YjM**UyKXtwCqlu;F=se`S#!*%#6#rfBarPC)K%6djfV#)aNh=vBUm5xw;*| zmdEl92Cb%@Pix<+cHSP8?E4#cHt$X^&33twLkUSqX!vYmSuz8UM|K2sEG_9FNhztf z78V70d3gl|(^FF{dNuUi+=<=e;X6ZD&F5S;z(u~^7}&QZQFU$;#bqS!G&h>W*uk{4 zv;ZFBQsm|4o}8FS=X;m)?c4rmht}SqAr>a4iFop`)angkkHeRSh8a%9x0S8?-B$uo zOs^T#zT)@@K2VmLkjpYgj2r{`QE9OC$3?$uI}Uc2KPp8UPa$G7i``$9S8*2J5y0F$ zu43zhUxLko*uHym&0)gAYeaSC4qfI`r^(gJqN9~9E&mWXG{ZrGfq~_%R}50B*t80T zB_%QuveX#J zvK!CCB=ht08>7>+hm{#KK^_YWypbH`va`1*B_Jpg9VEQM3YF$><^BuCRi#g}_FIic z^LsT31Oa>x_r;qzlUfF#>w{H10A&Eb`L?_S@*vx#rmdhqz`>qIrsHiAzZf;^U8G0P}cCe(EXVb>=U&qqY(nfP-5ZZwo z=_^!x+!b44t8`3BNhSEhd3}4n{G@?_A(cP0Yo+$rf@T%XcAnL7QLjy{jVH^2^}BU}D`+@a*2gSfx?M-5r?PMFRF- z3lW&d>DG8!RG;iX3Og0c3ORJs+w8F8j^Jw!To)d)D$%6J!I4T#PL3bY*Pq*0X0dX_ z=eEYl8pcC@oAC&@W#?oO2(eCPWOYodzchKtE{oUkm-98!P zZg5**uI_fSx~5!gBegh-PLZy;Hj1jRXJqhn(K?E-y1KePnO0CUlX*hD!MFH_hV3~s zKd-P|D|&N?Af?(D9b&hzEN0#0=H})jvh@9X_S;cIRYSwF$@$2LFsIBAJni&}iAf0! z#paG&I!H(*ti&p--ukWlq_0A6R#K4FCObrK1;? z8&y7}jzbgQi-nD?sW9SkimCRPha8{5sVu^?NQJ(*q(uJJD+Wf!l7Cv_QscYTu1F%@ z9(gcXwK*D8w7xC*ku4SS(5pW=oDN28T))z zc0)sh>k@}ZmZ;^(7i0h1!~uTy{d5h6w}erG0WwQsD< zB;xl`!Sn|Q2m2geY??~Y#?#Qz?a&(pN05N<_-RV9B@b5Ts?M6NLjQYpRgf7sx;6X9 zYQBE)*V(^qO7Ma0!b&Y<)ypL*DOlyy9Xvehk27$J=NSWm_@-H? zU-Ffnft6L6DjPrR2{!G`-(68!TGmPu*-fyYMMW>-EiQfhWMx0fQd2JM&IO6qkg&0j z?$9OtX3dK-(JymLJ-y?^??E%$kJG8K9F3!q*YG@i@083j@&5B?qB#n3;rDj1Km4C^ z>J98YJUo*3c{_5K;I5`OhVaJZvp)EL@d=_d1(aRZ<21^?^y97dsIw3$D?fk3Sq4gq zd{f!9d_H31`JvBO;RO-h?|RH$Q4Nw)G#;ms&q-(g-qfj@9FJvreb#leVtx<~C%D^g zuiCzS8>1q`sH(1pYhPH%*c0W9QaDsbt6F3GN@jfTZk$X+M5K6rA@9vFQf_`={z~XU z3D&Av)gik5b3-!5*ea5=(Y~RfOi};V<3|#uoGE%`$;s1ub9Hd!0s^y>lddyWZ`alb zQaN*Ta+;f)=|2hhTsW$#s(N{O0W+19d;~?{vr`HSXXI}+HVPDJ=xJ-qBu$IA_w8$I zXY}9PXpOp>4~gBqCg~oryArC^`P|pnXTQ{{IL^iSU5mOV(51*eo|IHK$Q<7emYtnl z=dc7KqrI&ywX^wP+H*X-rC#RP$5g;xeo;ZgE z#`0!LoTuU8;c}?%Ab<_jjn2$?uJ1z!BJYr8pi-nrCfU26~5m=hKv zRi=y`$Pm=tL3rn`(=_V45X%1+E&!WOX>EOdZ?R==cDAvi!twU%3@qzucnPjc9gDGL zTq~@~_3@N7cmHcbj0E03K)vNq3?4e=mEn1?)n3T~k5Vbb4VnI4w)b)(jp^ZsGc z7sJN&E|a4{-gUM!@DS)wy+!OeeWpaaTn#5N_MxqSc5txtwYXB8s(|UqlP6%@64@hD zQ*K}m5C$Qk*Y?DVg*r6XAIq#un4#D`T6wtc&fx# zFfPjmQoofC&j{e5wS=$v`5$gfV{5&I#YvF>qdtN$UQT~oLl7h5bY5{hdM&u}TF`sN z@twuvQx}fZhzNwZm>4#bACIzCQj(I)O-!=24SAY=vRT8xilCyRc1Mv^S5?h6x|W25 zNU5rhdLOjV#mWi^2@MPmTBZ4&FSvsZ?H?OcOUnmNQ0uVdx7;4s8&5aRW#{0a{F{rH z*WJyHw%glL+FrZ%CHlT7ndhJ6EdNGL7sJc3KL8H^+q5?^`94Gt zMtT?As-my2Z(v}cuiw9V#9~l?xLs2IG~|bTGRxWCoOZOD9iICalRQ1hax|8anYm2r z84<7jeEmDB)JzdTQ?|xa>v|fw6j2_%pPx6#=$wD=^n?g&M9cXS-_>TjZ0KJpmorRR)|iD@^IBz%pJirf_}S5HymC;oS zCSDhrXwn7X_uzRjE9q#`mN(r|8G`OSTwDOQ#_|M%92QHH`ULlkof9vTn3<42tvSJ8 z->tmrx6xOF1}}N(pM0Lj)KCoE?+@r?-}cmTZA&zFDRGWjE5m1?Kxn<> z@1Ufhpy26w2_^-StF?_yFZ|OGN>R})A1VHL$I~8gA>bEd4O<9Net*ky%BZ_ zUE{!A6a-)LvINHE58L};; zk+ZO{3=It2T&zal-rVrm{)$OVe2#|WD=RC0etrmpfMCWnv8zkE z!N5pYH#I3~V{eZH+`HcQJkE1`Y;1RLkCTI=XM@G486Ow7*86-P7{}wsk7H?ec6OB0 z`6|H`utZ%ye_mW)mn;^C%NVcfJ!4W<#ff)I4UDw0u^9%IwLj1AF^czgqEMAGwy*`0 zt7qi2x3~B1?ym6?r|@wzQ&$yh+YJ_!ulN}eNN+blIs-YWwYAm6#6%)HMuUw^*lP{E z@6R7uLZjhK;W^XiY8pB^DY>~+>UAJxkE-Ho!&|n~^c-h$5F^>-Pt8ddM^!5&_65Z{5J>twpgyLt)!k))# z6B83i=%mkx`3`4cHel9xtVTDx)x#jnV33lwI&UgzYikn`ea_3H7RmBI`rX-fcUGRq zQ{4RY1p__3(E%@&l(h6W!=@z9t=(N>uv70=r9mzS{PSqF+vY}{YGK)t zPwAhw_SNZxg|nyGiI>BieLY#$0!T}I^ZG~{1V_w#d>41O*WbT?hsbfm5fBi7z|vwn z!=bG`4M45^Ty0r?{zmn%$Xt!pc&qRA2Q(6E2Zx6o+2nq}P%iO_5U8bUYH>PDw3E1^ zqHX1EcUM3kJJ}fYzFbe1yK{AQjr{nL&-<^fme$n8(JDGI9|XM&MWdn7(b18m#zH|s znG~g(@;wc95}n`Pw$9JUZftDqi~}dO#W)`yAlB~goeSz3s{CVS!(-c&&4bcfP2zWsbW9q>ooD z(q;6o-`$)XL?5|0JEJ^%mM-XSU%+Vk{8cqLuOQiX7NREET11#`EG&VkqW<^?!J5~; zgglOx6-lG({BFJS?dslmw2o!kXO+H2f0T54-gZBE5tK2MC3?U7Jtz#D4vo0*%p&ji z=z&;yvWpj^-DjMqz_$N4W^VHj%qeVc7AiwD|3a&fa;Sg8+G6BYRKjTer3}}#IEbWY z9wkrw9%Q|^xHz1romXc&+(vvHOn{Vwh4c|=>-4z^+vUL?7a2Jt`3TdaqK=gX>;~i# ze&-DZJ9P06GRDI&r7DIWz*tKSsikH+RvepKT4t;#I3Nh!_n{U5j$A~EZD_0^kr6~Lq>&W<`qOGYiePB!=kSHiB!p>tbg|51u zMwglsxFJZmxzz%5p~~nn*<*MR ztOM)n+@++2poo`X<`V82m0J^*GfC zu#_CB@J7P~hNf?d#jbzHrrU_z-QCR}4HiB$dXB;UfVIBNC8nQ?Xlq9v4`{ikM^;`w zJo=&Gg-JTJoZ)5-Yahwo9Uq)pjvU}hynG2q&cMI`*eL+d!on@JwQk@YMMXtk9KQoH z{hS-=MMUlZ_4MMt@lGz)sf34mG9s`4?!BQw1Yp3A7_EDHdb*>7ikKy^z1htN`Qo#}GZFy}hD3NMw1Ys6Zdb=(zIZF;)Z&=IZCyszBT1b;h9kwX~FpiRqcqM3>&rCy;5S$HqV^a7Orm ziVC)|_<}vd(BTp(yWdU?6ciMY3V1otD6RsP?OrJG+ z5BA+=G4d}~v-9&p92{8pwA_|}HBes@i}>gO;RljZ#R@Y6%mrA)zj(Q{ynMK?Pp{4I z*7)uiFI7QHMFoR|1Qq(sWA_vlm8Re`h|Xrx+=$TeBjR1Mpt-nCbE8H2 zhKH9bOgfr9Ps})Giqs2a12Hi%vBIdy$(MgszOnmuyw;12CFkP8HRGkDgHO;390U>C z-r4Ehm<^A&WdvA&k}_vcV~+WvK9#gUKG%qjj!rpaeR8phKQ(La*Dp(YmOORCD`v0t zL~ZCbn9AB$aI_&S3k57Rxr=%p2M@RaC|tA+hEi2qOUvwCSy?$aKzr$&kIKAo7Hgo6m!S!rnA{``mu5DNfcI8r1cJ{}J%l`>Tlb0|w~ zwlffUpl~AzGR6)cTzhwS_rk(0Fq9WBUZl+i2Eg?4Xn_+KpT%lsj&Haip?G+C0q+8? z2!Kn7L~L3bprv&_m&dsJ@7&#uD_#dWJ;}rJ0(SiOsYA=F%zfTRQvDm5dd;vi)3kS&r zpmf@CfSqvv;XDA*iPqf%E)15YPwGxF1LdHCC*<6lLt!uQZC|W*^^jI0HpTQ&SUAmo>FX zkXEeHYAY*&el#^TWmeh@pz{pS1uj-+8eMHXJT3s2v9Pn-TU)CE#-5XtvV_}t*a`N(2Ymd^EBh zEklmMrcZIeu^w-P#H9#w_yY|YfG^Xws$}Nq?(7Vi$#E(yTQ#f2$G~X!QHX3ud=wmW zL=ID}&9y|}At#3|kMgQykn$o3R}q#+*8cr%-}tTUYapD1ii``#GOC2^ut^zi(c|dW z%7+xOZG^k?#yqN{1y-O8PH!)4I>U3e+2&hX#xF!Etd3HHkqf;`; z@bu(py`%va!*RD~b z3r?Ep4jDsZt^|}}Kr>&hx_l@cW9RH(+5gC$ap(72+19)9+#r5PotZ$W3Yh#31w}9h zyh;n)_n$x4>Xs@#H*UB#$<){{^G7CC_$$51Lsy*$vDdWG1UQS$de{Xp{+ImOVUdx* z=Pm$}`i1sW_I2?jQ_D9s3g0iAXZF9Z58CdpcFL7A1kN4`GTv;#O$4FGn%5hTt_0#XZ5U1n$X zNTc0XeuQWn`vSq&sL`d!VW|~(zpc!)Vv2R__gwnoFJA%_K)eRoJS8oyiU>;$DY{!; zS($EpKoXpRdt+Kb`FduDaq;n~Rv{Aaj@RT$e-)$8S#zVPGjrJXY3ji<))EF5X;nX4 z{)8k!qVjDFE6=q56&o@P$p+RF00Y14RPJdMBx;pT)^1*|VmHKmrh#af(k;fJTz=8 zpkM$}WEf&9dv(e_zJCI&K)9Q(DSky%Ik0OKnjJ0aCwU5r3n#E$jp(kczoPy4!(UO2 z_x~+IM1K_QMcMpPyc>)?0?so^TU{M{E|7e%q{Oq`4Ve%`Pcv$um`Y^77JS+P4sLi@ zJ`cO$boCAlln!2ky?79YaiqWrvvPX*9eLG*P8LLA6IA0;Vk->9MhPo>Hh zB1TXP347vq3(FZK34iE0MI(HbwXmnF>%$&~z%=kl=+AU{R#_SITxH>7|EZW*d@f52 z$meWQ+ZO4)3K5ta)yl>OB6N9q`F}2aUp>0;@dH`i)s=g$l6(RSY`hRC9fELha4JZU zC73~>WmiXU?-K|Rm3B9BWLR(!E&)1-idbPlv2@=j22Y(Lfw`#aw)qJ|Anoz+@>Y|e zNVI|C%!p57)6F;t=2k2b^Ytdw9{@HTU2;MK6d+5TCg}c6 zl5+HfFy6^aQ>jThB8NUzL0UCIjQkhinwY1BzERSJbPZ1HeIO-mZa*{uz&C;Uqzik4 z45pgF0Yo^kUn=zA!e1b^5D^iDNSFYHS#ca77(Tv~{H=rpoNN`@q-?7zAbC_<4C6ix z0Vnn#334fd+A(hc3j33osW`3DqCS2kH&z4pjz3gH=$A6$Je6DFQjE9a;H06E%82g3 zZ7?7uAyGsdG`_#m=0^Y23IzJ?FwpDyq_#0oC)jS=`G}*$$RQ|JcB0AMVKUsw(NU-3 z_4h{C9k7#z1_pp_dI22}tcv;Dx0hE}v@|q^jV`?)4KFVG-CP`%Xq5?go&Kq{n*$KC zW8JAYZW<6`r}bB6W@dn2IyzQ_hs%S{f`ZLZGCw}MSuO}bw9p3;p(BISLdnxqu{aBH#Wx2+AAmwfF4POy)=MWtfnSWe0Wt}Q&ZE}m^Sb5W8JBxrDb#QbGMrc z;fFWj*_oEx6Gdx{ZsOwK!FeJ$66){omoweA_PV;eK3I3U1j-^1jjsNTQgJxX)!G5- z4m50_bJW(>0>a_cAjHf(2-MrrQA`M^_RCV&P<4_D{d}z*k?t*!2L>8AbwgCOv^I8j zS)FTT<#hw5Q z%9W$WT9-FdSa=1{lPgqV+W84+EeHW2A&;9awI2rn!rs{OTv%8bkHz3uWQr!&+r9+V zTxqLvA5>GN7ZLa%X!><;o`6#x?P;v1Awa7DxZ2~*L(6Sxxdr;oPtzlCUf|>70|cW# z+uN`795x41PdWi9KkCFYt-JuUpq})*-mA-7WJm_U)OZmHk?-HX2WU3_2atJi2nZTH zPt47oO)L3cyy%^oxy-u1p@S|iFJT1Fqq{r42c04PEs>Hn1WFf>m5%=Y1yRBO>eLE& zJ=j3d{SttOGu0LV^rSJV8ymNQEXTX#gAL{6=3bv49Q-41Y3S*_>ce~*0s&WMka$&fQ() z36W-|4>3mnDx9Wzq%pC;rX{@KY;wC$ZT=}u2Wa#EDM$Yw*RTKA2O95@CS0X5L@u%_ RK&3t;C#59$P2% Date: Tue, 9 May 2017 18:21:41 +0800 Subject: [PATCH 229/379] add internal exception --- 4/exception.md | 56 +++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 55 insertions(+), 1 deletion(-) diff --git a/4/exception.md b/4/exception.md index cb0adeb..80ed530 100644 --- a/4/exception.md +++ b/4/exception.md @@ -175,6 +175,60 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_HANDLE_EXCEPTION_SPEC_HANDLER( 具体的实现过程还有很多额外的处理,这里不再展开,感兴趣的可以详细研究下`ZEND_HANDLE_EXCEPTION`、`ZEND_CATCH`两条opcode以及zend_exception.c中具体逻辑。 -### 4.6.3 内核的异常捕获 +### 4.6.3 内核的异常处理 +前面介绍的异常处理是PHP语言层面的实现,在内核中也有一套供内核使用的异常处理模型,也就是C语言异常处理的实现,如: +```c +static int php_start_sapi(void) +{ + ... + + zend_try { + ... + } zend_catch { + ... + } zend_end_try(); + ... +} +``` +C语言并没有在语言层面提供try-catch机制,那么PHP中的是如何实现的呢?这个主要利用sigsetjmp()、siglongjmp()两个函数实现堆栈的保存、还原,在try的位置通过sigsetjmp()将当前位置的堆栈保存在一个变量中,异常抛出通过siglongjmp()跳回原位置,具体看下这几个宏的定义: +```c +#define zend_try \ + { \ + JMP_BUF *__orig_bailout = EG(bailout); \ + JMP_BUF __bailout; \ + \ + EG(bailout) = &__bailout; \ + if (SETJMP(__bailout)==0) { +#define zend_catch \ + } else { \ + EG(bailout) = __orig_bailout; +#define zend_end_try() \ + } \ + EG(bailout) = __orig_bailout; \ + } + +# define JMP_BUF sigjmp_buf +# define SETJMP(a) sigsetjmp(a, 0) +# define LONGJMP(a,b) siglongjmp(a, b) +# define JMP_BUF sigjmp_buf +``` +展开后: +```c +{ + //保存上一个zend_try记录的JMP_BUF,目的是实现多层嵌套try + JMP_BUF *__orig_bailout = EG(bailout); + JMP_BUF __bailout; + + //将当前堆栈保存在__bailout + EG(bailout) = &__bailout; + if (SETJMP(__bailout)==0) { + //try中的代码 + //抛出异常调用:LONGJMP() + }else { //异常抛出后到这个分支 + EG(bailout) = __orig_bailout; + } + EG(bailout) = __orig_bailout; +} +``` From 595c330315b306a404c4afdb36d9b836386ea7ca Mon Sep 17 00:00:00 2001 From: qinpeng Date: Tue, 9 May 2017 18:35:32 +0800 Subject: [PATCH 230/379] update img --- 4/exception.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/4/exception.md b/4/exception.md index 80ed530..5823225 100644 --- a/4/exception.md +++ b/4/exception.md @@ -81,7 +81,7 @@ throw的编译比较简单,最终只编译为一条opcode:`ZEND_THROW`。 * __(3.3)__ 执行`ZEND_CATCH`,检查抛出的异常对象是否与当前catch的类型匹配,检查的过程为判断两个类是否存在父子关系,如果匹配则表示异常被成功捕获,将EG(exception)清空,如果没有则跳到下一个catch的位置重复步骤(3.3),如果到最后一个catch仍然没有命中则在这个catch的位置抛出一个异常(实际还是原来按个异常,只是将抛出的位置转移了当前catch的位置),然后回到步骤(3); * __(4)__ 当前zend_op_array没能成功捕获异常,需要继续往上抛:回到调用位置,将接下来要执行的opcode设置为`ZEND_HANDLE_EXCEPTION`,比如函数中抛出了一个异常没有在函数中捕获,则跳到调用的位置继续捕获,回到步骤(3);如果到最终主脚本也没有被捕获则将结束执行并导致error错误。 -![](../throw.png) +![](../img/throw.png) 这个过程最复杂的地方在于异常匹配、传递的过程,主要为`ZEND_HANDLE_EXCEPTION`、`ZEND_CATCH`两条opcode之间的调用,当抛出一个异常时会终止后面opcode的执行,转向执行`ZEND_HANDLE_EXCEPTION`,根据异常抛出的位置定位到最近的一个try的catch位置,如果这个catch没有匹配则跳到下一个catch块,然后再次执行`ZEND_HANDLE_EXCEPTION`,如果到最后一个catch仍没有匹配则将异常抛出前位置EG(opline_before_exception)更新为最后一个catch的位置,再次执行`ZEND_HANDLE_EXCEPTION`,由于异常抛出的位置已经更新了所以不会再匹配上次检查过的那个catch,这个过程实际就是不断递归执行`ZEND_HANDLE_EXCEPTION`、`ZEND_CATCH`;如果当前zend_op_array都无法捕获则将异常抛向上一个调用栈继续捕获,下面根据一个例子具体说明下: ```php From 4186e4c094f2330504fa9aeb61f9835e3c4742b0 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Tue, 9 May 2017 18:57:52 +0800 Subject: [PATCH 231/379] update --- 6/ts.md | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/6/ts.md b/6/ts.md index e40b51f..ed985a6 100644 --- a/6/ts.md +++ b/6/ts.md @@ -291,9 +291,16 @@ static HashTable *global_class_table = NULL; static HashTable *global_constants_table = NULL; static HashTable *global_auto_globals_table = NULL; static HashTable *global_persistent_list = NULL; -ZEND_TSRMLS_CACHE_DEFINE() //展开后: __thread void *_tsrm_ls_cache = NULL; -//_tsrm_ls_cache就是各线程storage的地址 +ZEND_TSRMLS_CACHE_DEFINE() //=>TSRM_TLS void *TSRMLS_CACHE = NULL; 展开后: __thread void *_tsrm_ls_cache = NULL; _tsrm_ls_cache就是各线程storage的地址 #endif ``` +比如EG: +```c +# define EG(v) ZEND_TSRMG(executor_globals_id, zend_executor_globals *, v) +#define ZEND_TSRMG TSRMG_STATIC +#define TSRMG_STATIC(id, type, element) (TSRMG_BULK_STATIC(id, type)->element) +#define TSRMG_BULK_STATIC(id, type) ((type) (*((void ***) TSRMLS_CACHE))[TSRM_UNSHUFFLE_RSRC_ID(id)]) +``` +EG(xxx)最终展开:((zend_executor_globals *) (*((void ***) _tsrm_ls_cache))[executor_globals_id-1]->xxx)。 From 2ceb1db93f30f5ff1f84d46db37b5f5d527d4d2d Mon Sep 17 00:00:00 2001 From: qinpeng Date: Fri, 12 May 2017 16:04:20 +0800 Subject: [PATCH 232/379] update --- 4/type.md | 28 ++++++++++++++++++++++++++++ README.md | 2 +- 2 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 4/type.md diff --git a/4/type.md b/4/type.md new file mode 100644 index 0000000..578bd23 --- /dev/null +++ b/4/type.md @@ -0,0 +1,28 @@ +## 4.1 类型转换 +PHP是弱类型语言,不需要明确的定义变量的类型,变量的类型根据使用时的上下文所决定,也就是变量会根据具体的使用情况自动切换自己的类型,比如加法操作,PHP会将两个相加的值转为long、double再进行加和,每种类型转为另外一种类型都有固定的规则,当某个操作发现类型不符时就会按照这个规则进行转换,这个规则正是弱类型实现的基础,当然每个类型并不都是可以转为任意类型。 + +除了自动类型转换,PHP还提供了一种强制的转换方式: +* (int)/(integer):转换为整形 integer +* (bool)/(boolean):转换为布尔类型 boolean +* (float)/(double)/(real):转换为浮点型 float +* (string):转换为字符串 string +* (array):转换为数组 array +* (object):转换为对象 object +* (unset):转换为 NULL + +### 4.1.1 转换为NULL + + +### 4.1.2 转换为布尔型 + +### 4.1.3 转换为整型 + +### 4.1.4 转换为浮点型 + +### 4.1.5 转换为字符串 + +### 4.1.6 转换为数组 + +### 4.1.7 转换为对象 + +### 4.1.8 转换为资源 diff --git a/README.md b/README.md index dd108b9..441937f 100644 --- a/README.md +++ b/README.md @@ -37,7 +37,7 @@ * [3.4.7 类的自动加载](3/zend_autoload.md) * [3.5 运行时缓存](3/zend_runtime_cache.md) * 第4章 PHP基础语法实现 - * 4.1 表达式运算 + * 4.1 类型转换 * [4.2 选择结构](4/if.md) * [4.3 循环结构](4/loop.md) * [4.4 中断及跳转](4/break.md) From 223b4e3e470c962e1be5b1473f75695dbb87feaf Mon Sep 17 00:00:00 2001 From: qinpeng Date: Fri, 12 May 2017 18:30:53 +0800 Subject: [PATCH 233/379] update --- 4/type.md | 70 +++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 68 insertions(+), 2 deletions(-) diff --git a/4/type.md b/4/type.md index 578bd23..0a8cd09 100644 --- a/4/type.md +++ b/4/type.md @@ -1,5 +1,5 @@ ## 4.1 类型转换 -PHP是弱类型语言,不需要明确的定义变量的类型,变量的类型根据使用时的上下文所决定,也就是变量会根据具体的使用情况自动切换自己的类型,比如加法操作,PHP会将两个相加的值转为long、double再进行加和,每种类型转为另外一种类型都有固定的规则,当某个操作发现类型不符时就会按照这个规则进行转换,这个规则正是弱类型实现的基础,当然每个类型并不都是可以转为任意类型。 +PHP是弱类型语言,不需要明确的定义变量的类型,变量的类型根据使用时的上下文所决定,也就是变量会根据具体的使用情况自动切换自己的类型,比如加法操作,PHP会将两个相加的值转为long、double再进行加和,每种类型转为另外一种类型都有固定的规则,当某个操作发现类型不符时就会按照这个规则进行转换,这个规则正是弱类型实现的基础。 除了自动类型转换,PHP还提供了一种强制的转换方式: * (int)/(integer):转换为整形 integer @@ -10,10 +10,76 @@ PHP是弱类型语言,不需要明确的定义变量的类型,变量的类 * (object):转换为对象 object * (unset):转换为 NULL -### 4.1.1 转换为NULL +无论是自动类型转换还是强制类型转换,不是每种类型都可以转为任意其他类型,另外,转换时并不是直接在原zval上修改,而是会新分配一个zval,而且很多自动类型转换只是在逻辑处理时按照自己需要的类型去处理,这种连新的zval都不需要。 +### 4.1.1 转换为NULL +这种转换比较简单,任意类型都可以转为NULL,转换时直接将新的zval类型设置为`IS_NULL`即可。 ### 4.1.2 转换为布尔型 +当转换为 boolean 时,根据原值的TRUE、FALSE决定转换后的结果,以下值被认为是 FALSE: +* 布尔值 FALSE 本身 +* 整型值 0 +* 浮点型值 0.0 +* 空字符串,以及字符串 "0" +* 空数组 +* NULL + +所有其它值都被认为是 TRUE,比如资源、对象(这里指默认情况下,因为可以通过扩展改变这个规则)。 + +判断一个值是否为true的操作: +```c +static zend_always_inline int i_zend_is_true(zval *op) +{ + int result = 0; + +again: + switch (Z_TYPE_P(op)) { + case IS_TRUE: + result = 1; + break; + case IS_LONG: + //非0即真 + if (Z_LVAL_P(op)) { + result = 1; + } + break; + case IS_DOUBLE: + if (Z_DVAL_P(op)) { + result = 1; + } + break; + case IS_STRING: + //非空字符串及"0"外都为true + if (Z_STRLEN_P(op) > 1 || (Z_STRLEN_P(op) && Z_STRVAL_P(op)[0] != '0')) { + result = 1; + } + break; + case IS_ARRAY: + //非空数组为true + if (zend_hash_num_elements(Z_ARRVAL_P(op))) { + result = 1; + } + break; + case IS_OBJECT: + //默认情况下始终返回true + result = zend_object_is_true(op); + break; + case IS_RESOURCE: + //合法资源就是true + if (EXPECTED(Z_RES_HANDLE_P(op))) { + result = 1; + } + case IS_REFERENCE: + op = Z_REFVAL_P(op); + goto again; + break; + default: + break; + } + return result; +} +``` +在扩展中可以通过`convert_to_boolean()`这个函数直接将原zval转为bool型,转换时的判断逻辑与`i_zend_is_true()`一致。 ### 4.1.3 转换为整型 From 5ff888047abba0df9940e75388aa6a1f8770567e Mon Sep 17 00:00:00 2001 From: qinpeng Date: Fri, 12 May 2017 20:06:01 +0800 Subject: [PATCH 234/379] add type change --- 4/type.md | 105 ++++++++++++++++++++++++++++++++++++++++++++++++++++-- README.md | 2 +- 2 files changed, 104 insertions(+), 3 deletions(-) diff --git a/4/type.md b/4/type.md index 0a8cd09..edac372 100644 --- a/4/type.md +++ b/4/type.md @@ -1,5 +1,5 @@ ## 4.1 类型转换 -PHP是弱类型语言,不需要明确的定义变量的类型,变量的类型根据使用时的上下文所决定,也就是变量会根据具体的使用情况自动切换自己的类型,比如加法操作,PHP会将两个相加的值转为long、double再进行加和,每种类型转为另外一种类型都有固定的规则,当某个操作发现类型不符时就会按照这个规则进行转换,这个规则正是弱类型实现的基础。 +PHP是弱类型语言,不需要明确的定义变量的类型,变量的类型根据使用时的上下文所决定,也就是变量会根据不同表达式所需要的类型自动转换,比如求和,PHP会将两个相加的值转为long、double再进行加和。每种类型转为另外一种类型都有固定的规则,当某个操作发现类型不符时就会按照这个规则进行转换,这个规则正是弱类型实现的基础。 除了自动类型转换,PHP还提供了一种强制的转换方式: * (int)/(integer):转换为整形 integer @@ -10,7 +10,7 @@ PHP是弱类型语言,不需要明确的定义变量的类型,变量的类 * (object):转换为对象 object * (unset):转换为 NULL -无论是自动类型转换还是强制类型转换,不是每种类型都可以转为任意其他类型,另外,转换时并不是直接在原zval上修改,而是会新分配一个zval,而且很多自动类型转换只是在逻辑处理时按照自己需要的类型去处理,这种连新的zval都不需要。 +无论是自动类型转换还是强制类型转换,不是每种类型都可以转为任意其他类型。 ### 4.1.1 转换为NULL 这种转换比较简单,任意类型都可以转为NULL,转换时直接将新的zval类型设置为`IS_NULL`即可。 @@ -82,10 +82,111 @@ again: 在扩展中可以通过`convert_to_boolean()`这个函数直接将原zval转为bool型,转换时的判断逻辑与`i_zend_is_true()`一致。 ### 4.1.3 转换为整型 +其它类型转为整形的转换规则: +* NULL:转为0 +* 布尔型:false转为0,true转为1 +* 浮点型:向下取整,比如:`(int)2.8 => 2` +* 字符串:就是C语言strtoll()的规则,如果字符串以合法的数值开始,则使用该数值,否则其值为 0(零),合法数值由可选的正负号,后面跟着一个或多个数字(可能有小数点),再跟着可选的指数部分 +* 数组:很多操作不支持将一个数组自动整形处理,比如:`array() + 2`,将报error错误,但可以强制把数组转为整形,非空数组转为1,空数组转为0,没有其他值 +* 对象:与数组类似,很多操作也不支持将对象自动转为整形,但有些操作只会抛一个warning警告,还是会把对象转为1操作的,这个需要看不同操作的处理情况 +* 资源:转为分配给这个资源的唯一编号 +具体处理: + ```c +ZEND_API zend_long ZEND_FASTCALL _zval_get_long_func(zval *op) +{ +try_again: + switch (Z_TYPE_P(op)) { + case IS_NULL: + case IS_FALSE: + return 0; + case IS_TRUE: + return 1; + case IS_RESOURCE: + //资源将转为zend_resource->handler + return Z_RES_HANDLE_P(op); + case IS_LONG: + return Z_LVAL_P(op); + case IS_DOUBLE: + return zend_dval_to_lval(Z_DVAL_P(op)); + case IS_STRING: + //字符串的转换调用C语言的strtoll()处理 + return ZEND_STRTOL(Z_STRVAL_P(op), NULL, 10); + case IS_ARRAY: + //根据数组是否为空转为0,1 + return zend_hash_num_elements(Z_ARRVAL_P(op)) ? 1 : 0; + case IS_OBJECT: + { + zval dst; + convert_object_to_type(op, &dst, IS_LONG, convert_to_long); + if (Z_TYPE(dst) == IS_LONG) { + return Z_LVAL(dst); + } else { + //默认情况就是1 + return 1; + } + } + case IS_REFERENCE: + op = Z_REFVAL_P(op); + goto try_again; + EMPTY_SWITCH_DEFAULT_CASE() + } + return 0; +} +``` ### 4.1.4 转换为浮点型 +除字符串类型外,其它类型转换规则与整形基本一致,就是整形转换结果加了一位小数,字符串转为浮点数由`zend_strtod()`完成,这个函数非常长,定义在`zend_strtod.c`中,这里不作说明。 ### 4.1.5 转换为字符串 +一个值可以通过在其前面加上 (string) 或用 strval() 函数来转变成字符串。在一个需要字符串的表达式中,会自动转换为 string,比如在使用函数 echo 或 print 时,或在一个变量和一个 string 进行比较时,就会发生这种转换。 + +```c +ZEND_API zend_string* ZEND_FASTCALL _zval_get_string_func(zval *op) +{ +try_again: + switch (Z_TYPE_P(op)) { + case IS_UNDEF: + case IS_NULL: + case IS_FALSE: + //转为空字符串"" + return ZSTR_EMPTY_ALLOC(); + case IS_TRUE: + //转为"1" + ... + return zend_string_init("1", 1, 0); + case IS_RESOURCE: { + //转为"Resource id #xxx" + ... + len = snprintf(buf, sizeof(buf), "Resource id #" ZEND_LONG_FMT, (zend_long)Z_RES_HANDLE_P(op)); + return zend_string_init(buf, len, 0); + } + case IS_LONG: { + return zend_long_to_str(Z_LVAL_P(op)); + } + case IS_DOUBLE: { + return zend_strpprintf(0, "%.*G", (int) EG(precision), Z_DVAL_P(op)); + } + case IS_ARRAY: + //转为"Array",但是报Notice + zend_error(E_NOTICE, "Array to string conversion"); + return zend_string_init("Array", sizeof("Array")-1, 0); + case IS_OBJECT: { + //报Error错误 + zval tmp; + ... + zend_error(EG(exception) ? E_ERROR : E_RECOVERABLE_ERROR, "Object of class %s could not be converted to string", ZSTR_VAL(Z_OBJCE_P(op)->name)); + return ZSTR_EMPTY_ALLOC(); + } + case IS_REFERENCE: + op = Z_REFVAL_P(op); + goto try_again; + case IS_STRING: + return zend_string_copy(Z_STR_P(op)); + EMPTY_SWITCH_DEFAULT_CASE() + } + return NULL; +} +``` ### 4.1.6 转换为数组 diff --git a/README.md b/README.md index 441937f..895d938 100644 --- a/README.md +++ b/README.md @@ -37,7 +37,7 @@ * [3.4.7 类的自动加载](3/zend_autoload.md) * [3.5 运行时缓存](3/zend_runtime_cache.md) * 第4章 PHP基础语法实现 - * 4.1 类型转换 + * [4.1 类型转换](4/type.md) * [4.2 选择结构](4/if.md) * [4.3 循环结构](4/loop.md) * [4.4 中断及跳转](4/break.md) From 75f025ef8a4737e52ec9d5487f086e9dca1baa4d Mon Sep 17 00:00:00 2001 From: qinpeng Date: Fri, 12 May 2017 20:06:53 +0800 Subject: [PATCH 235/379] update --- 4/type.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/4/type.md b/4/type.md index edac372..306662b 100644 --- a/4/type.md +++ b/4/type.md @@ -92,7 +92,7 @@ again: * 资源:转为分配给这个资源的唯一编号 具体处理: - ```c +```c ZEND_API zend_long ZEND_FASTCALL _zval_get_long_func(zval *op) { try_again: From 7f58bbd7d32e24f54db7fb83056cb5ecb5d98bb4 Mon Sep 17 00:00:00 2001 From: pangudashu Date: Sat, 13 May 2017 22:01:50 +0800 Subject: [PATCH 236/379] update --- 4/type.md | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) diff --git a/4/type.md b/4/type.md index 306662b..9816670 100644 --- a/4/type.md +++ b/4/type.md @@ -189,6 +189,67 @@ try_again: ``` ### 4.1.6 转换为数组 +如果将一个null、integer、float、string、boolean 和 resource 类型的值转换为数组,将得到一个仅有一个元素的数组,其下标为 0,该元素即为此标量的值。换句话说,(array)$scalarValue 与 array($scalarValue) 完全一样。 + +如果一个 object 类型转换为 array,则结果为一个数组,数组元素为该对象的全部属性,包括public、private、protected,其中private的属性转换后的key加上了类名作为前缀,protected属性的key加上了"*"作为前缀,举例来看: +```c +class test { + private $a = 123; + public $b = "bbb"; + protected $c = "ccc"; +} +$obj = new test; +print_r((array)$obj); +====================== +Array +( + [testa] => 123 + [b] => bbb + [*c] => ccc +) +``` +转换时的处理: +```c +ZEND_API void ZEND_FASTCALL convert_to_array(zval *op) +{ + try_again: + switch (Z_TYPE_P(op)) { + case IS_ARRAY: + break; + case IS_OBJECT: + ... + if (Z_OBJ_HT_P(op)->get_properties) { + //获取所有属性数组 + HashTable *obj_ht = Z_OBJ_HT_P(op)->get_properties(op); + //将数组内容拷贝到新数组 + ... + } + case IS_NULL: + ZVAL_NEW_ARR(op); + //转为空数组 + zend_hash_init(Z_ARRVAL_P(op), 8, NULL, ZVAL_PTR_DTOR, 0); + break; + case IS_REFERENCE: + zend_unwrap_reference(op); + goto try_again; + default: + convert_scalar_to_array(op); + break; + } +} + +//其他标量类型转array +static void convert_scalar_to_array(zval *op) +{ + zval entry; + + ZVAL_COPY_VALUE(&entry, op); + //新分配一个数组,将原值插入数组 + ZVAL_NEW_ARR(op); + zend_hash_init(Z_ARRVAL_P(op), 8, NULL, ZVAL_PTR_DTOR, 0); + zend_hash_index_add_new(Z_ARRVAL_P(op), 0, &entry); +} +``` ### 4.1.7 转换为对象 From ae2753d94cf3eb41cf8287091a4bea737e2fd31d Mon Sep 17 00:00:00 2001 From: pangudashu Date: Sat, 13 May 2017 22:22:41 +0800 Subject: [PATCH 237/379] update --- 3/zend_class.md | 3 ++- 4/type.md | 3 +-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/3/zend_class.md b/3/zend_class.md index cfe81ba..4079dbd 100644 --- a/3/zend_class.md +++ b/3/zend_class.md @@ -193,7 +193,7 @@ typedef struct _zend_property_info { uint32_t offset; //普通成员变量的内存偏移值 //静态成员变量的数组索引 uint32_t flags; //属性掩码,如public、private、protected及是否为静态属性 - zend_string *name; //属性名 + zend_string *name; //属性名:并不是原始属性名 zend_string *doc_comment; zend_class_entry *ce; //所属类 } zend_property_info; @@ -205,6 +205,7 @@ typedef struct _zend_property_info { #define ZEND_ACC_STATIC 0x01 ``` +* __name__:属性名,特别注意的是这里并不全是原始属性名,private会在原始属性名前加上类名,protected则会加上*作为前缀 * __offset__:这个值记录的就是上面说的通过数组保存的属性值的索引,也就是说属性值保存在一个数组中,然后将其在数组中的位置保存在offset中,另外需要说明的一点的是普通属性、静态属性这个值用法是不一样的,静态属性是类的范畴,与对象无关,所以其offset为default_static_members_table数组的下标:0,、1、2......,而普通属性归属于对象,每个对象有其各自的属性,所以这个offset记录的实际是 __各属性在object中偏移值__ (在后面《3.4.2 对象》一节我们再具体说明普通属性的存储方式),其值是:40、56、72......是按照zval的内存大小偏移的 * __flags__:bit位,标识的是属性的信息,如public、private、protected及是否为静态属性 diff --git a/4/type.md b/4/type.md index 9816670..f097351 100644 --- a/4/type.md +++ b/4/type.md @@ -191,7 +191,7 @@ try_again: ### 4.1.6 转换为数组 如果将一个null、integer、float、string、boolean 和 resource 类型的值转换为数组,将得到一个仅有一个元素的数组,其下标为 0,该元素即为此标量的值。换句话说,(array)$scalarValue 与 array($scalarValue) 完全一样。 -如果一个 object 类型转换为 array,则结果为一个数组,数组元素为该对象的全部属性,包括public、private、protected,其中private的属性转换后的key加上了类名作为前缀,protected属性的key加上了"*"作为前缀,举例来看: +如果一个 object 类型转换为 array,则结果为一个数组,数组元素为该对象的全部属性,包括public、private、protected,其中private的属性转换后的key加上了类名作为前缀,protected属性的key加上了"*"作为前缀,但是这个前缀并不是转为数组时单独加上的,而是类编译生成属性zend_property_info时就已经加上了,也就是说这其实是成员属性本身的一个特点,举例来看: ```c class test { private $a = 123; @@ -250,7 +250,6 @@ static void convert_scalar_to_array(zval *op) zend_hash_index_add_new(Z_ARRVAL_P(op), 0, &entry); } ``` - ### 4.1.7 转换为对象 ### 4.1.8 转换为资源 From b99396d1a424da498d6e5136a2f10416d0d018ea Mon Sep 17 00:00:00 2001 From: pangudashu Date: Sat, 13 May 2017 22:35:45 +0800 Subject: [PATCH 238/379] finish type --- 4/type.md | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/4/type.md b/4/type.md index f097351..5f5bb48 100644 --- a/4/type.md +++ b/4/type.md @@ -251,5 +251,39 @@ static void convert_scalar_to_array(zval *op) } ``` ### 4.1.7 转换为对象 +如果其它任何类型的值被转换成对象,将会创建一个内置类 stdClass 的实例:如果该值为 NULL,则新的实例为空;array转换成object将以键名成为属性名并具有相对应的值,数值索引的元素也将转为属性,但是无法通过"->"访问,只能遍历获取;对于其他值,会以scalar作为属性名。 +```c +ZEND_API void ZEND_FASTCALL convert_to_object(zval *op) +{ +try_again: + switch (Z_TYPE_P(op)) { + case IS_ARRAY: + { + HashTable *ht = Z_ARR_P(op); + ... + //以key为属性名,将数组元素拷贝到对象属性 + object_and_properties_init(op, zend_standard_class_def, ht); + break; + } + case IS_OBJECT: + break; + case IS_NULL: + object_init(op); + break; + case IS_REFERENCE: + zend_unwrap_reference(op); + goto try_again; + default: { + zval tmp; + ZVAL_COPY_VALUE(&tmp, op); + object_init(op); + //以scalar作为属性名 + zend_hash_str_add_new(Z_OBJPROP_P(op), "scalar", sizeof("scalar")-1, &tmp); + break; + } + } +} +``` ### 4.1.8 转换为资源 +无法将其他类型转为资源。 From 5d8870f3f322db1be5779549fc098cf5156a94e2 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Sun, 14 May 2017 13:46:10 +0800 Subject: [PATCH 239/379] update --- 3/zend_autoload.md | 2 +- 5/gc.md | 9 ++++----- README.md | 6 ++---- 3 files changed, 7 insertions(+), 10 deletions(-) diff --git a/3/zend_autoload.md b/3/zend_autoload.md index 5bcb266..6666df9 100644 --- a/3/zend_autoload.md +++ b/3/zend_autoload.md @@ -1,4 +1,4 @@ -### 3.4.7 类的自动加载 +### 3.4.6 类的自动加载 在实际使用中,通常会把一个类定义在一个文件中,然后使用时include加载进来,这样就带来一个问题:在每个文件的头部都需要包含一个长长的include列表,而且当文件名称修改时也需要把每个引用的地方都改一遍,另外前面我们也介绍过,原则上父类需要在子类定义之前定义,当存在大量类时很难得到保证,因此PHP提供了一种类的自动加载机制,当使用未被定义的类时自动调用类加载器将类加载进来,方便类的同一管理。 在内核实现上类的自动加载实际就是定义了一个钩子函数,实例化类时如果在EG(class_table)中没有找到对应的类则会调用这个钩子函数,调用完以后再重新查找一次。这个钩子函数保存在EG(autoload_func)中。 diff --git a/5/gc.md b/5/gc.md index b41d153..2d46e11 100644 --- a/5/gc.md +++ b/5/gc.md @@ -1,6 +1,6 @@ -## 5.3 垃圾回收 +## 5.2 垃圾回收 -### 5.3.1 垃圾的产生 +### 5.2.1 垃圾的产生 前面已经介绍过PHP变量的内存管理,即引用计数机制,当变量赋值、传递时并不会直接硬拷贝,而是增加value的引用数,unset、return等释放变量时再减掉引用数,减掉后如果发现refcount变为0则直接释放value,这是变量的基本gc过程,PHP正是通过这个机制实现的自动垃圾回收,但是有一种情况是这个机制无法解决的,从而因变量无法回收导致内存始终得不到释放,这种情况就是循环引用,简单的描述就是变量的内部成员引用了变量自身,比如数组中的某个元素指向了数组,这样数组的引用计数中就有一个来自自身成员,试图释放数组时因为其refcount仍然大于0而得不到释放,而实际上已经没有任何外部引用了,这种变量不可能再被使用,所以PHP引入了另外一个机制用来处理变量循环引用的问题。 下面看一个数组循环引用的例子: @@ -43,7 +43,7 @@ unset($a); |resource | | |reference | | ``` -### 5.3.2 回收过程 +### 5.2.2 回收过程 如果当变量的refcount减少后大于0,PHP并不会立即进行对这个变量进行垃圾鉴定,而是放入一个缓冲buffer中,等这个buffer满了以后(10000个值)再统一进行处理,加入buffer的是变量zend_value的`zend_refcounted_h`: ```c typedef struct _zend_refcounted_h { @@ -58,7 +58,6 @@ typedef struct _zend_refcounted_h { } u; } zend_refcounted_h; ``` - 一个变量只能加入一次buffer,为了防止重复加入,变量加入后会把`zend_refcounted_h.gc_info`置为`GC_PURPLE`,即标为紫色,下次refcount减少时如果发现已经加入过了则不再重复插入。垃圾缓存区是一个双向链表,等到缓存区满了以后则启动垃圾检查过程:遍历缓存区,再对当前变量的所有成员进行遍历,然后把成员的refcount减1(如果成员还包含子成员则也进行递归遍历,其实就是深度优先的遍历),最后再检查当前变量的引用,如果减为了0则为垃圾。这个算法的原理很简单,垃圾是由于成员引用自身导致的,那么就对所有的成员减一遍引用,结果如果发现变量本身refcount变为了0则就表明其引用全部来自自身成员。具体的过程如下: (1) 从buffer链表的roots开始遍历,把当前value标为灰色(zend_refcounted_h.gc_info置为GC_GREY),然后对当前value的成员进行深度优先遍历,把成员value的refcount减1,并且也标为灰色; @@ -68,7 +67,7 @@ typedef struct _zend_refcounted_h { (3) 再次遍历buffer链表,将非GC_WHITE的节点从roots链表中删除,最终roots链表中全部为真正的垃圾,最后将这些垃圾清除。 -### 5.3.3 垃圾收集的内部实现 +### 5.2.3 垃圾收集的内部实现 接下来我们简单看下垃圾回收的内部实现,垃圾收集器的全局数据结构: ```c typedef struct _zend_gc_globals { diff --git a/README.md b/README.md index 895d938..520a6d5 100644 --- a/README.md +++ b/README.md @@ -33,8 +33,7 @@ * [3.4.3 继承](3/zend_extends.md) * [3.4.4 动态属性](3/zend_prop.md) * [3.4.5 魔术方法](3/zend_magic_method.md) - * 3.4.6 抽象类和接口 - * [3.4.7 类的自动加载](3/zend_autoload.md) + * [3.4.6 类的自动加载](3/zend_autoload.md) * [3.5 运行时缓存](3/zend_runtime_cache.md) * 第4章 PHP基础语法实现 * [4.1 类型转换](4/type.md) @@ -45,8 +44,7 @@ * [4.6 异常处理](4/exception.md) * 第5章 内存管理 * [5.1 Zend内存池](5/zend_alloc.md) - * 5.2 引用计数 - * [5.3 垃圾回收](5/gc.md) + * [5.2 垃圾回收](5/gc.md) * 第6章 线程安全 * [6.1 什么是线程安全](6/ts.md) * [6.2 线程安全资源管理器](6/ts.md) From 71eec9c1e7e62f3667f844d212bc0cd31bbbbf8b Mon Sep 17 00:00:00 2001 From: qinpeng Date: Sun, 14 May 2017 15:18:18 +0800 Subject: [PATCH 240/379] add extension --- 7/extension_intro.md | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 7/extension_intro.md diff --git a/7/extension_intro.md b/7/extension_intro.md new file mode 100644 index 0000000..d0f2b25 --- /dev/null +++ b/7/extension_intro.md @@ -0,0 +1,20 @@ +## 7.1 扩展的构成及编译 + +### 7.1.1 扩展能做什么 +扩展是PHP的重要组成部分,它是PHP提供给开发者用于扩展PHP语言功能的主要方式。开发者可以用C/C++定义自己的功能,通过扩展嵌入到PHP中,灵活的扩展能力使得PHP拥有了大量、丰富的第三方组件,这些扩展很好的补充了PHP的功能、特性,大大提高了PHPer的开发效率,使得PHP在web开发中得以大展身手。 + +C语言是PHP之母,笔者认为:C语言是世界上最好的语言!自它诞生至今,C语言孕育了大量优秀、知名的项目:Linux、Nginx、MySQL、PHP、Redis、Memcached等等,感谢里奇带给这个世界如此伟大的一份礼物。C语言的优秀也折射到PHP身上,但是PHP内核提供的功能终究有限,如果你发现PHP在某些方面已经满足不了你的需求了,那么不妨试试扩展,当然扩展也不是万能的。 + +常见的,扩展可以在以下几个方面有所作为: +* 介入PHP的编译、执行阶段:比如opcache,就是重定义了编译函数 +* 提供内部函数 +* 提供内部类 +* 实现RPC客户端 +* 提升执行性能 +* ...... + +### 7.1.2 扩展的组成 + +### 7.1.3 ext_skel工具 + +### 7.1.4 编译及安装 From 9daac334da72a819a421bccbcb88878f5f37d17d Mon Sep 17 00:00:00 2001 From: qinpeng Date: Mon, 15 May 2017 19:16:52 +0800 Subject: [PATCH 241/379] update --- 7/extension_intro.md | 96 ++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 88 insertions(+), 8 deletions(-) diff --git a/7/extension_intro.md b/7/extension_intro.md index d0f2b25..7f49e9a 100644 --- a/7/extension_intro.md +++ b/7/extension_intro.md @@ -6,15 +6,95 @@ C语言是PHP之母,笔者认为:C语言是世界上最好的语言!自它诞生至今,C语言孕育了大量优秀、知名的项目:Linux、Nginx、MySQL、PHP、Redis、Memcached等等,感谢里奇带给这个世界如此伟大的一份礼物。C语言的优秀也折射到PHP身上,但是PHP内核提供的功能终究有限,如果你发现PHP在某些方面已经满足不了你的需求了,那么不妨试试扩展,当然扩展也不是万能的。 常见的,扩展可以在以下几个方面有所作为: -* 介入PHP的编译、执行阶段:比如opcache,就是重定义了编译函数 -* 提供内部函数 -* 提供内部类 -* 实现RPC客户端 -* 提升执行性能 +* __介入PHP的编译、执行阶段:__ 可以介入PHP框架执行的那5个阶段,比如opcache,就是重定义了编译函数 +* __提供内部函数:__ 可以定义内部函数扩充PHP的函数功能,比如array、date等操作 +* __提供内部类__ +* __实现RPC客户端:__ 实现与外部服务的交互,比如redis、mysql等 +* __提升执行性能:__ PHP是解析型语言,在性能方面远不及C语言,可以将耗cpu的操作以C语言代替 * ...... -### 7.1.2 扩展的组成 +PHP中的扩展分为两类:PHP扩展、Zend扩展,对内核而言这两个分别称之为:模块(module)、扩展(extension),本章主要介绍是PHP扩展,也就是模块。 -### 7.1.3 ext_skel工具 +### 7.1.2 脚本工具 +PHP提供了几个脚本工具用于简化扩展的实现:ext_skel、phpize、php-config,后面两个脚本主要配合autoconf、automake生成Makefile。 + +#### 7.1.2.1 ext_skel +这个脚本位于PHP源码ext目录下,它的作用是用来生成扩展的基本骨架,帮助开发者快速生成一个规范的扩展结构,可以通过以下命令生成一个扩展结构: +```shell +./ext_skel --extname=扩展名称 +``` + +### 7.1.2.2 php-config + +#### 7.1.2.3 phpize + +### 7.1.3 编写扩展的基本步骤 +编写一个PHP扩展主要分为以下几步: +* 通过ext目录下ext_skel脚本生成扩展的基本框架:`./ext_skel --extname`,这个脚本生成一个新的扩展目录,并生成了扩展所需的基本文件; +* 修改config.m4配置:这个是autoconf语法的配置文件,可以根据不同的编译环境生成不同的宏定义,以及设置依赖的库; +* 编写扩展要实现的功能:按照PHP扩展的格式以及PHP提供的API编写功能; +* 生成configure:扩展编写完成后执行phpize脚本生成configure及其它配置文件,phpize是一个shell脚本; +* 编译&安装:./configure、make、make install,然后将扩展的.so路径添加到php.ini中。 + +最后就可以在PHP中使用这个扩展了。 + +### 7.1.4 扩展的组成部分 +扩展最核心的部分就是`zend_module_entry`结构,每个扩展拥有这样一个结构,内核通过这个结构得到这个扩展都提供了哪些功能,换句话说,一个扩展可以只包含一个`zend_module_entry`结构,相当于定义了一个什么功能都没有的扩展。 +```c +//zend_modules.h +struct _zend_module_entry { + unsigned short size; //sizeof(zend_module_entry) + unsigned int zend_api; //ZEND_MODULE_API_NO + unsigned char zend_debug; //是否开启debug + unsigned char zts; //是否开启线程安全 + const struct _zend_ini_entry *ini_entry; + const struct _zend_module_dep *deps; + const char *name; //扩展名称,不能重复 + const struct _zend_function_entry *functions; //扩展提供的内部函数列表 + int (*module_startup_func)(INIT_FUNC_ARGS); //扩展初始化回调函数,PHP_MINIT_FUNCTION或ZEND_MINIT_FUNCTION定义的函数 + int (*module_shutdown_func)(SHUTDOWN_FUNC_ARGS); //扩展关闭时回调函数 + int (*request_startup_func)(INIT_FUNC_ARGS); //请求开始前回调函数 + int (*request_shutdown_func)(SHUTDOWN_FUNC_ARGS); //请求结束时回调函数 + void (*info_func)(ZEND_MODULE_INFO_FUNC_ARGS); //php_info展示的扩展信息处理函数 + const char *version; //版本 + size_t globals_size; + void* globals_ptr; + void (*globals_ctor)(void *global); + void (*globals_dtor)(void *global); + int (*post_deactivate_func)(void); + int module_started; + unsigned char type; + void *handle; + int module_number; //扩展的唯一编号 + const char *build_id; +}; +``` +这个结构包含很多成员,但并不是所有的都需要自己定义,经常用到的主要有下面几个: +* __name:__ 扩展名称,不能重复 +* __functions:__ 扩展定义的内部函数entry +* __module_startup_func:__ PHP在模块初始化时回调的hook函数,可以使扩展介入module startup阶段 +* __module_shutdown_func:__ 在模块关闭阶段回调的函数 +* __request_startup_func:__ 在请求初始化阶段回调的函数 +* __request_shutdown_func:__ 在请求结束阶段回调的函数 +* __info_func:__ php_info()函数时调用,用于展示一些配置、运行信息 +* __version:__ 扩展版本 + +除了上面这些需要手动设置的成员,其它部分可以通过`STANDARD_MODULE_HEADER`、`STANDARD_MODULE_PROPERTIES`宏完成标准定义。 + +### 7.1.5 编译配置 +使用C语言编写程序时通常会编写一个Makefile,但是大型项目中Makefile将会非常复杂,而且不同的编译环境下也要对这个文件进行相应的修改,很不方便。很多开源软件编译过程非常简单(三板斧):configure、make、make install,这就是通过自动编译配置实现的,PHP使用的是automake/autoconf等,GNU的Autotool系列工具非常多,初学起来也比较复杂,这里不作过多说明,只简单介绍下与扩展相关的基本用法。 + +一个简单的扩展配置只需要以下内容: +```c +PHP_ARG_WITH(扩展名称, for mytest support, +Make sure that the comment is aligned: +[ --with-扩展名称 Include xxx support]) + +if test "$PHP_扩展名称" != "no"; then + PHP_NEW_EXTENSION(扩展名称, 源码文件列表, $ext_shared,, -DZEND_ENABLE_STATIC_TSRMLS_CACHE=1) +fi +``` +PHP_ARG_WITH()、PHP_NEW_EXTENSION()是PHP自定义的autoconf宏,这些宏封装了autoconf的操作,简化了复杂的配置,它们定义在aclocal.m4、acinclude.m4中,通过AC_DEFUN()定义, + +`PHP_ARG_WITH()`有三个参数,第一个是扩展名称,第二个是运行configure时的展示的信息,第三个是运行`configure --help`时展示的信息。`PHP_NEW_EXTENSION()`这个宏 -### 7.1.4 编译及安装 From 033cd1a933685ef5cffd1e5870dc11a19abad1de Mon Sep 17 00:00:00 2001 From: qinpeng Date: Tue, 16 May 2017 10:03:41 +0800 Subject: [PATCH 242/379] update --- 7/extension_intro.md | 32 +++++++++++++++++++++++++++++--- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/7/extension_intro.md b/7/extension_intro.md index 7f49e9a..71e7786 100644 --- a/7/extension_intro.md +++ b/7/extension_intro.md @@ -19,12 +19,38 @@ PHP中的扩展分为两类:PHP扩展、Zend扩展,对内核而言这两个 PHP提供了几个脚本工具用于简化扩展的实现:ext_skel、phpize、php-config,后面两个脚本主要配合autoconf、automake生成Makefile。 #### 7.1.2.1 ext_skel -这个脚本位于PHP源码ext目录下,它的作用是用来生成扩展的基本骨架,帮助开发者快速生成一个规范的扩展结构,可以通过以下命令生成一个扩展结构: -```shell +这个脚本位于PHP源码/ext目录下,它的作用是用来生成扩展的基本骨架,帮助开发者快速生成一个规范的扩展结构,可以通过以下命令生成一个扩展结构: +```c ./ext_skel --extname=扩展名称 ``` - +执行完以后会在ext目录下新生成一个扩展目录,比如extname是mytest,则将生成以下文件: +```c +|---mytest +| |--- config.m4 //autoconf规则的编译配置文件 +| |--- config.w32 //windows环境的配置 +| |--- CREDITS +| |--- EXPERIMENTAL +| |--- include //依赖库的include头文件,可以不用 +| |--- mytest.c //扩展源码 +| |--- php_mytest.h //头文件 +| |--- mytest.php //用于在PHP中测试扩展是否可用,可以不用 +| |--- tests //测试用例,执行make test时将执行、验证这些用例 +| |--- 001.phpt +``` +这个脚本主要生成了编译需要的配置以及扩展的基本结构,初步生成的这个扩展可以成功的编译、安装、使用,实际开发中我们可以使用这个脚本生成一个基本结构,然后根据具体的需要逐步完善。 ### 7.1.2.2 php-config +这个脚本为PHP源码中的/script/php-config.in,PHP安装后被移到安装路径的/bin目录下,并重命名为php-config,这个脚本主要是获取PHP的安装信息的,主要有: +* __PHP安装路径__ +* __PHP版本__ +* __PHP源码的头文件目录:__ `-Ixx/include/php -Ixx/main -Ixx/TSRM -Ixx/Zend -Ixx/ext -Ixx/ext/date/lib`,编译扩展时需要知道这些include的目录 +* __LDFLAGS:__ 外部库路径,比如:`-L/usr/bib -L/usr/local/lib` +* 依赖的外部库:告诉编译器要链接哪些文件,`-lcrypt -lresolv -lcrypt`等等 +* 扩展存放目录:扩展.so保存位置,安装扩展make install时将安装到此路径下 +* 编译的SAPI:如cli、fpm、cgi等 +* PHP编译参数:执行./configure时带的参数 +* ... + +这个脚本在编译扩展时会用到,执行`./configure --with-php-config=xxx`生成Makefile时作为参数传入即可,它的作用是给configure.in使用生成扩展的编译配置的。 #### 7.1.2.3 phpize From 5d82cce432d4ceff01aa526f7b3f347a32ee3848 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Tue, 16 May 2017 20:40:59 +0800 Subject: [PATCH 243/379] update --- 7/extension_intro.md | 39 +++++++++++++++++++++++++++++++++++---- img/autoconf.png | Bin 0 -> 33404 bytes 2 files changed, 35 insertions(+), 4 deletions(-) create mode 100644 img/autoconf.png diff --git a/7/extension_intro.md b/7/extension_intro.md index 71e7786..87d1848 100644 --- a/7/extension_intro.md +++ b/7/extension_intro.md @@ -44,15 +44,46 @@ PHP提供了几个脚本工具用于简化扩展的实现:ext_skel、phpize、 * __PHP版本__ * __PHP源码的头文件目录:__ `-Ixx/include/php -Ixx/main -Ixx/TSRM -Ixx/Zend -Ixx/ext -Ixx/ext/date/lib`,编译扩展时需要知道这些include的目录 * __LDFLAGS:__ 外部库路径,比如:`-L/usr/bib -L/usr/local/lib` -* 依赖的外部库:告诉编译器要链接哪些文件,`-lcrypt -lresolv -lcrypt`等等 -* 扩展存放目录:扩展.so保存位置,安装扩展make install时将安装到此路径下 -* 编译的SAPI:如cli、fpm、cgi等 -* PHP编译参数:执行./configure时带的参数 +* __依赖的外部库:__ 告诉编译器要链接哪些文件,`-lcrypt -lresolv -lcrypt`等等 +* __扩展存放目录:__ 扩展.so保存位置,安装扩展make install时将安装到此路径下 +* __编译的SAPI:__ 如cli、fpm、cgi等 +* __PHP编译参数:__ 执行./configure时带的参数 * ... 这个脚本在编译扩展时会用到,执行`./configure --with-php-config=xxx`生成Makefile时作为参数传入即可,它的作用是给configure.in使用生成扩展的编译配置的。 #### 7.1.2.3 phpize +这个脚本主要是操作复杂的autoconf/automake/autoheader/autolocal等系列命令,用于生成configure文件,GNU auto系列的工具众多,这里简单介绍下基本的使用: + +(1)autoscan:在源码目录下扫描,生成configure.scan,然后把这个文件重名为为configure.in,可以在这个文件里对依赖的文件、库进行检查以及配置一些编译参数等。 + +(2)aclocal:automake中有很多宏可以在configure.in或其它.m4配置中使用,这些宏必须定义在aclocal.m4中,否则将无法被autoconf识别,aclocal可以根据configure.in自动生成aclocal.m4,另外,autoconf提供的特性不可能满足所有的需求,所以autoconf还支持自定义宏,用户可以在acinclude.m4中定义自己的宏,然后在执行aclocal生成aclocal.m4时也会将acinclude.m4加载进去。 + +(3)autoheader:它可以根据configure.in、aclocal.m4生成一个C语言"define"声明的头文件模板(config.h.in)供configure执行时使用,比如很多程序会通过configure提供一些enable/disable的参数,然后根据不同的参数决定是否开启某些选项,这种就可以根据编译参数的值生成一个define宏,比如:`--enabled-xxx`生成`#define ENABLED_XXX 1`,否则默认生成`#define ENABLED_XXX 0`,代码里直接使用这个宏即可。比如configure.in文件内容如下: +```c +AC_PREREQ([2.63]) +AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS]) + +AC_CONFIG_HEADERS([config.h]) + +AC_ARG_ENABLE(xxx, "--enable-xxx if enable xxx",[ + AC_DEFINE([ENABLED_XXX], [1], [enabled xxx]) +], +[ + AC_DEFINE([ENABLED_XXX], [0], [disabled xxx]) +]) + +AC_OUTPUT +``` +执行autoheader后将生成一个config.h.in的文件,里面包含`#undef ENABLED_XXX`,最终执行`./configure --enable-xxx`后将生成一个config.h文件,包含`#define ENABLED_XXX 1`。 + +(4)autoconf:将configure.in中的宏展开生成configure、config.h,此过程会用到aclocal.m4中定义的宏。 + +(5)automake:将Makefile.am中定义的结构建立Makefile.in,然后configure脚本将生成的Makefile.in文件转换为Makefile。 + +各步骤之间的转化关系如下图: + +![](../img/autoconf.png) ### 7.1.3 编写扩展的基本步骤 编写一个PHP扩展主要分为以下几步: diff --git a/img/autoconf.png b/img/autoconf.png new file mode 100644 index 0000000000000000000000000000000000000000..ebd356a2537232505dacfcadc969bed15640cae7 GIT binary patch literal 33404 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 BQuP1; literal 0 HcmV?d00001 From fac79d41c453b8cad59e7ecd5514ac74e0cef359 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Tue, 16 May 2017 20:58:44 +0800 Subject: [PATCH 244/379] update --- 7/extension_intro.md | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/7/extension_intro.md b/7/extension_intro.md index 87d1848..917175d 100644 --- a/7/extension_intro.md +++ b/7/extension_intro.md @@ -55,11 +55,11 @@ PHP提供了几个脚本工具用于简化扩展的实现:ext_skel、phpize、 #### 7.1.2.3 phpize 这个脚本主要是操作复杂的autoconf/automake/autoheader/autolocal等系列命令,用于生成configure文件,GNU auto系列的工具众多,这里简单介绍下基本的使用: -(1)autoscan:在源码目录下扫描,生成configure.scan,然后把这个文件重名为为configure.in,可以在这个文件里对依赖的文件、库进行检查以及配置一些编译参数等。 +__(1)autoscan:__ 在源码目录下扫描,生成configure.scan,然后把这个文件重名为为configure.in,可以在这个文件里对依赖的文件、库进行检查以及配置一些编译参数等。 -(2)aclocal:automake中有很多宏可以在configure.in或其它.m4配置中使用,这些宏必须定义在aclocal.m4中,否则将无法被autoconf识别,aclocal可以根据configure.in自动生成aclocal.m4,另外,autoconf提供的特性不可能满足所有的需求,所以autoconf还支持自定义宏,用户可以在acinclude.m4中定义自己的宏,然后在执行aclocal生成aclocal.m4时也会将acinclude.m4加载进去。 +__(2)aclocal:__ automake中有很多宏可以在configure.in或其它.m4配置中使用,这些宏必须定义在aclocal.m4中,否则将无法被autoconf识别,aclocal可以根据configure.in自动生成aclocal.m4,另外,autoconf提供的特性不可能满足所有的需求,所以autoconf还支持自定义宏,用户可以在acinclude.m4中定义自己的宏,然后在执行aclocal生成aclocal.m4时也会将acinclude.m4加载进去。 -(3)autoheader:它可以根据configure.in、aclocal.m4生成一个C语言"define"声明的头文件模板(config.h.in)供configure执行时使用,比如很多程序会通过configure提供一些enable/disable的参数,然后根据不同的参数决定是否开启某些选项,这种就可以根据编译参数的值生成一个define宏,比如:`--enabled-xxx`生成`#define ENABLED_XXX 1`,否则默认生成`#define ENABLED_XXX 0`,代码里直接使用这个宏即可。比如configure.in文件内容如下: +__(3)autoheader:__ 它可以根据configure.in、aclocal.m4生成一个C语言"define"声明的头文件模板(config.h.in)供configure执行时使用,比如很多程序会通过configure提供一些enable/disable的参数,然后根据不同的参数决定是否开启某些选项,这种就可以根据编译参数的值生成一个define宏,比如:`--enabled-xxx`生成`#define ENABLED_XXX 1`,否则默认生成`#define ENABLED_XXX 0`,代码里直接使用这个宏即可。比如configure.in文件内容如下: ```c AC_PREREQ([2.63]) AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS]) @@ -77,14 +77,19 @@ AC_OUTPUT ``` 执行autoheader后将生成一个config.h.in的文件,里面包含`#undef ENABLED_XXX`,最终执行`./configure --enable-xxx`后将生成一个config.h文件,包含`#define ENABLED_XXX 1`。 -(4)autoconf:将configure.in中的宏展开生成configure、config.h,此过程会用到aclocal.m4中定义的宏。 +__(4)autoconf:__ 将configure.in中的宏展开生成configure、config.h,此过程会用到aclocal.m4中定义的宏。 -(5)automake:将Makefile.am中定义的结构建立Makefile.in,然后configure脚本将生成的Makefile.in文件转换为Makefile。 +__(5)automake:__ 将Makefile.am中定义的结构建立Makefile.in,然后configure脚本将生成的Makefile.in文件转换为Makefile。 各步骤之间的转化关系如下图: ![](../img/autoconf.png) +编写PHP扩展时并不需要操作上面全部的步骤,PHP提供了两个编辑好的配置:configure.in、acinclude.m4,这两个配置是从PHP安装路径/lib/php/build目录下的phpize.m4、acinclude.m4复制生成的,其中configure.in中定义了一些PHP内核相关的配置检查项,另外这个文件会include每个扩展各自的配置:config.m4,所以编写扩展时我们只需要在config.m4中定义扩展自己的配置就可以了,不需要关心依赖的PHP内核相关的配置,在扩展所在目录下执行phpize就可以生成扩展的configure、config.h文件了,下面看下phpize中的主要操作: + +* (1)phpize_check_configm4: 检查扩展的config.m4是否存在。 +* (2)phpize_check_build_files: + ### 7.1.3 编写扩展的基本步骤 编写一个PHP扩展主要分为以下几步: * 通过ext目录下ext_skel脚本生成扩展的基本框架:`./ext_skel --extname`,这个脚本生成一个新的扩展目录,并生成了扩展所需的基本文件; From 60f789f2761dc2b6a92d99da4cf75456f8ee6e62 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Wed, 17 May 2017 10:10:37 +0800 Subject: [PATCH 245/379] update --- 7/extension_intro.md | 61 ++++++++++++++++++++++++++++++++++---------- 1 file changed, 47 insertions(+), 14 deletions(-) diff --git a/7/extension_intro.md b/7/extension_intro.md index 917175d..66e011f 100644 --- a/7/extension_intro.md +++ b/7/extension_intro.md @@ -16,7 +16,36 @@ C语言是PHP之母,笔者认为:C语言是世界上最好的语言!自它 PHP中的扩展分为两类:PHP扩展、Zend扩展,对内核而言这两个分别称之为:模块(module)、扩展(extension),本章主要介绍是PHP扩展,也就是模块。 ### 7.1.2 脚本工具 -PHP提供了几个脚本工具用于简化扩展的实现:ext_skel、phpize、php-config,后面两个脚本主要配合autoconf、automake生成Makefile。 +PHP提供了几个脚本工具用于简化扩展的实现:ext_skel、phpize、php-config,后面两个脚本主要配合autoconf、automake生成Makefile。在介绍这几个工具之前,我们先看下PHP安装后的目录结构,因为很多脚本、配置都放置在安装后的目录中,比如PHP的安装路径为:/usr/local/php7,则此目录的主要结构: +```c +|---php7 +| |---bin //php编译生成的二进制程序目录 +| |---php //cli模式的php +| |---phpize +| |---php-config +| |---... +| |---etc //一些sapi的配置 +| |---include //php源码的头文件 +| |---php +| |---main //PHP中的头文件 +| |---Zend //Zend头文件 +| |---TSRM //TSRM头文件 +| |---ext //扩展头文件 +| |---sapi //SAPI头文件 +| |---include +| |---lib //依赖的so库 +| |---php +| |---extensions //扩展so保存目录 +| |---build //编译时的工具、m4配置等,编写扩展是会用到 +| |---acinclude.m4 //PHP自定义的autoconf宏 +| |---libtool.m4 //libtool定义的autoconf宏,acinclude.m4、libtool.m4会被合成aclocal.m4 +| |---phpize.m4 //PHP核心configure.in配置 +| |---... +| |---... +| |---php +| |---sbin //SAPI编译生成的二进制程序,php-fpm会放在这 +| |---var //log、run日志 +``` #### 7.1.2.1 ext_skel 这个脚本位于PHP源码/ext目录下,它的作用是用来生成扩展的基本骨架,帮助开发者快速生成一个规范的扩展结构,可以通过以下命令生成一个扩展结构: @@ -26,23 +55,23 @@ PHP提供了几个脚本工具用于简化扩展的实现:ext_skel、phpize、 执行完以后会在ext目录下新生成一个扩展目录,比如extname是mytest,则将生成以下文件: ```c |---mytest -| |--- config.m4 //autoconf规则的编译配置文件 -| |--- config.w32 //windows环境的配置 -| |--- CREDITS -| |--- EXPERIMENTAL -| |--- include //依赖库的include头文件,可以不用 -| |--- mytest.c //扩展源码 -| |--- php_mytest.h //头文件 -| |--- mytest.php //用于在PHP中测试扩展是否可用,可以不用 -| |--- tests //测试用例,执行make test时将执行、验证这些用例 -| |--- 001.phpt +| |---config.m4 //autoconf规则的编译配置文件 +| |---config.w32 //windows环境的配置 +| |---CREDITS +| |---EXPERIMENTAL +| |---include //依赖库的include头文件,可以不用 +| |---mytest.c //扩展源码 +| |---php_mytest.h //头文件 +| |---mytest.php //用于在PHP中测试扩展是否可用,可以不用 +| |---tests //测试用例,执行make test时将执行、验证这些用例 +| |---001.phpt ``` 这个脚本主要生成了编译需要的配置以及扩展的基本结构,初步生成的这个扩展可以成功的编译、安装、使用,实际开发中我们可以使用这个脚本生成一个基本结构,然后根据具体的需要逐步完善。 ### 7.1.2.2 php-config 这个脚本为PHP源码中的/script/php-config.in,PHP安装后被移到安装路径的/bin目录下,并重命名为php-config,这个脚本主要是获取PHP的安装信息的,主要有: * __PHP安装路径__ * __PHP版本__ -* __PHP源码的头文件目录:__ `-Ixx/include/php -Ixx/main -Ixx/TSRM -Ixx/Zend -Ixx/ext -Ixx/ext/date/lib`,编译扩展时需要知道这些include的目录 +* __PHP源码的头文件目录:__ main、Zend、ext、TSRM中的头文件,编写扩展时会用到这些头文件,这些头文件保存在PHP安装位置/include/php目录下 * __LDFLAGS:__ 外部库路径,比如:`-L/usr/bib -L/usr/local/lib` * __依赖的外部库:__ 告诉编译器要链接哪些文件,`-lcrypt -lresolv -lcrypt`等等 * __扩展存放目录:__ 扩展.so保存位置,安装扩展make install时将安装到此路径下 @@ -87,8 +116,12 @@ __(5)automake:__ 将Makefile.am中定义的结构建立Makefile.in,然后con 编写PHP扩展时并不需要操作上面全部的步骤,PHP提供了两个编辑好的配置:configure.in、acinclude.m4,这两个配置是从PHP安装路径/lib/php/build目录下的phpize.m4、acinclude.m4复制生成的,其中configure.in中定义了一些PHP内核相关的配置检查项,另外这个文件会include每个扩展各自的配置:config.m4,所以编写扩展时我们只需要在config.m4中定义扩展自己的配置就可以了,不需要关心依赖的PHP内核相关的配置,在扩展所在目录下执行phpize就可以生成扩展的configure、config.h文件了,下面看下phpize中的主要操作: -* (1)phpize_check_configm4: 检查扩展的config.m4是否存在。 -* (2)phpize_check_build_files: +__(1)phpize_check_configm4:__ 检查扩展的config.m4是否存在。 + +__(2)phpize_check_build_files:__ 检查php安装路径下的lib/php/build/,这个目录下包含PHP自定义的autoconf宏文件acinclude.m4以及libtool;检查扩展所在目录。 + +__(3)phpize_print_api_numbers:__ 输出PHP Api Version、Zend Module Api No、Zend Extension Api No信息,这些信息是从PHP + ### 7.1.3 编写扩展的基本步骤 编写一个PHP扩展主要分为以下几步: From 86e64bb48426d1e9b39df28f07bdfba176f1a7df Mon Sep 17 00:00:00 2001 From: qinpeng Date: Wed, 17 May 2017 20:02:14 +0800 Subject: [PATCH 246/379] update --- 7/extension_intro.md | 42 +++++++++++++++++++++++++++++++++++++++--- 1 file changed, 39 insertions(+), 3 deletions(-) diff --git a/7/extension_intro.md b/7/extension_intro.md index 66e011f..d9d35c3 100644 --- a/7/extension_intro.md +++ b/7/extension_intro.md @@ -89,7 +89,7 @@ __(1)autoscan:__ 在源码目录下扫描,生成configure.scan,然后把 __(2)aclocal:__ automake中有很多宏可以在configure.in或其它.m4配置中使用,这些宏必须定义在aclocal.m4中,否则将无法被autoconf识别,aclocal可以根据configure.in自动生成aclocal.m4,另外,autoconf提供的特性不可能满足所有的需求,所以autoconf还支持自定义宏,用户可以在acinclude.m4中定义自己的宏,然后在执行aclocal生成aclocal.m4时也会将acinclude.m4加载进去。 __(3)autoheader:__ 它可以根据configure.in、aclocal.m4生成一个C语言"define"声明的头文件模板(config.h.in)供configure执行时使用,比如很多程序会通过configure提供一些enable/disable的参数,然后根据不同的参数决定是否开启某些选项,这种就可以根据编译参数的值生成一个define宏,比如:`--enabled-xxx`生成`#define ENABLED_XXX 1`,否则默认生成`#define ENABLED_XXX 0`,代码里直接使用这个宏即可。比如configure.in文件内容如下: -```c +```sh AC_PREREQ([2.63]) AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS]) @@ -114,14 +114,50 @@ __(5)automake:__ 将Makefile.am中定义的结构建立Makefile.in,然后con ![](../img/autoconf.png) -编写PHP扩展时并不需要操作上面全部的步骤,PHP提供了两个编辑好的配置:configure.in、acinclude.m4,这两个配置是从PHP安装路径/lib/php/build目录下的phpize.m4、acinclude.m4复制生成的,其中configure.in中定义了一些PHP内核相关的配置检查项,另外这个文件会include每个扩展各自的配置:config.m4,所以编写扩展时我们只需要在config.m4中定义扩展自己的配置就可以了,不需要关心依赖的PHP内核相关的配置,在扩展所在目录下执行phpize就可以生成扩展的configure、config.h文件了,下面看下phpize中的主要操作: +编写PHP扩展时并不需要操作上面全部的步骤,PHP提供了两个编辑好的配置:configure.in、acinclude.m4,这两个配置是从PHP安装路径/lib/php/build目录下的phpize.m4、acinclude.m4复制生成的,其中configure.in中定义了一些PHP内核相关的配置检查项,另外这个文件会include每个扩展各自的配置:config.m4,所以编写扩展时我们只需要在config.m4中定义扩展自己的配置就可以了,不需要关心依赖的PHP内核相关的配置,在扩展所在目录下执行phpize就可以生成扩展的configure、config.h文件了。 + +phpize中的主要操作: __(1)phpize_check_configm4:__ 检查扩展的config.m4是否存在。 __(2)phpize_check_build_files:__ 检查php安装路径下的lib/php/build/,这个目录下包含PHP自定义的autoconf宏文件acinclude.m4以及libtool;检查扩展所在目录。 -__(3)phpize_print_api_numbers:__ 输出PHP Api Version、Zend Module Api No、Zend Extension Api No信息,这些信息是从PHP +__(3)phpize_print_api_numbers:__ 输出PHP Api Version、Zend Module Api No、Zend Extension Api No信息。 +```sh +phpize_get_api_numbers() +{ + # extracting API NOs: + PHP_API_VERSION=`grep '#define PHP_API_VERSION' $includedir/main/php.h|$SED 's/#define PHP_API_VERSION//'` + ZEND_MODULE_API_NO=`grep '#define ZEND_MODULE_API_NO' $includedir/Zend/zend_modules.h|$SED 's/#define ZEND_MODULE_API_NO//'` + ZEND_EXTENSION_API_NO=`grep '#define ZEND_EXTENSION_API_NO' $includedir/Zend/zend_extensions.h|$SED 's/#define ZEND_EXTENSION_API_NO//'` +} +``` +__(4)phpize_copy_files:__ 将PHP安装位置/lib/php/build目录下的mkdep.awk scan_makefile_in.awk shtool libtool.m4四个文件拷到扩展的build目录下,然后将acinclude.m4 Makefile.global config.sub config.guess ltmain.sh run-tests*.php文件拷到扩展根目录,最后将acinclude.m4、build/libtool.m4合并到扩展目录下的aclocal.m4文件中。 +```sh +phpize_copy_files() +{ + test -d build || mkdir build + + (cd "$phpdir" && cp $FILES_BUILD "$builddir"/build) + (cd "$phpdir" && cp $FILES "$builddir") + #acinclude.m4、libtool.m4合并到aclocal.m4 + (cd "$builddir" && cat acinclude.m4 ./build/libtool.m4 > aclocal.m4) +} +``` +__(5)phpize_replace_prefix:__ 将PHP安装位置/lib/php/build/phpize.m4拷贝到扩展目录下,将文件中的prefix替换为PHP安装路径,然后重命名为configure.in。 +```sh +phpize_replace_prefix() +{ + $SED \ + -e "s#/usr/local/php7#$prefix#" \ + < "$phpdir/phpize.m4" > configure.in +} +``` +__(6)phpize_check_shtool:__ 检查/build/shtool。 + +__(7)phpize_check_autotools:__ 检查autoconf、autoheader。 +__(8)phpize_autotools__ 执行autoconf生成configure,然后再执行autoheader生成config.h。 ### 7.1.3 编写扩展的基本步骤 编写一个PHP扩展主要分为以下几步: From fd8120143d4437423c48d4c0b06292636702dbe9 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Thu, 18 May 2017 17:14:37 +0800 Subject: [PATCH 247/379] update --- 7/extension_intro.md | 76 ++++++++++++++++++++++++++++++++++---------- 1 file changed, 59 insertions(+), 17 deletions(-) diff --git a/7/extension_intro.md b/7/extension_intro.md index d9d35c3..70cd0d2 100644 --- a/7/extension_intro.md +++ b/7/extension_intro.md @@ -79,7 +79,7 @@ PHP提供了几个脚本工具用于简化扩展的实现:ext_skel、phpize、 * __PHP编译参数:__ 执行./configure时带的参数 * ... -这个脚本在编译扩展时会用到,执行`./configure --with-php-config=xxx`生成Makefile时作为参数传入即可,它的作用是给configure.in使用生成扩展的编译配置的。 +这个脚本在编译扩展时会用到,执行`./configure --with-php-config=xxx`生成Makefile时作为参数传入即可,它的作用是提供给configure.in获取上面几个配置,生成Makefile。 #### 7.1.2.3 phpize 这个脚本主要是操作复杂的autoconf/automake/autoheader/autolocal等系列命令,用于生成configure文件,GNU auto系列的工具众多,这里简单介绍下基本的使用: @@ -116,7 +116,25 @@ __(5)automake:__ 将Makefile.am中定义的结构建立Makefile.in,然后con 编写PHP扩展时并不需要操作上面全部的步骤,PHP提供了两个编辑好的配置:configure.in、acinclude.m4,这两个配置是从PHP安装路径/lib/php/build目录下的phpize.m4、acinclude.m4复制生成的,其中configure.in中定义了一些PHP内核相关的配置检查项,另外这个文件会include每个扩展各自的配置:config.m4,所以编写扩展时我们只需要在config.m4中定义扩展自己的配置就可以了,不需要关心依赖的PHP内核相关的配置,在扩展所在目录下执行phpize就可以生成扩展的configure、config.h文件了。 -phpize中的主要操作: +configure.in(phpize.m4): +```sh +AC_PREREQ(2.59) +AC_INIT(config.m4) +... +#--with-php-config参数 +PHP_ARG_WITH(php-config,, +[ --with-php-config=PATH Path to php-config [php-config]], php-config, no) + +PHP_CONFIG=$PHP_PHP_CONFIG +... +#加载扩展配置 +sinclude(config.m4) +... +AC_CONFIG_HEADER(config.h) + +AC_OUTPUT() +``` +__phpize中的主要操作:__ __(1)phpize_check_configm4:__ 检查扩展的config.m4是否存在。 @@ -161,16 +179,16 @@ __(8)phpize_autotools__ 执行autoconf生成configure,然后再执行autoheade ### 7.1.3 编写扩展的基本步骤 编写一个PHP扩展主要分为以下几步: -* 通过ext目录下ext_skel脚本生成扩展的基本框架:`./ext_skel --extname`,这个脚本生成一个新的扩展目录,并生成了扩展所需的基本文件; -* 修改config.m4配置:这个是autoconf语法的配置文件,可以根据不同的编译环境生成不同的宏定义,以及设置依赖的库; +* 通过ext目录下ext_skel脚本生成扩展的基本框架:`./ext_skel --extname`; +* 修改config.m4配置:设置编译配置参数、设置扩展的源文件、依赖库/函数检查等等; * 编写扩展要实现的功能:按照PHP扩展的格式以及PHP提供的API编写功能; -* 生成configure:扩展编写完成后执行phpize脚本生成configure及其它配置文件,phpize是一个shell脚本; +* 生成configure:扩展编写完成后执行phpize脚本生成configure及其它配置文件; * 编译&安装:./configure、make、make install,然后将扩展的.so路径添加到php.ini中。 最后就可以在PHP中使用这个扩展了。 ### 7.1.4 扩展的组成部分 -扩展最核心的部分就是`zend_module_entry`结构,每个扩展拥有这样一个结构,内核通过这个结构得到这个扩展都提供了哪些功能,换句话说,一个扩展可以只包含一个`zend_module_entry`结构,相当于定义了一个什么功能都没有的扩展。 +扩展首先需要创建一个`zend_module_entry`结构,这个变量必须是全局变量,且变量名必须是:`扩展名称_module_entry`,内核通过这个结构得到这个扩展都提供了哪些功能,换句话说,一个扩展可以只包含一个`zend_module_entry`结构,相当于定义了一个什么功能都没有的扩展。 ```c //zend_modules.h struct _zend_module_entry { @@ -188,12 +206,7 @@ struct _zend_module_entry { int (*request_shutdown_func)(SHUTDOWN_FUNC_ARGS); //请求结束时回调函数 void (*info_func)(ZEND_MODULE_INFO_FUNC_ARGS); //php_info展示的扩展信息处理函数 const char *version; //版本 - size_t globals_size; - void* globals_ptr; - void (*globals_ctor)(void *global); - void (*globals_dtor)(void *global); - int (*post_deactivate_func)(void); - int module_started; + ... unsigned char type; void *handle; int module_number; //扩展的唯一编号 @@ -210,12 +223,41 @@ struct _zend_module_entry { * __info_func:__ php_info()函数时调用,用于展示一些配置、运行信息 * __version:__ 扩展版本 -除了上面这些需要手动设置的成员,其它部分可以通过`STANDARD_MODULE_HEADER`、`STANDARD_MODULE_PROPERTIES`宏完成标准定义。 +除了上面这些需要手动设置的成员,其它部分可以通过`STANDARD_MODULE_HEADER`、`STANDARD_MODULE_PROPERTIES`宏统一设置。有了这个结构还需要提供一个接口来获取这个结构变量,这个接口是统一的,扩展中通过`ZEND_GET_MODULE(extension_name)`完成这个接口的定义: +``` +//zend_API.h +#define ZEND_GET_MODULE(name) \ + BEGIN_EXTERN_C()\ + ZEND_DLEXPORT zend_module_entry *get_module(void) { return &name##_module_entry; }\ + END_EXTERN_C() +``` +展开后可以看到,实际就是定义了一个get_module()函数,返回扩展zend_module_entry结构的地址,这就是为什么这个结构的变量名必须是`扩展名称_module_entry`这种格式的原因。 + +有了扩展的zend_module_entry结构以及获取这个结构的接口一个合格的扩展就编写完成了,只是这个扩展目前还什么都干不了: +```c +#include "php.h" +#include "php_ini.h" +#include "ext/standard/info.h" + +zend_module_entry mytest_module_entry = { + STANDARD_MODULE_HEADER, + "mytest", + NULL, //mytest_functions, + NULL, //PHP_MINIT(mytest), + NULL, //PHP_MSHUTDOWN(mytest), + NULL, //PHP_RINIT(mytest), + NULL, //PHP_RSHUTDOWN(mytest), + NULL, //PHP_MINFO(mytest), + "1.0.0", + STANDARD_MODULE_PROPERTIES +}; -### 7.1.5 编译配置 -使用C语言编写程序时通常会编写一个Makefile,但是大型项目中Makefile将会非常复杂,而且不同的编译环境下也要对这个文件进行相应的修改,很不方便。很多开源软件编译过程非常简单(三板斧):configure、make、make install,这就是通过自动编译配置实现的,PHP使用的是automake/autoconf等,GNU的Autotool系列工具非常多,初学起来也比较复杂,这里不作过多说明,只简单介绍下与扩展相关的基本用法。 +ZEND_GET_MODULE(mytest) +``` +编译、安装后执行`php -m`就可以看到my_test这个扩展了。 -一个简单的扩展配置只需要以下内容: +### 7.1.5 config.m4 +config.m4是扩展的编译配置文件,它被include到configure.in文件中,最终被autoconf编译为configure,一个简单的扩展配置只需要以下内容: ```c PHP_ARG_WITH(扩展名称, for mytest support, Make sure that the comment is aligned: @@ -225,7 +267,7 @@ if test "$PHP_扩展名称" != "no"; then PHP_NEW_EXTENSION(扩展名称, 源码文件列表, $ext_shared,, -DZEND_ENABLE_STATIC_TSRMLS_CACHE=1) fi ``` -PHP_ARG_WITH()、PHP_NEW_EXTENSION()是PHP自定义的autoconf宏,这些宏封装了autoconf的操作,简化了复杂的配置,它们定义在aclocal.m4、acinclude.m4中,通过AC_DEFUN()定义, +PHP_ARG_WITH()、PHP_NEW_EXTENSION()是PHP自定义的autoconf宏,这些宏封装了autoconf/automake的操作,简化了复杂的配置,它们定义在acinclude.m4中,通过AC_DEFUN()定义, `PHP_ARG_WITH()`有三个参数,第一个是扩展名称,第二个是运行configure时的展示的信息,第三个是运行`configure --help`时展示的信息。`PHP_NEW_EXTENSION()`这个宏 From 13d2d00cbfe4c5c277619b6d22d73346297b6b14 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Fri, 19 May 2017 09:33:07 +0800 Subject: [PATCH 248/379] update --- 7/extension_intro.md | 19 ++++++++++++++++--- README.md | 11 ++++++----- 2 files changed, 22 insertions(+), 8 deletions(-) diff --git a/7/extension_intro.md b/7/extension_intro.md index 70cd0d2..99f2361 100644 --- a/7/extension_intro.md +++ b/7/extension_intro.md @@ -257,7 +257,7 @@ ZEND_GET_MODULE(mytest) 编译、安装后执行`php -m`就可以看到my_test这个扩展了。 ### 7.1.5 config.m4 -config.m4是扩展的编译配置文件,它被include到configure.in文件中,最终被autoconf编译为configure,一个简单的扩展配置只需要以下内容: +config.m4是扩展的编译配置文件,它被include到configure.in文件中,最终被autoconf编译为configure,编写扩展时我们只需要在config.m4中修改配置即可,一个简单的扩展配置只需要包含以下内容: ```c PHP_ARG_WITH(扩展名称, for mytest support, Make sure that the comment is aligned: @@ -267,7 +267,20 @@ if test "$PHP_扩展名称" != "no"; then PHP_NEW_EXTENSION(扩展名称, 源码文件列表, $ext_shared,, -DZEND_ENABLE_STATIC_TSRMLS_CACHE=1) fi ``` -PHP_ARG_WITH()、PHP_NEW_EXTENSION()是PHP自定义的autoconf宏,这些宏封装了autoconf/automake的操作,简化了复杂的配置,它们定义在acinclude.m4中,通过AC_DEFUN()定义, +PHP在acinclude.m4中定义了很多可以直接使用的宏,下面介绍几个常用的宏: -`PHP_ARG_WITH()`有三个参数,第一个是扩展名称,第二个是运行configure时的展示的信息,第三个是运行`configure --help`时展示的信息。`PHP_NEW_EXTENSION()`这个宏 +__(1)PHP_ARG_WITH(arg_name,check message,help info):__ 定义一个`--with-feature[=arg]`这样的编译参数,调用的是autoconf的AC_ARG_WITH,这个宏有5个参数,常用的是前三个,分别表示:参数名、执行./configure是展示信息、执行--help时展示信息,第4个参数为默认值,如果不定义默认为"no",通过这个宏定义的参数可以在config.m4中通过`$PHP_参数名(大写)`访问,比如: +```sh +PHP_ARG_WITH(aaa, aaa-configure, help aa) + +#后面通过$PHP_AAA就可以读取到--with-aaa=xxx设置的值了 +``` +__(2)PHP_ARG_ENABLE(arg_name,check message,help info):__ 定义一个`--enable-feature[=arg]`或`--disable-feature`参数,`--disable-feature`等价于`--enable-feature=no`,这个宏与PHP_ARG_WITH类似,通常情况下如果配置的参数需要额外的arg值会使用PHP_ARG_WITH,而如果不需要arg值,只用于开关配置则会使用PHP_ARG_ENABLE。 + +__(3)AC_MSG_CHECKING()/AC_MSG_RESULT()/AC_MSG_ERROR():__ ./configure时输出结果,其中error将会中断configure执行。 + +__(4)AC_DEFINE(variable, value, [description]):__ 定义一个宏,比如:`AC_DEFINE(IS_DEBUG, 1, [])`,执行autoheader时将在头文件中生成:`#define IS_DEBUG 1`。 + +__(5)PHP_ADD_INCLUDE(path):__ 添加include路径,即:`gcc -Iinclude_dir`,`#include "file";`将先在通过-I指定的目录下查找,扩展引用了外部库或者扩展下分了多个目录的情况下会用到这个宏。 +__(6)__ diff --git a/README.md b/README.md index 520a6d5..e4c30b4 100644 --- a/README.md +++ b/README.md @@ -49,11 +49,12 @@ * [6.1 什么是线程安全](6/ts.md) * [6.2 线程安全资源管理器](6/ts.md) * 第7章 扩展开发 - * 7.1 扩展的构成及编译 - * 7.1.1 扩展能做什么 - * 7.1.2 扩展的组成结构 - * 7.1.3 ext_skel工具 - * 7.1.4 编译及安装 + * [7.1 扩展的构成及编译](7/extension_intro.md) + * 7.1.1 扩展能做什么 + * 7.1.2 脚本工具 + * 7.1.3 编写扩展的基本步骤 + * 7.1.4 扩展的组成部分 + * 7.1.5 config.m4 * [7.2 扩展加载过程](7/extension_start.md) * 7.3 ini配置 * 7.4 变量的操作 From 83c90f3ee84338ea17dad15624b4450a252fca3e Mon Sep 17 00:00:00 2001 From: qinpeng Date: Fri, 19 May 2017 19:24:00 +0800 Subject: [PATCH 249/379] update --- 7/extension_intro.md | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/7/extension_intro.md b/7/extension_intro.md index 99f2361..d42ad62 100644 --- a/7/extension_intro.md +++ b/7/extension_intro.md @@ -267,7 +267,7 @@ if test "$PHP_扩展名称" != "no"; then PHP_NEW_EXTENSION(扩展名称, 源码文件列表, $ext_shared,, -DZEND_ENABLE_STATIC_TSRMLS_CACHE=1) fi ``` -PHP在acinclude.m4中定义了很多可以直接使用的宏,下面介绍几个常用的宏: +PHP在acinclude.m4中基于autoconf/automake的宏封装了很多可以直接使用的宏,下面介绍几个比较常用的宏: __(1)PHP_ARG_WITH(arg_name,check message,help info):__ 定义一个`--with-feature[=arg]`这样的编译参数,调用的是autoconf的AC_ARG_WITH,这个宏有5个参数,常用的是前三个,分别表示:参数名、执行./configure是展示信息、执行--help时展示信息,第4个参数为默认值,如果不定义默认为"no",通过这个宏定义的参数可以在config.m4中通过`$PHP_参数名(大写)`访问,比如: ```sh @@ -283,4 +283,14 @@ __(4)AC_DEFINE(variable, value, [description]):__ 定义一个宏,比如:`AC __(5)PHP_ADD_INCLUDE(path):__ 添加include路径,即:`gcc -Iinclude_dir`,`#include "file";`将先在通过-I指定的目录下查找,扩展引用了外部库或者扩展下分了多个目录的情况下会用到这个宏。 -__(6)__ +__(6)PHP_CHECK_LIBRARY(library, function [, action-found [, action-not-found [, extra-libs]]]):__ 检查依赖的库中是否存在需要的function,action-found为存在时执行的动作,action-not-found为不存在时执行的动作,比如扩展里使用到线程pthread,检查pthread_create(),如果没找到则终止./configure执行: +```sh +PHP_ADD_INCLUDE(pthread, pthread_create, [], [ + AC_MSG_ERROR([not find pthread_create() in lib pthread]) +]) +``` +__(7)PHP_ADD_LIBRARY_WITH_PATH($LIBNAME, $XXX_DIR/$PHP_LIBDIR, XXX_SHARED_LIBADD):__ 添加链接库。 + +__(8)PHP_NEW_EXTENSION(extname, sources [, shared [, sapi_class [, extra-cflags [, cxx [, zend_ext]]]]]):__ 注册一个扩展,添加扩展源文件,确定此扩展是动态库还是静态库,每个扩展的config.m4中都需要通过这个宏完成扩展的编译配置。 + + From 964f5f3647b899a60a4eed93ff06f5bdb894f32b Mon Sep 17 00:00:00 2001 From: qinpeng Date: Sat, 20 May 2017 17:12:09 +0800 Subject: [PATCH 250/379] update --- 7/extension_intro.md | 6 +++--- 7/intro.md | 17 +++++++++++++++++ README.md | 5 +++-- 3 files changed, 23 insertions(+), 5 deletions(-) create mode 100644 7/intro.md diff --git a/7/extension_intro.md b/7/extension_intro.md index d42ad62..ba1f5c5 100644 --- a/7/extension_intro.md +++ b/7/extension_intro.md @@ -187,7 +187,7 @@ __(8)phpize_autotools__ 执行autoconf生成configure,然后再执行autoheade 最后就可以在PHP中使用这个扩展了。 -### 7.1.4 扩展的组成部分 +### 7.1.4 扩展的构成 扩展首先需要创建一个`zend_module_entry`结构,这个变量必须是全局变量,且变量名必须是:`扩展名称_module_entry`,内核通过这个结构得到这个扩展都提供了哪些功能,换句话说,一个扩展可以只包含一个`zend_module_entry`结构,相当于定义了一个什么功能都没有的扩展。 ```c //zend_modules.h @@ -223,7 +223,7 @@ struct _zend_module_entry { * __info_func:__ php_info()函数时调用,用于展示一些配置、运行信息 * __version:__ 扩展版本 -除了上面这些需要手动设置的成员,其它部分可以通过`STANDARD_MODULE_HEADER`、`STANDARD_MODULE_PROPERTIES`宏统一设置。有了这个结构还需要提供一个接口来获取这个结构变量,这个接口是统一的,扩展中通过`ZEND_GET_MODULE(extension_name)`完成这个接口的定义: +除了上面这些需要手动设置的成员,其它部分可以通过`STANDARD_MODULE_HEADER`、`STANDARD_MODULE_PROPERTIES`宏统一设置,扩展提供的内部函数及四个执行阶段的钩子函数是扩展最常用到的部分,几乎所有的扩展都是基于这两部分实现的。有了这个结构还需要提供一个接口来获取这个结构变量,这个接口是统一的,扩展中通过`ZEND_GET_MODULE(extension_name)`完成这个接口的定义: ``` //zend_API.h #define ZEND_GET_MODULE(name) \ @@ -293,4 +293,4 @@ __(7)PHP_ADD_LIBRARY_WITH_PATH($LIBNAME, $XXX_DIR/$PHP_LIBDIR, XXX_SHARED_LIBADD __(8)PHP_NEW_EXTENSION(extname, sources [, shared [, sapi_class [, extra-cflags [, cxx [, zend_ext]]]]]):__ 注册一个扩展,添加扩展源文件,确定此扩展是动态库还是静态库,每个扩展的config.m4中都需要通过这个宏完成扩展的编译配置。 - +更多autoconf及PHP封装的宏大家可以在用到的时候再自行检索,同时ext目录下有大量的示例可供参考。 diff --git a/7/intro.md b/7/intro.md new file mode 100644 index 0000000..2bda8cb --- /dev/null +++ b/7/intro.md @@ -0,0 +1,17 @@ +## 7.1 概述 + +扩展是PHP的重要组成部分,它是PHP提供给开发者用于扩展PHP语言功能的主要方式。开发者可以用C/C++定义自己的功能,通过扩展嵌入到PHP中,灵活的扩展能力使得PHP拥有了大量、丰富的第三方组件,这些扩展很好的补充了PHP的功能、特性,使得PHP在web开发中得以大展身手。ext目录下有一个standard扩展,这个扩展提供了大量被大家所熟知的PHP函数:sleep()、usleep()、htmlspecialchars()、md5()、strtoupper()、substr()、array_merge()等等。 + +C语言是PHP之母,作为世界上非常优秀的一门语言,自它诞生至今,C语言早就了大量优秀、知名的项目:Linux、Nginx、MySQL、PHP、Redis、Memcached等等,感谢里奇带给这个世界如此伟大的一份礼物。C语言的优秀也折射到PHP身上,但是PHP内核提供的功能终究有限,如果你发现PHP在某些方面已经满足不了你的需求了,那么不妨试试扩展。 + +常见的,扩展可以在以下几个方面有所作为: +* __介入PHP的编译、执行阶段:__ 可以介入PHP框架执行的那5个阶段,比如opcache,就是重定义了编译函数 +* __提供内部函数:__ 可以定义内部函数扩充PHP的函数功能,比如array、date等操作 +* __提供内部类__ +* __实现RPC客户端:__ 实现与外部服务的交互,比如redis、mysql等 +* __提升执行性能:__ PHP是解析型语言,在性能方面远不及C语言,可以将耗cpu的操作以C语言代替 +* ...... + +当然扩展也不是万能,它只允许我们在PHP提供的框架之上进行一些特定的处理,同时限于不同SAPI的实现差异,扩展的很多实现也必须与其一致、满足SAPI的要求。 + +PHP中的扩展分为两类:PHP扩展、Zend扩展,对内核而言这两个分别称之为:模块(module)、扩展(extension),本章主要介绍是PHP扩展,也就是模块。 diff --git a/README.md b/README.md index e4c30b4..efb7681 100644 --- a/README.md +++ b/README.md @@ -49,13 +49,14 @@ * [6.1 什么是线程安全](6/ts.md) * [6.2 线程安全资源管理器](6/ts.md) * 第7章 扩展开发 - * [7.1 扩展的构成及编译](7/extension_intro.md) + * 7.1 概述 + * 7.2 扩展的实现原理 + * [7.3 扩展的构成及编译](7/extension_intro.md) * 7.1.1 扩展能做什么 * 7.1.2 脚本工具 * 7.1.3 编写扩展的基本步骤 * 7.1.4 扩展的组成部分 * 7.1.5 config.m4 - * [7.2 扩展加载过程](7/extension_start.md) * 7.3 ini配置 * 7.4 变量的操作 * 7.5 函数的操作 From 7237ca921c21c3d08d1788f3361a518b3708847e Mon Sep 17 00:00:00 2001 From: pangudashu Date: Sat, 20 May 2017 18:38:00 +0800 Subject: [PATCH 251/379] update --- 7/extension_intro.md | 37 ++++++----------- 7/implement.md | 94 ++++++++++++++++++++++++++++++++++++++++++++ 7/intro.md | 3 +- 3 files changed, 107 insertions(+), 27 deletions(-) create mode 100644 7/implement.md diff --git a/7/extension_intro.md b/7/extension_intro.md index ba1f5c5..c980928 100644 --- a/7/extension_intro.md +++ b/7/extension_intro.md @@ -1,21 +1,5 @@ -## 7.1 扩展的构成及编译 - -### 7.1.1 扩展能做什么 -扩展是PHP的重要组成部分,它是PHP提供给开发者用于扩展PHP语言功能的主要方式。开发者可以用C/C++定义自己的功能,通过扩展嵌入到PHP中,灵活的扩展能力使得PHP拥有了大量、丰富的第三方组件,这些扩展很好的补充了PHP的功能、特性,大大提高了PHPer的开发效率,使得PHP在web开发中得以大展身手。 - -C语言是PHP之母,笔者认为:C语言是世界上最好的语言!自它诞生至今,C语言孕育了大量优秀、知名的项目:Linux、Nginx、MySQL、PHP、Redis、Memcached等等,感谢里奇带给这个世界如此伟大的一份礼物。C语言的优秀也折射到PHP身上,但是PHP内核提供的功能终究有限,如果你发现PHP在某些方面已经满足不了你的需求了,那么不妨试试扩展,当然扩展也不是万能的。 - -常见的,扩展可以在以下几个方面有所作为: -* __介入PHP的编译、执行阶段:__ 可以介入PHP框架执行的那5个阶段,比如opcache,就是重定义了编译函数 -* __提供内部函数:__ 可以定义内部函数扩充PHP的函数功能,比如array、date等操作 -* __提供内部类__ -* __实现RPC客户端:__ 实现与外部服务的交互,比如redis、mysql等 -* __提升执行性能:__ PHP是解析型语言,在性能方面远不及C语言,可以将耗cpu的操作以C语言代替 -* ...... - -PHP中的扩展分为两类:PHP扩展、Zend扩展,对内核而言这两个分别称之为:模块(module)、扩展(extension),本章主要介绍是PHP扩展,也就是模块。 - -### 7.1.2 脚本工具 +## 7.3 扩展的构成及编译 +### 7.3.1 脚本工具 PHP提供了几个脚本工具用于简化扩展的实现:ext_skel、phpize、php-config,后面两个脚本主要配合autoconf、automake生成Makefile。在介绍这几个工具之前,我们先看下PHP安装后的目录结构,因为很多脚本、配置都放置在安装后的目录中,比如PHP的安装路径为:/usr/local/php7,则此目录的主要结构: ```c |---php7 @@ -47,7 +31,7 @@ PHP提供了几个脚本工具用于简化扩展的实现:ext_skel、phpize、 | |---var //log、run日志 ``` -#### 7.1.2.1 ext_skel +#### 7.3.1.1 ext_skel 这个脚本位于PHP源码/ext目录下,它的作用是用来生成扩展的基本骨架,帮助开发者快速生成一个规范的扩展结构,可以通过以下命令生成一个扩展结构: ```c ./ext_skel --extname=扩展名称 @@ -67,7 +51,7 @@ PHP提供了几个脚本工具用于简化扩展的实现:ext_skel、phpize、 | |---001.phpt ``` 这个脚本主要生成了编译需要的配置以及扩展的基本结构,初步生成的这个扩展可以成功的编译、安装、使用,实际开发中我们可以使用这个脚本生成一个基本结构,然后根据具体的需要逐步完善。 -### 7.1.2.2 php-config +### 7.3.1.2 php-config 这个脚本为PHP源码中的/script/php-config.in,PHP安装后被移到安装路径的/bin目录下,并重命名为php-config,这个脚本主要是获取PHP的安装信息的,主要有: * __PHP安装路径__ * __PHP版本__ @@ -81,7 +65,7 @@ PHP提供了几个脚本工具用于简化扩展的实现:ext_skel、phpize、 这个脚本在编译扩展时会用到,执行`./configure --with-php-config=xxx`生成Makefile时作为参数传入即可,它的作用是提供给configure.in获取上面几个配置,生成Makefile。 -#### 7.1.2.3 phpize +#### 7.3.1.3 phpize 这个脚本主要是操作复杂的autoconf/automake/autoheader/autolocal等系列命令,用于生成configure文件,GNU auto系列的工具众多,这里简单介绍下基本的使用: __(1)autoscan:__ 在源码目录下扫描,生成configure.scan,然后把这个文件重名为为configure.in,可以在这个文件里对依赖的文件、库进行检查以及配置一些编译参数等。 @@ -177,7 +161,7 @@ __(7)phpize_check_autotools:__ 检查autoconf、autoheader。 __(8)phpize_autotools__ 执行autoconf生成configure,然后再执行autoheader生成config.h。 -### 7.1.3 编写扩展的基本步骤 +### 7.3.2 编写扩展的基本步骤 编写一个PHP扩展主要分为以下几步: * 通过ext目录下ext_skel脚本生成扩展的基本框架:`./ext_skel --extname`; * 修改config.m4配置:设置编译配置参数、设置扩展的源文件、依赖库/函数检查等等; @@ -187,7 +171,7 @@ __(8)phpize_autotools__ 执行autoconf生成configure,然后再执行autoheade 最后就可以在PHP中使用这个扩展了。 -### 7.1.4 扩展的构成 +### 7.3.3 扩展的构成 扩展首先需要创建一个`zend_module_entry`结构,这个变量必须是全局变量,且变量名必须是:`扩展名称_module_entry`,内核通过这个结构得到这个扩展都提供了哪些功能,换句话说,一个扩展可以只包含一个`zend_module_entry`结构,相当于定义了一个什么功能都没有的扩展。 ```c //zend_modules.h @@ -256,7 +240,7 @@ ZEND_GET_MODULE(mytest) ``` 编译、安装后执行`php -m`就可以看到my_test这个扩展了。 -### 7.1.5 config.m4 +### 7.3.4 config.m4 config.m4是扩展的编译配置文件,它被include到configure.in文件中,最终被autoconf编译为configure,编写扩展时我们只需要在config.m4中修改配置即可,一个简单的扩展配置只需要包含以下内容: ```c PHP_ARG_WITH(扩展名称, for mytest support, @@ -289,8 +273,9 @@ PHP_ADD_INCLUDE(pthread, pthread_create, [], [ AC_MSG_ERROR([not find pthread_create() in lib pthread]) ]) ``` -__(7)PHP_ADD_LIBRARY_WITH_PATH($LIBNAME, $XXX_DIR/$PHP_LIBDIR, XXX_SHARED_LIBADD):__ 添加链接库。 +__(7)AC_CHECK_FUNC(function, [action-if-found], [action-if-not-found]):__ 检查函数是否存在。 +__(8)PHP_ADD_LIBRARY_WITH_PATH($LIBNAME, $XXX_DIR/$PHP_LIBDIR, XXX_SHARED_LIBADD):__ 添加链接库。 -__(8)PHP_NEW_EXTENSION(extname, sources [, shared [, sapi_class [, extra-cflags [, cxx [, zend_ext]]]]]):__ 注册一个扩展,添加扩展源文件,确定此扩展是动态库还是静态库,每个扩展的config.m4中都需要通过这个宏完成扩展的编译配置。 +__(9)PHP_NEW_EXTENSION(extname, sources [, shared [, sapi_class [, extra-cflags [, cxx [, zend_ext]]]]]):__ 注册一个扩展,添加扩展源文件,确定此扩展是动态库还是静态库,每个扩展的config.m4中都需要通过这个宏完成扩展的编译配置。 更多autoconf及PHP封装的宏大家可以在用到的时候再自行检索,同时ext目录下有大量的示例可供参考。 diff --git a/7/implement.md b/7/implement.md new file mode 100644 index 0000000..bebf3d4 --- /dev/null +++ b/7/implement.md @@ -0,0 +1,94 @@ +## 7.2 扩展的实现原理 +PHP中扩展通过`zend_module_entry`这个结构来表示,此结构定义了扩展的全部信息:扩展名、扩展版本、扩展提供的函数列表以及PHP四个执行阶段的hook函数等,每一个扩展都需要定义一个此结构的变量,而且这个变量的名称格式必须是:`{mudule_name}_module_entry`,内核正是通过这个结构获取到扩展提供的功能的。 + +扩展可以在编译PHP时一起编译(静态编译),也可以单独编译为动态库,动态库需要加入到php.ini配置中去,然后在`php_module_startup()`阶段把这些动态库加载到PHP中: +```c +int php_module_startup(sapi_module_struct *sf, zend_module_entry *additional_modules, uint num_additional_modules) +{ + ... + //根据php.ini注册扩展 + php_ini_register_extensions(); + zend_startup_modules(); + + zend_startup_extensions(); + ... +} +``` +动态库就是在`php_ini_register_extensions()`这个函数中完成的注册: +```c +//main/php_ini.c +void php_ini_register_extensions(void) +{ + //注册zend扩展 + zend_llist_apply(&extension_lists.engine, php_load_zend_extension_cb); + //注册php扩展 + zend_llist_apply(&extension_lists.functions, php_load_php_extension_cb); + + zend_llist_destroy(&extension_lists.engine); + zend_llist_destroy(&extension_lists.functions); +} +``` +extension_lists是一个链表,保存着根据`php.ini`中定义的`extension=xxx.so`取到的全部扩展名称,其中engine是zend扩展,functions为php扩展,依次遍历这两个数组然后调用`php_load_php_extension_cb()`或`php_load_zend_extension_cb()`进行各个扩展的加载: +```c +static void php_load_php_extension_cb(void *arg) +{ +#ifdef HAVE_LIBDL + php_load_extension(*((char **) arg), MODULE_PERSISTENT, 0); +#endif +} +``` +`HAVE_LIBDL`这个宏根据`dlopen()`函数是否存在设置的: +```sh +#Zend/Zend.m4 +AC_DEFUN([LIBZEND_LIBDL_CHECKS],[ +AC_CHECK_LIB(dl, dlopen, [LIBS="-ldl $LIBS"]) +AC_CHECK_FUNC(dlopen,[AC_DEFINE(HAVE_LIBDL, 1,[ ])]) +]) +``` +接着就是最关键的操作了,`php_load_extension()`: +```c +//ext/standard/dl.c +PHPAPI int php_load_extension(char *filename, int type, int start_now) +{ + void *handle; + char *libpath; + zend_module_entry *module_entry; + zend_module_entry *(*get_module)(void); + ... + //调用dlopen打开指定的动态连接库文件:xx.so + handle = DL_LOAD(libpath); + ... + //调用dlsym获取get_module的函数指针 + get_module = (zend_module_entry *(*)(void)) DL_FETCH_SYMBOL(handle, "get_module"); + ... + //调用扩展的get_module()函数 + module_entry = get_module(); + ... + //检查扩展使用的zend api是否与当前php版本一致 + if (module_entry->zend_api != ZEND_MODULE_API_NO) { + DL_UNLOAD(handle); + return FAILURE; + } + ... + module_entry->type = type; + //为扩展编号 + module_entry->module_number = zend_next_free_module(); + module_entry->handle = handle; + + if ((module_entry = zend_register_module_ex(module_entry)) == NULL) { + DL_UNLOAD(handle); + return FAILURE; + } + ... +} +``` +`DL_LOAD()`、`DL_FETCH_SYMBOL()`这两个宏在linux下展开后就是:dlopen()、dlsym(),所以上面过程的实现就比较直观了: + +* (1)dlopen()打开so库文件; +* (2)dlsym()获取动态库中`get_module()`函数的地址,`get_module()`是每个扩展都必须提供的一个接口,用于返回扩展`zend_module_entry`结构的地址; +* (3)调用扩展的`get_module()`,获取扩展的`zend_module_entry`结构; +* (4)zend api版本号检查,比如php7的扩展在php5下是无法使用的; +* (5)注册扩展,将扩展添加到`module_registry`中,这是一个全局HashTable,用于全部扩展的zend_module_entry结构; +* (6)如果扩展提供了内部函数则将这些函数注册到EG(function_table)中。 + +完成扩展的注册后,PHP将在不同的执行阶段依次调用每个扩展注册的当前阶段的hook函数。 diff --git a/7/intro.md b/7/intro.md index 2bda8cb..1edfb97 100644 --- a/7/intro.md +++ b/7/intro.md @@ -12,6 +12,7 @@ C语言是PHP之母,作为世界上非常优秀的一门语言,自它诞生 * __提升执行性能:__ PHP是解析型语言,在性能方面远不及C语言,可以将耗cpu的操作以C语言代替 * ...... -当然扩展也不是万能,它只允许我们在PHP提供的框架之上进行一些特定的处理,同时限于不同SAPI的实现差异,扩展的很多实现也必须与其一致、满足SAPI的要求。 +当然扩展也不是万能,它只允许我们在PHP提供的框架之上进行一些特定的处理,同时限于SAPI的差异,扩展也必须要考虑到不同SAPI的实现特点。 PHP中的扩展分为两类:PHP扩展、Zend扩展,对内核而言这两个分别称之为:模块(module)、扩展(extension),本章主要介绍是PHP扩展,也就是模块。 + From 2cf21839d9cfbbbf51187d3bed51fff42cb48b53 Mon Sep 17 00:00:00 2001 From: pangudashu Date: Sat, 20 May 2017 19:44:40 +0800 Subject: [PATCH 252/379] update --- 7/extension_start.md | 104 ------------------------------------------- README.md | 5 --- 2 files changed, 109 deletions(-) delete mode 100644 7/extension_start.md diff --git a/7/extension_start.md b/7/extension_start.md deleted file mode 100644 index 97cc198..0000000 --- a/7/extension_start.md +++ /dev/null @@ -1,104 +0,0 @@ -## 7.2 扩展加载过程 - -PHP扩展的结构`zend_module_entry`: -```c -//zend_modules.h -struct _zend_module_entry { - unsigned short size; - unsigned int zend_api; - unsigned char zend_debug; - unsigned char zts; - const struct _zend_ini_entry *ini_entry; - const struct _zend_module_dep *deps; - const char *name; //扩展名称,不能重复 - const struct _zend_function_entry *functions; //扩展提供的内部函数列表 - int (*module_startup_func)(INIT_FUNC_ARGS); //扩展初始化回调函数,PHP_MINIT_FUNCTION或ZEND_MINIT_FUNCTION定义的函数 - int (*module_shutdown_func)(SHUTDOWN_FUNC_ARGS); //扩展关闭时回调函数 - int (*request_startup_func)(INIT_FUNC_ARGS); //请求开始前回调函数 - int (*request_shutdown_func)(SHUTDOWN_FUNC_ARGS); //请求结束时回调函数 - void (*info_func)(ZEND_MODULE_INFO_FUNC_ARGS); //php_info展示的扩展信息处理函数 - const char *version; //版本 - size_t globals_size; -#ifdef ZTS - ts_rsrc_id* globals_id_ptr; -#else - void* globals_ptr; -#endif - void (*globals_ctor)(void *global); - void (*globals_dtor)(void *global); - int (*post_deactivate_func)(void); - int module_started; - unsigned char type; - void *handle; - int module_number; - const char *build_id; -}; -``` -`zend_module_entry`是一个扩展唯一的标识,从这个结构我们可以猜测一个PHP扩展主要都由哪些部分构成: -* __扩展名称__:name,这个是必须的,每个扩展需要有个名字 -* __两个阶段的四个hook钩子函数__:module_startup_func、module_shutdown_func、request_startup_func、request_shutdown_func,这些函数分别通过:PHP_MINIT_FUNCTION、PHP_MSHUTDOWN_FUNCTION、PHP_RINIT_FUNCTION、PHP_RSHUTDOWN_FUNCTION几个宏定义,这几个函数不是必须的,可以设为null -* __函数数组__:functions,这个是指扩展中定义的PHP内部函数,是个数组,内部函数通过宏`PHP_FUNCTION`定义,这个也不是必须的可以设为null - -总的来看一个扩展主要就包括上面三个部分,其中`zend_module_entry`是最重要的一个结构,我们需要定义一个这样的全局变量: -```c -zend_module_entry {mudule_name}_module_entry = { - ... -} -``` -而且这个变量的名称格式必须是:__{mudule_name}_module_entry__。 - -扩展可以在编译PHP时一起编译,也可以后期编译然后动态加载,下面看下动态扩展的加载过程: - -首先调用`php_ini_register_extensions`: -```c -//main/php_ini.c -void php_ini_register_extensions(void) -{ - zend_llist_apply(&extension_lists.engine, php_load_zend_extension_cb); - zend_llist_apply(&extension_lists.functions, php_load_php_extension_cb); - - zend_llist_destroy(&extension_lists.engine); - zend_llist_destroy(&extension_lists.functions); -} -``` -`extension_lists`记录的是根据`php.ini`中定义的`extension=xxx.so`取到的全部扩展名称,然后遍历这个数组依次调用`php_load_php_extension_cb`加载扩展(php_load_zend_extension_cb是zend扩展加载时的方法): -```c -static void php_load_php_extension_cb(void *arg) -{ -#ifdef HAVE_LIBDL - php_load_extension(*((char **) arg), MODULE_PERSISTENT, 0); -#endif -} -``` -`php_load_extension`: -```c -//ext/standard/dl.c #90 -PHPAPI int php_load_extension(char *filename, int type, int start_now) -{ - ... - - zend_module_entry *module_entry; - zend_module_entry *(*get_module)(void); - ... - - handle = DL_LOAD(libpath); //调用dlopen打开指定的动态连接库文件:xx.so - ... - - get_module = (zend_module_entry *(*)(void)) DL_FETCH_SYMBOL(handle, "get_module"); //调用dlsym获取get_module的函数指针 - ... - - module_entry = get_module(); - ... -} -``` -上面的过程就是普通的动态链接库的用法了:通过`dlopen`打开库文件,通过`dlsym`获取指定函数、变量,最终得到的`module_entry`就是我们在扩展中定义的`zend_module_entry`结构,拿到这个结构接下来的过程就比较简单了,主要就是检查版本是否匹配可用、调用`zend_register_module_ex`将扩展加到`module_registry`(全部扩展的哈希表)、注册扩展提供的函数、调用扩展初始化回调函数。 - -还有一个地方值得注意的是调用dlsym获取get_module的函数指针的过程,这说明每个扩展中都需要定义一个__get_module()__函数,这个函数返回了我们定义的`zend_module_entry`结构指针,实际我们可以根据`ZEND_GET_MODULE(module_name)`这个宏完成这个函数的定义: -```c -//zend_API.h -#define ZEND_GET_MODULE(name) \ - BEGIN_EXTERN_C()\ - ZEND_DLEXPORT zend_module_entry *get_module(void) { return &name##_module_entry; //这个就是我们定义的扩展结构的全局变量 }\ - END_EXTERN_C() -``` - diff --git a/README.md b/README.md index efb7681..3261d3e 100644 --- a/README.md +++ b/README.md @@ -52,11 +52,6 @@ * 7.1 概述 * 7.2 扩展的实现原理 * [7.3 扩展的构成及编译](7/extension_intro.md) - * 7.1.1 扩展能做什么 - * 7.1.2 脚本工具 - * 7.1.3 编写扩展的基本步骤 - * 7.1.4 扩展的组成部分 - * 7.1.5 config.m4 * 7.3 ini配置 * 7.4 变量的操作 * 7.5 函数的操作 From 0cb5f5dec1003e53e02dff11beddf7a3d41ad971 Mon Sep 17 00:00:00 2001 From: pangudashu Date: Sat, 20 May 2017 21:58:25 +0800 Subject: [PATCH 253/379] add hook function --- 7/hook.md | 113 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 113 insertions(+) create mode 100644 7/hook.md diff --git a/7/hook.md b/7/hook.md new file mode 100644 index 0000000..8ca51d2 --- /dev/null +++ b/7/hook.md @@ -0,0 +1,113 @@ +## 7.4 钩子函数 +PHP为扩展提供了5个钩子函数,PHP执行到不同阶段时回调各个扩展定义的钩子函数,扩展可以通过这些钩子函数介入到PHP生命周期的不同阶段中去,这些钩子函数的定义非常简单,PHP提供了对应的宏,定义完成后只需要设置`zend_module_entry`对应的函数指针即可。 + +前面已经介绍过PHP生命周期的几个阶段,这几个钩子函数执行的先后顺序:module startup -> request startup -> 编译、执行 -> request shutdown -> post deactivate -> module shutdown。 + +### 7.4.1 module_startup_func +这个函数在PHP模块初始化阶段执行,通常情况下,此过程只会在SAPI启动后执行一次。这个阶段可以进行内部类的注册,如果你的扩展提供了类就可以在此函数中完成注册;除了类还可以在此函数中注册扩展定义的常量;另外,扩展可以在此阶段覆盖PHP编译、执行的两个函数指针:zend_compile_file、zend_execute_ex,从而可以接管PHP的编译、执行,opcache的实现原理就是替换了zend_compile_file,从而使得PHP编译时调用的是opcache自己定义的编译函数,对编译后的结果进行缓存。 + +此钩子函数通过`PHP_MINIT_FUNCTION()`或`ZEND_MINIT_FUNCTION()`宏完成定义: +```c +PHP_MINIT_FUNCTION(extension_name) +{ + ... +} +``` +展开后: +```c +zm_startup_extension_name(int type, int module_number) +{ + ... +} +``` +最后通过`PHP_MINIT()`或`ZEND_MINIT()`宏将zend_module_entry的module_startup_func设置为上面定义的函数。 +```c +#define PHP_MINIT ZEND_MODULE_STARTUP_N +#define ZEND_MINIT ZEND_MODULE_STARTUP_N + +#define ZEND_MODULE_STARTUP_N(module) zm_startup_##module +``` +### 7.4.2 request_startup_func +此函数在编译、执行之前回调,fpm模式下每一个http请求就是一个request,脚本执行前将首先执行这个函数。如果你的扩展需要针对每一个请求进行处理则可以设置这个函数,如:对请求进行filter、根据请求ip获取所在城市、对请求/返回数据加解密等。此函数通过`PHP_RINIT_FUNCTION()`或`ZEND_RINIT_FUNCTION()`宏定义: +```c +PHP_RINIT_FUNCTION(extension_name) +{ + ... +} +``` +展开后: +```c +zm_activate_extension_name(int type, int module_number) +{ + ... +} +``` +获取函数地址的宏:`PHP_RINIT()`或`ZEND_RINIT()`: +```c +#define PHP_RINIT ZEND_MODULE_ACTIVATE_N +#define ZEND_RINIT ZEND_MODULE_ACTIVATE_N + +#define ZEND_MODULE_ACTIVATE_N(module) zm_activate_##module +``` +### 7.4.3 request_shutdown_func +此函数在请求结束时被调用,通过`PHP_RSHUTDOWN_FUNCTION()`或`ZEND_RSHUTDOWN_FUNCTION()`宏定义: +```c +PHP_RSHUTDOWN_FUNCTION(extension_name) +{ + ... +} +``` +函数地址通过`PHP_RSHUTDOWN()`或`ZEND_RSHUTDOWN()`获取: +```c +#define PHP_RSHUTDOWN ZEND_MODULE_DEACTIVATE_N +#define ZEND_RSHUTDOWN ZEND_MODULE_DEACTIVATE_N + +#define ZEND_MODULE_DEACTIVATE_N(module) zm_deactivate_##module +``` +### 7.4.4 post_deactivate_func +这个函数比较特殊,一般很少会用到,实际它也是在请求结束之后调用的,它比request_shutdown_func更晚执行: +```c +void php_request_shutdown(void *dummy) +{ + ... + //调用各扩展的request_shutdown_func + if (PG(modules_activated)) { + zend_deactivate_modules(); + } + //关闭输出:发送http header + php_output_deactivate(); + + //释放超全局变量:$_GET、$_POST... + ... + //关闭编译器、执行器 + zend_deactivate(); + + //调用每个扩展的post_deactivate_func + zend_post_deactivate_modules(); + ... +} +``` +从上面的执行顺序可以看出,request_shutdown_func、post_deactivate_func是先后执行的,此函数通过`ZEND_MODULE_POST_ZEND_DEACTIVATE_D()`宏定义,`ZEND_MODULE_POST_ZEND_DEACTIVATE_N()`获取函数地址: +```c +#define ZEND_MODULE_POST_ZEND_DEACTIVATE_N(module) zm_post_zend_deactivate_##module +``` +### 7.4.5 module_shutdown_func +模块关闭阶段回调的函数,与module_startup_func对应,此阶段主要可以进行一些资源的清理,通过`PHP_MSHUTDOWN_FUNCTION()`或`ZEND_MSHUTDOWN_FUNCTION()`定义: +```c +PHP_MSHUTDOWN_FUNCTION(extension_name) +{ + ... +} +``` +通过`PHP_MSHUTDOWN()`或`ZEND_MSHUTDOWN()`获取函数地址: +```c +#define PHP_MSHUTDOWN ZEND_MODULE_SHUTDOWN_N +#define ZEND_MSHUTDOWN ZEND_MODULE_SHUTDOWN_N + +#define ZEND_MODULE_SHUTDOWN_N(module) zm_shutdown_##module +``` + +如果扩展名称为mytest,则最终定义的扩展: +```c + +``` From 71f149c589559209af7c5b14b1a142b2913a59d4 Mon Sep 17 00:00:00 2001 From: pangudashu Date: Sat, 20 May 2017 22:04:34 +0800 Subject: [PATCH 254/379] update --- 7/extension_intro.md | 149 ++++++++++++++++++++++--------------------- 7/hook.md | 34 ++++++++++ 2 files changed, 109 insertions(+), 74 deletions(-) diff --git a/7/extension_intro.md b/7/extension_intro.md index c980928..f62085c 100644 --- a/7/extension_intro.md +++ b/7/extension_intro.md @@ -1,5 +1,75 @@ ## 7.3 扩展的构成及编译 -### 7.3.1 脚本工具 + +### 7.3.1 扩展的构成 +扩展首先需要创建一个`zend_module_entry`结构,这个变量必须是全局变量,且变量名必须是:`扩展名称_module_entry`,内核通过这个结构得到这个扩展都提供了哪些功能,换句话说,一个扩展可以只包含一个`zend_module_entry`结构,相当于定义了一个什么功能都没有的扩展。 +```c +//zend_modules.h +struct _zend_module_entry { + unsigned short size; //sizeof(zend_module_entry) + unsigned int zend_api; //ZEND_MODULE_API_NO + unsigned char zend_debug; //是否开启debug + unsigned char zts; //是否开启线程安全 + const struct _zend_ini_entry *ini_entry; + const struct _zend_module_dep *deps; + const char *name; //扩展名称,不能重复 + const struct _zend_function_entry *functions; //扩展提供的内部函数列表 + int (*module_startup_func)(INIT_FUNC_ARGS); //扩展初始化回调函数,PHP_MINIT_FUNCTION或ZEND_MINIT_FUNCTION定义的函数 + int (*module_shutdown_func)(SHUTDOWN_FUNC_ARGS); //扩展关闭时回调函数 + int (*request_startup_func)(INIT_FUNC_ARGS); //请求开始前回调函数 + int (*request_shutdown_func)(SHUTDOWN_FUNC_ARGS); //请求结束时回调函数 + void (*info_func)(ZEND_MODULE_INFO_FUNC_ARGS); //php_info展示的扩展信息处理函数 + const char *version; //版本 + ... + unsigned char type; + void *handle; + int module_number; //扩展的唯一编号 + const char *build_id; +}; +``` +这个结构包含很多成员,但并不是所有的都需要自己定义,经常用到的主要有下面几个: +* __name:__ 扩展名称,不能重复 +* __functions:__ 扩展定义的内部函数entry +* __module_startup_func:__ PHP在模块初始化时回调的hook函数,可以使扩展介入module startup阶段 +* __module_shutdown_func:__ 在模块关闭阶段回调的函数 +* __request_startup_func:__ 在请求初始化阶段回调的函数 +* __request_shutdown_func:__ 在请求结束阶段回调的函数 +* __info_func:__ php_info()函数时调用,用于展示一些配置、运行信息 +* __version:__ 扩展版本 + +除了上面这些需要手动设置的成员,其它部分可以通过`STANDARD_MODULE_HEADER`、`STANDARD_MODULE_PROPERTIES`宏统一设置,扩展提供的内部函数及四个执行阶段的钩子函数是扩展最常用到的部分,几乎所有的扩展都是基于这两部分实现的。有了这个结构还需要提供一个接口来获取这个结构变量,这个接口是统一的,扩展中通过`ZEND_GET_MODULE(extension_name)`完成这个接口的定义: +``` +//zend_API.h +#define ZEND_GET_MODULE(name) \ + BEGIN_EXTERN_C()\ + ZEND_DLEXPORT zend_module_entry *get_module(void) { return &name##_module_entry; }\ + END_EXTERN_C() +``` +展开后可以看到,实际就是定义了一个get_module()函数,返回扩展zend_module_entry结构的地址,这就是为什么这个结构的变量名必须是`扩展名称_module_entry`这种格式的原因。 + +有了扩展的zend_module_entry结构以及获取这个结构的接口一个合格的扩展就编写完成了,只是这个扩展目前还什么都干不了: +```c +#include "php.h" +#include "php_ini.h" +#include "ext/standard/info.h" + +zend_module_entry mytest_module_entry = { + STANDARD_MODULE_HEADER, + "mytest", + NULL, //mytest_functions, + NULL, //PHP_MINIT(mytest), + NULL, //PHP_MSHUTDOWN(mytest), + NULL, //PHP_RINIT(mytest), + NULL, //PHP_RSHUTDOWN(mytest), + NULL, //PHP_MINFO(mytest), + "1.0.0", + STANDARD_MODULE_PROPERTIES +}; + +ZEND_GET_MODULE(mytest) +``` +编译、安装后执行`php -m`就可以看到my_test这个扩展了。 + +### 7.3.2 脚本工具 PHP提供了几个脚本工具用于简化扩展的实现:ext_skel、phpize、php-config,后面两个脚本主要配合autoconf、automake生成Makefile。在介绍这几个工具之前,我们先看下PHP安装后的目录结构,因为很多脚本、配置都放置在安装后的目录中,比如PHP的安装路径为:/usr/local/php7,则此目录的主要结构: ```c |---php7 @@ -31,7 +101,7 @@ PHP提供了几个脚本工具用于简化扩展的实现:ext_skel、phpize、 | |---var //log、run日志 ``` -#### 7.3.1.1 ext_skel +#### 7.3.2.1 ext_skel 这个脚本位于PHP源码/ext目录下,它的作用是用来生成扩展的基本骨架,帮助开发者快速生成一个规范的扩展结构,可以通过以下命令生成一个扩展结构: ```c ./ext_skel --extname=扩展名称 @@ -51,7 +121,7 @@ PHP提供了几个脚本工具用于简化扩展的实现:ext_skel、phpize、 | |---001.phpt ``` 这个脚本主要生成了编译需要的配置以及扩展的基本结构,初步生成的这个扩展可以成功的编译、安装、使用,实际开发中我们可以使用这个脚本生成一个基本结构,然后根据具体的需要逐步完善。 -### 7.3.1.2 php-config +### 7.3.2.2 php-config 这个脚本为PHP源码中的/script/php-config.in,PHP安装后被移到安装路径的/bin目录下,并重命名为php-config,这个脚本主要是获取PHP的安装信息的,主要有: * __PHP安装路径__ * __PHP版本__ @@ -65,7 +135,7 @@ PHP提供了几个脚本工具用于简化扩展的实现:ext_skel、phpize、 这个脚本在编译扩展时会用到,执行`./configure --with-php-config=xxx`生成Makefile时作为参数传入即可,它的作用是提供给configure.in获取上面几个配置,生成Makefile。 -#### 7.3.1.3 phpize +#### 7.3.2.3 phpize 这个脚本主要是操作复杂的autoconf/automake/autoheader/autolocal等系列命令,用于生成configure文件,GNU auto系列的工具众多,这里简单介绍下基本的使用: __(1)autoscan:__ 在源码目录下扫描,生成configure.scan,然后把这个文件重名为为configure.in,可以在这个文件里对依赖的文件、库进行检查以及配置一些编译参数等。 @@ -161,7 +231,7 @@ __(7)phpize_check_autotools:__ 检查autoconf、autoheader。 __(8)phpize_autotools__ 执行autoconf生成configure,然后再执行autoheader生成config.h。 -### 7.3.2 编写扩展的基本步骤 +### 7.3.3 编写扩展的基本步骤 编写一个PHP扩展主要分为以下几步: * 通过ext目录下ext_skel脚本生成扩展的基本框架:`./ext_skel --extname`; * 修改config.m4配置:设置编译配置参数、设置扩展的源文件、依赖库/函数检查等等; @@ -171,75 +241,6 @@ __(8)phpize_autotools__ 执行autoconf生成configure,然后再执行autoheade 最后就可以在PHP中使用这个扩展了。 -### 7.3.3 扩展的构成 -扩展首先需要创建一个`zend_module_entry`结构,这个变量必须是全局变量,且变量名必须是:`扩展名称_module_entry`,内核通过这个结构得到这个扩展都提供了哪些功能,换句话说,一个扩展可以只包含一个`zend_module_entry`结构,相当于定义了一个什么功能都没有的扩展。 -```c -//zend_modules.h -struct _zend_module_entry { - unsigned short size; //sizeof(zend_module_entry) - unsigned int zend_api; //ZEND_MODULE_API_NO - unsigned char zend_debug; //是否开启debug - unsigned char zts; //是否开启线程安全 - const struct _zend_ini_entry *ini_entry; - const struct _zend_module_dep *deps; - const char *name; //扩展名称,不能重复 - const struct _zend_function_entry *functions; //扩展提供的内部函数列表 - int (*module_startup_func)(INIT_FUNC_ARGS); //扩展初始化回调函数,PHP_MINIT_FUNCTION或ZEND_MINIT_FUNCTION定义的函数 - int (*module_shutdown_func)(SHUTDOWN_FUNC_ARGS); //扩展关闭时回调函数 - int (*request_startup_func)(INIT_FUNC_ARGS); //请求开始前回调函数 - int (*request_shutdown_func)(SHUTDOWN_FUNC_ARGS); //请求结束时回调函数 - void (*info_func)(ZEND_MODULE_INFO_FUNC_ARGS); //php_info展示的扩展信息处理函数 - const char *version; //版本 - ... - unsigned char type; - void *handle; - int module_number; //扩展的唯一编号 - const char *build_id; -}; -``` -这个结构包含很多成员,但并不是所有的都需要自己定义,经常用到的主要有下面几个: -* __name:__ 扩展名称,不能重复 -* __functions:__ 扩展定义的内部函数entry -* __module_startup_func:__ PHP在模块初始化时回调的hook函数,可以使扩展介入module startup阶段 -* __module_shutdown_func:__ 在模块关闭阶段回调的函数 -* __request_startup_func:__ 在请求初始化阶段回调的函数 -* __request_shutdown_func:__ 在请求结束阶段回调的函数 -* __info_func:__ php_info()函数时调用,用于展示一些配置、运行信息 -* __version:__ 扩展版本 - -除了上面这些需要手动设置的成员,其它部分可以通过`STANDARD_MODULE_HEADER`、`STANDARD_MODULE_PROPERTIES`宏统一设置,扩展提供的内部函数及四个执行阶段的钩子函数是扩展最常用到的部分,几乎所有的扩展都是基于这两部分实现的。有了这个结构还需要提供一个接口来获取这个结构变量,这个接口是统一的,扩展中通过`ZEND_GET_MODULE(extension_name)`完成这个接口的定义: -``` -//zend_API.h -#define ZEND_GET_MODULE(name) \ - BEGIN_EXTERN_C()\ - ZEND_DLEXPORT zend_module_entry *get_module(void) { return &name##_module_entry; }\ - END_EXTERN_C() -``` -展开后可以看到,实际就是定义了一个get_module()函数,返回扩展zend_module_entry结构的地址,这就是为什么这个结构的变量名必须是`扩展名称_module_entry`这种格式的原因。 - -有了扩展的zend_module_entry结构以及获取这个结构的接口一个合格的扩展就编写完成了,只是这个扩展目前还什么都干不了: -```c -#include "php.h" -#include "php_ini.h" -#include "ext/standard/info.h" - -zend_module_entry mytest_module_entry = { - STANDARD_MODULE_HEADER, - "mytest", - NULL, //mytest_functions, - NULL, //PHP_MINIT(mytest), - NULL, //PHP_MSHUTDOWN(mytest), - NULL, //PHP_RINIT(mytest), - NULL, //PHP_RSHUTDOWN(mytest), - NULL, //PHP_MINFO(mytest), - "1.0.0", - STANDARD_MODULE_PROPERTIES -}; - -ZEND_GET_MODULE(mytest) -``` -编译、安装后执行`php -m`就可以看到my_test这个扩展了。 - ### 7.3.4 config.m4 config.m4是扩展的编译配置文件,它被include到configure.in文件中,最终被autoconf编译为configure,编写扩展时我们只需要在config.m4中修改配置即可,一个简单的扩展配置只需要包含以下内容: ```c diff --git a/7/hook.md b/7/hook.md index 8ca51d2..60eea8c 100644 --- a/7/hook.md +++ b/7/hook.md @@ -89,6 +89,7 @@ void php_request_shutdown(void *dummy) ``` 从上面的执行顺序可以看出,request_shutdown_func、post_deactivate_func是先后执行的,此函数通过`ZEND_MODULE_POST_ZEND_DEACTIVATE_D()`宏定义,`ZEND_MODULE_POST_ZEND_DEACTIVATE_N()`获取函数地址: ```c +#define ZEND_MINIT ZEND_MODULE_STARTUP_N #define ZEND_MODULE_POST_ZEND_DEACTIVATE_N(module) zm_post_zend_deactivate_##module ``` ### 7.4.5 module_shutdown_func @@ -109,5 +110,38 @@ PHP_MSHUTDOWN_FUNCTION(extension_name) 如果扩展名称为mytest,则最终定义的扩展: ```c +PHP_MINIT_FUNCTION(mytest) +{ + ... +} + +PHP_RINIT_FUNCTION(mytest) +{ + ... +} + +PHP_RSHUTDOWN_FUNCTION(mytest) +{ + ... +} + +PHP_MSHUTDOWN_FUNCTION(mytest) +{ + ... +} + +zend_module_entry mytest_module_entry = { + STANDARD_MODULE_HEADER, + "mytest", + NULL, //mytest_functions, + PHP_MINIT(mytest), + PHP_MSHUTDOWN(mytest), + PHP_RINIT(mytest), + PHP_RSHUTDOWN(mytest), + NULL, //PHP_MINFO(mytest), + "1.0.0", + STANDARD_MODULE_PROPERTIES +}; +ZEND_GET_MODULE(mytest) ``` From 1795ec9f9a3fff32e2483204f0b928e780e3fa4e Mon Sep 17 00:00:00 2001 From: pangudashu Date: Sat, 20 May 2017 22:09:02 +0800 Subject: [PATCH 255/379] update --- README.md | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 3261d3e..8ad1b9f 100644 --- a/README.md +++ b/README.md @@ -49,9 +49,14 @@ * [6.1 什么是线程安全](6/ts.md) * [6.2 线程安全资源管理器](6/ts.md) * 第7章 扩展开发 - * 7.1 概述 - * 7.2 扩展的实现原理 + * [7.1 概述](7/intro.md) + * [7.2 扩展的实现原理](7/implement.md) * [7.3 扩展的构成及编译](7/extension_intro.md) + * [7.3.1 扩展的构成](7/extension_intro.md) + * [7.3.2 脚本工具](7/extension_intro.md) + * [7.3.3 编写扩展的基本步骤](7/extension_intro.md) + * [7.3.4 config.m4](7/extension_intro.md) + * [7.4 钩子函数](7/hook.md) * 7.3 ini配置 * 7.4 变量的操作 * 7.5 函数的操作 From 3f05a52baed3f7e4a1676b311341490e8fb8eee1 Mon Sep 17 00:00:00 2001 From: pangudashu Date: Sat, 20 May 2017 22:20:13 +0800 Subject: [PATCH 256/379] update --- 7/hook.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/7/hook.md b/7/hook.md index 60eea8c..4a08661 100644 --- a/7/hook.md +++ b/7/hook.md @@ -107,8 +107,8 @@ PHP_MSHUTDOWN_FUNCTION(extension_name) #define ZEND_MODULE_SHUTDOWN_N(module) zm_shutdown_##module ``` - -如果扩展名称为mytest,则最终定义的扩展: +7.4.6 小节 +上面详细介绍了各个阶段定义的钩子函数的格式,使用gdb调试扩展时可以根据展开后实际的函数名称设置断点。这些钩子实际已经为扩展构造了一个整体的框架,通过这几个钩子扩展已经能实现很多功能了,后面我们介绍的很多内容都是在这几个函数中完成的,比如内部类的注册、常量注册、资源注册等。如果扩展名称为mytest,则最终定义的扩展: ```c PHP_MINIT_FUNCTION(mytest) { @@ -145,3 +145,4 @@ zend_module_entry mytest_module_entry = { ZEND_GET_MODULE(mytest) ``` + From 65b396eaa13cc5162d5c229a5ef0814e168ba0ef Mon Sep 17 00:00:00 2001 From: pangudashu Date: Sat, 20 May 2017 22:33:27 +0800 Subject: [PATCH 257/379] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E7=9B=AE=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 8ad1b9f..698bf29 100644 --- a/README.md +++ b/README.md @@ -53,20 +53,22 @@ * [7.2 扩展的实现原理](7/implement.md) * [7.3 扩展的构成及编译](7/extension_intro.md) * [7.3.1 扩展的构成](7/extension_intro.md) - * [7.3.2 脚本工具](7/extension_intro.md) + * [7.3.2 编译工具](7/extension_intro.md) * [7.3.3 编写扩展的基本步骤](7/extension_intro.md) * [7.3.4 config.m4](7/extension_intro.md) * [7.4 钩子函数](7/hook.md) - * 7.3 ini配置 - * 7.4 变量的操作 - * 7.5 函数的操作 + * 7.5 扩展配置 + * 7.5.1 全局变量 + * 7.5.2 ini配置 + * 7.7 变量的操作 + * 7.8 函数的操作 * 7.5.1 扩展中调用自定义函数 * 7.5.2 创建内部函数 - * 7.6 面向对象 + * 7.9 面向对象 * 7.6.1 扩展中创建对象 * 7.6.2 创建内部类 - * 7.7 资源类型 - * 7.8 经典扩展解析 + * 7.10 资源类型 + * 7.11 经典扩展解析 * 7.8.1 Yaf * 7.8.2 Redis * 7.8.3 Memcached From 68fc8fb188e6ccb61203a99cac610426a5b14678 Mon Sep 17 00:00:00 2001 From: pangudashu Date: Sun, 21 May 2017 11:46:56 +0800 Subject: [PATCH 258/379] update --- 7/conf.md | 55 ++++++++++++++++++++++++++++++++++++++++++++ 7/extension_intro.md | 2 +- 2 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 7/conf.md diff --git a/7/conf.md b/7/conf.md new file mode 100644 index 0000000..624f1ae --- /dev/null +++ b/7/conf.md @@ -0,0 +1,55 @@ +## 7.5 扩展配置 + +### 7.5.1 全局变量(资源) +使用C语言开发程序时经常会使用全局变量进行数据存储,这就涉及前面已经介绍过的一个问题:线程安全,PHP设计了TSRM(即:线程安全资源管理器)用于解决这个问题,内核中频繁使用到的EG、CG等都是根据是否开启ZTS封装的宏,同样的,在扩展中也需要必须按照TSRM的规范定义全局变量,除非你的扩展不支持多线程的环境。 + +PHP为扩展的全局变量提供了一种存储方式:每个扩展将自己所有的全局变量统一定义在一个结构体中,然后将这个结构体注册到TSRM中,这样扩展就可以像使用EG、CG那样访问这个结构体。 + +这个结构体的定义通过`ZEND_BEGIN_MODULE_GLOBALS(extension_name)`、`ZEND_END_MODULE_GLOBALS(extension_name)`两个宏完成,这两个宏必须成对出现,中间定义扩展需要的全局变量即可。 +```c +ZEND_BEGIN_MODULE_GLOBALS(mytest) + zend_long opene_cache; + HashTable class_table; +ZEND_END_MODULE_GLOBALS(mytest) +``` +展开后实际就是个普通的struct: +```c +typedef struct _zend_mytest_globals { + zend_long opene_cache; + HashTable class_table; +}zend_mytest_globals; +``` +接着创建一个此结构体的全局变量,这时候就会涉及ZTS了,如果未开启线程安全直接创建普通的全局变量即可,如果开启线程安全了则需要向TSRM注册,得到一个唯一的资源id,这个操作也由专门的宏来完成:`ZEND_DECLARE_MODULE_GLOBALS(extension_name)`,展开后: +```c +//ZTS:此时只是定义资源id,并没有向TSRM注册 +ts_rsrc_id mytest_globals_id; + +//非ZTS +zend_mytest_globals mytest_globals; +``` +最后需要定义一个像EG、CG那样的宏用于访问扩展的全局资源结构体,这一步将使用`ZEND_MODULE_GLOBALS_ACCESSOR()`宏完成: +```c +#define MYTEST_G(v) ZEND_MODULE_GLOBALS_ACCESSOR(mytest, v) +``` +看起来是不是跟EG、CG的定义非常像?这个宏展开后: +```c +//ZTS +#define MYTEST_G(v) ZEND_TSRMG(mytest_globals_id, zend_##module_name##_globals *, v) + +//非ZTS +#define MYTEST_G(v) (mytest_globals.v) +``` +接下来就可以在扩展中通过:MYTEST_G(opene_cache)、MYTEST_G(class_table)对结构体成员进行读写了。通常会把这个全局资源结构体及结构体的访问宏定义在头文件中,然后把全局变量的声明放到源文件中: +```c +//php_mytest.h +#define MYTEST_G(v) ZEND_MODULE_GLOBALS_ACCESSOR(mytest, v) + +ZEND_BEGIN_MODULE_GLOBALS(mytest) + zend_long opene_cache; + HashTable class_table; +ZEND_END_MODULE_GLOBALS(mytest) + +//mytest.c +ZEND_DECLARE_MODULE_GLOBALS(mytest) +``` +### 7.5.2 php.ini配置 diff --git a/7/extension_intro.md b/7/extension_intro.md index f62085c..f6aafc8 100644 --- a/7/extension_intro.md +++ b/7/extension_intro.md @@ -69,7 +69,7 @@ ZEND_GET_MODULE(mytest) ``` 编译、安装后执行`php -m`就可以看到my_test这个扩展了。 -### 7.3.2 脚本工具 +### 7.3.2 编译工具 PHP提供了几个脚本工具用于简化扩展的实现:ext_skel、phpize、php-config,后面两个脚本主要配合autoconf、automake生成Makefile。在介绍这几个工具之前,我们先看下PHP安装后的目录结构,因为很多脚本、配置都放置在安装后的目录中,比如PHP的安装路径为:/usr/local/php7,则此目录的主要结构: ```c |---php7 From 6224082c887d1daef1445c2df05d8dbcf92021ac Mon Sep 17 00:00:00 2001 From: pangudashu Date: Sun, 21 May 2017 17:12:45 +0800 Subject: [PATCH 259/379] update --- 7/conf.md | 94 ++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 90 insertions(+), 4 deletions(-) diff --git a/7/conf.md b/7/conf.md index 624f1ae..13a8341 100644 --- a/7/conf.md +++ b/7/conf.md @@ -1,4 +1,4 @@ -## 7.5 扩展配置 +## 7.5 运行时配置 ### 7.5.1 全局变量(资源) 使用C语言开发程序时经常会使用全局变量进行数据存储,这就涉及前面已经介绍过的一个问题:线程安全,PHP设计了TSRM(即:线程安全资源管理器)用于解决这个问题,内核中频繁使用到的EG、CG等都是根据是否开启ZTS封装的宏,同样的,在扩展中也需要必须按照TSRM的规范定义全局变量,除非你的扩展不支持多线程的环境。 @@ -8,14 +8,14 @@ PHP为扩展的全局变量提供了一种存储方式:每个扩展将自己 这个结构体的定义通过`ZEND_BEGIN_MODULE_GLOBALS(extension_name)`、`ZEND_END_MODULE_GLOBALS(extension_name)`两个宏完成,这两个宏必须成对出现,中间定义扩展需要的全局变量即可。 ```c ZEND_BEGIN_MODULE_GLOBALS(mytest) - zend_long opene_cache; + zend_long open_cache; HashTable class_table; ZEND_END_MODULE_GLOBALS(mytest) ``` 展开后实际就是个普通的struct: ```c typedef struct _zend_mytest_globals { - zend_long opene_cache; + zend_long open_cache; HashTable class_table; }zend_mytest_globals; ``` @@ -45,11 +45,97 @@ zend_mytest_globals mytest_globals; #define MYTEST_G(v) ZEND_MODULE_GLOBALS_ACCESSOR(mytest, v) ZEND_BEGIN_MODULE_GLOBALS(mytest) - zend_long opene_cache; + zend_long open_cache; HashTable class_table; ZEND_END_MODULE_GLOBALS(mytest) //mytest.c ZEND_DECLARE_MODULE_GLOBALS(mytest) ``` +> 在一个扩展中并不是只能定义一个全局变量结构,数目是不限制的。 + ### 7.5.2 php.ini配置 +php.ini是PHP主要的配置文件,解析时PHP将在这些地方依次查找该文件:当前工作目录、环境变量PHPRC指定目录、编译时指定的路径,在命令行模式下,php.ini的查找路径可以用`-c`参数替代。 + +该文件的语法非常简单:`配置标识符 = 值`。空白字符和用分号';'开始的行被忽略,[xxx]行也被忽略;配置标识符大写敏感,通常会用'.'区分不同的节;值可以是数字、字符串、PHP常量、位运算表达式。 + +关于php.ini的解析过程本节不作介绍,只从应用的角度介绍如何在一个扩展中获取一个配置项,通常会把php.ini的配置映射到一个变量,从而在使用时直接读取那个变量,也就是把所有的配置转化为了C语言中的变量,扩展中一般会把php.ini配置映射到上一节介绍的全局变量(资源),要想实现这个转化需要在扩展中为每一项配置设置映射规则: +```c +PHP_INI_BEGIN() + //每一项配置规则 + ... +PHP_INI_END(); +``` +这两个宏实际只是把各配置规则组成一个数组,配置规则通过`STD_PHP_INI_ENTRY()`设置: +```c +STD_PHP_INI_ENTRY(name,default_value,modifiable,on_modify,property_name,struct_type,struct_ptr) +``` +* __name:__ php.ini中的配置标识符 +* __default_value:__ 默认值,注意不管转化后是什么类型,这里必须设置为字符串 +* __modifiable:__ +* __on_modify:__ 函数指针,用于指定发现这个配置后赋值处理的函数,默认提供了5个:OnUpdateBool、OnUpdateLong、OnUpdateLongGEZero、OnUpdateReal、OnUpdateString、OnUpdateStringUnempty,如果满足不了需求可以自定义 +* __property_name:__ 要映射到的结构struct_type中的成员 +* __struct_type:__ 映射结构的类型 +* __struct_ptr:__ 映射结构的变量地址,发现配置后会 + +这个宏展开后生成一个`zend_ini_entry_def`结构: +```c +typedef struct _zend_ini_entry_def { + const char *name; + int (*on_modify)(zend_ini_entry *entry, zend_string *new_value, void *mh_arg1, void *mh_arg2, void *mh_arg3, int stage); + void *mh_arg1; //映射成员所在结构体的偏移:offsetof(type, member-designator)取到 + void *mh_arg2; //要映射到结构的地址 + void *mh_arg3; + const char *value;//默认值 + void (*displayer)(zend_ini_entry *ini_entry, int type); + int modifiable; + + uint name_length; + uint value_length; +} zend_ini_entry_def; +``` +比如将php.ini中的`mytest.opene_cache`值映射到`MYTEST_G()`结构中的open_cache,类型为zend_long,默认值109,则可以这么定义: +```c +PHP_INI_BEGIN() + STD_PHP_INI_ENTRY("mytest.open_cache", "109", PHP_INI_ALL, OnUpdateLong, open_cache, zend_mytest_globals, mytest_globals) +PHP_INI_END(); +``` +property_name设置的是要映射到的结构成员`mytest_globals->open_cache`,zend_mytest_globals、mytest_globals都是宏展开后的实际值,前者是结构体类型,后者是具体分配的变量, + +上面的定义展开后: +```c +static const zend_ini_entry_def ini_entries[] = { + { + "mytest.open_cache", + OnUpdateLong, + (void *) XtOffsetOf(zend_mytest_globals, open_cache), //获取成员在结构体中的内存偏移 + (void*)&mytest_globals, + NULL, + "109", + NULL, + PHP_INI_ALL, + sizeof("mytest.open_cache")-1, + sizeof("109")-1 + }, + { NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, 0} +} +``` +> `XtOffsetOf()`这个宏在linux环境下展开就是`offsetof()`,用来获取一个结构体成员的offset,比如: +> +> #include +> #include +> +> typedef struct{ +> int id; +> char *name; +> }my_struct; +> +> int main(void) +> { +> printf("%d\n", (void*)offsetof(my_struct, name)); +> return 0; +> } + +> 通过这个offset及结构体指针就可以读取这个成员:`(char*)my_sutct + offset`,等价于`my_sutct->name`。 + + From 7f9e117307fce77c6dfd78d6ed7996a97c69fb12 Mon Sep 17 00:00:00 2001 From: pangudashu Date: Sun, 21 May 2017 17:16:39 +0800 Subject: [PATCH 260/379] update --- 7/conf.md | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/7/conf.md b/7/conf.md index 13a8341..03aa7c8 100644 --- a/7/conf.md +++ b/7/conf.md @@ -122,20 +122,20 @@ static const zend_ini_entry_def ini_entries[] = { ``` > `XtOffsetOf()`这个宏在linux环境下展开就是`offsetof()`,用来获取一个结构体成员的offset,比如: > -> #include -> #include +> #include +> #include > -> typedef struct{ -> int id; -> char *name; +> typedef struct{ +> int id; +> char *name; > }my_struct; > -> int main(void) -> { -> printf("%d\n", (void*)offsetof(my_struct, name)); -> return 0; +> int main(void) +> { +> printf("%d\n", (void*)offsetof(my_struct, name)); +> return 0; > } - +> > 通过这个offset及结构体指针就可以读取这个成员:`(char*)my_sutct + offset`,等价于`my_sutct->name`。 From c85b630b4ec2d6c2e24e87df0525990e6ec94aea Mon Sep 17 00:00:00 2001 From: pangudashu Date: Sun, 21 May 2017 17:19:03 +0800 Subject: [PATCH 261/379] update --- 7/conf.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/7/conf.md b/7/conf.md index 03aa7c8..3f5fb4d 100644 --- a/7/conf.md +++ b/7/conf.md @@ -126,14 +126,14 @@ static const zend_ini_entry_def ini_entries[] = { > #include > > typedef struct{ -> int id; -> char *name; +> int id; +> char *name; > }my_struct; > > int main(void) > { -> printf("%d\n", (void*)offsetof(my_struct, name)); -> return 0; +> printf("%d\n", (void*)offsetof(my_struct, name)); +> return 0; > } > > 通过这个offset及结构体指针就可以读取这个成员:`(char*)my_sutct + offset`,等价于`my_sutct->name`。 From 206154d220b14bb9fea052cd3d2681471049932d Mon Sep 17 00:00:00 2001 From: pangudashu Date: Sun, 21 May 2017 18:17:52 +0800 Subject: [PATCH 262/379] update --- 7/conf.md | 53 ++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 50 insertions(+), 3 deletions(-) diff --git a/7/conf.md b/7/conf.md index 3f5fb4d..0511f2a 100644 --- a/7/conf.md +++ b/7/conf.md @@ -100,9 +100,7 @@ PHP_INI_BEGIN() STD_PHP_INI_ENTRY("mytest.open_cache", "109", PHP_INI_ALL, OnUpdateLong, open_cache, zend_mytest_globals, mytest_globals) PHP_INI_END(); ``` -property_name设置的是要映射到的结构成员`mytest_globals->open_cache`,zend_mytest_globals、mytest_globals都是宏展开后的实际值,前者是结构体类型,后者是具体分配的变量, - -上面的定义展开后: +property_name设置的是要映射到的结构成员`mytest_globals->open_cache`,zend_mytest_globals、mytest_globals都是宏展开后的实际值,前者是结构体类型,后者是具体分配的变量,上面的定义展开后: ```c static const zend_ini_entry_def ini_entries[] = { { @@ -138,4 +136,53 @@ static const zend_ini_entry_def ini_entries[] = { > > 通过这个offset及结构体指针就可以读取这个成员:`(char*)my_sutct + offset`,等价于`my_sutct->name`。 +定义完上面的配置映射规则后就可以进行映射了,这一步通过`REGISTER_INI_ENTRIES()`完成,这个宏展开后:`zend_register_ini_entries(ini_entries, module_number)`,ini_entries是`PHP_INI_BEGIN/END()`两个宏生成的配置映射规则数组,通常会把这个操作放到`PHP_MINIT_FUNCTION()`中,注意:此时php.ini已经解析到`configuration_hash`哈希表中,`zend_register_ini_entries()`将根据配置name查找这个哈希表,如果找到了表明用户在php.ini中配置了该项,然后将调用此规则指定的on_modify函数进行赋值,比如上面的示例将调用`OnUpdateLong()`处理,整体的流程: +```c +ZEND_API int zend_register_ini_entries(const zend_ini_entry_def *ini_entry, int module_number) +{ + zend_ini_entry *p; + zval *default_value; + HashTable *directives = registered_zend_ini_directives; + + while (ini_entry->name) { + //分配zend_ini_entry结构 + p = pemalloc(sizeof(zend_ini_entry), 1); + //zend_ini_entry初始化 + ... + + //添加到registered_zend_ini_directives,EG(ini_directives)也是指向此HashTable + if (zend_hash_add_ptr(directives, p->name, (void*)p) == NULL) { + ... + } + //zend_get_configuration_directive()最终将调用cfg_get_entry() + //从configuration_hash哈希表中查找配置,如果没有找到将使用默认值 + default_value = zend_get_configuration_directive(p->name) + ... + if (p->on_modify) { + //调用定义的赋值handler处理 + p->on_modify(p, p->value, p->mh_arg1, p->mh_arg2, p->mh_arg3, ZEND_INI_STAGE_STARTUP); + } + } +} +``` +`OnUpdateLong()`赋值处理: +```c +ZEND_API ZEND_INI_MH(OnUpdateLong) +{ + zend_long *p; +#ifndef ZTS + //存储结构的指针 + char *base = (char *) mh_arg2; +#else + char *base; + //ZTS下需要向TSRM中获取存储结构的指针 + base = (char *) ts_resource(*((int *) mh_arg2)); +#endif + //指向结构体成员的位置 + p = (zend_long *) (base+(size_t) mh_arg1); + //将值转为zend_long + *p = zend_atol(ZSTR_VAL(new_value), (int)ZSTR_LEN(new_value)); + return SUCCESS; +} +``` From 2c92120be2741068e9402e1b6d689b00fa2980d1 Mon Sep 17 00:00:00 2001 From: pangudashu Date: Sun, 21 May 2017 20:54:31 +0800 Subject: [PATCH 263/379] update --- 7/conf.md | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++++-- README.md | 6 ++--- 2 files changed, 68 insertions(+), 5 deletions(-) diff --git a/7/conf.md b/7/conf.md index 0511f2a..7b46511 100644 --- a/7/conf.md +++ b/7/conf.md @@ -72,8 +72,8 @@ STD_PHP_INI_ENTRY(name,default_value,modifiable,on_modify,property_name,struct_t ``` * __name:__ php.ini中的配置标识符 * __default_value:__ 默认值,注意不管转化后是什么类型,这里必须设置为字符串 -* __modifiable:__ -* __on_modify:__ 函数指针,用于指定发现这个配置后赋值处理的函数,默认提供了5个:OnUpdateBool、OnUpdateLong、OnUpdateLongGEZero、OnUpdateReal、OnUpdateString、OnUpdateStringUnempty,如果满足不了需求可以自定义 +* __modifiable:__ 可修改等级,ZEND_INI_USER为可以在php脚本中修改,ZEND_INI_SYSTEM为可以在php.ini中修改,还有一个ZEND_INI_PERDIR,ZEND_INI_ALL表示三种都可以,通常情况下设置为ZEND_INI_ALL、ZEND_INI_SYSTEM即可 +* __on_modify:__ 函数指针,用于指定发现这个配置后赋值处理的函数,默认提供了5个:OnUpdateBool、OnUpdateLong、OnUpdateLongGEZero、OnUpdateReal、OnUpdateString、OnUpdateStringUnempty,支持可以自定义 * __property_name:__ 要映射到的结构struct_type中的成员 * __struct_type:__ 映射结构的类型 * __struct_ptr:__ 映射结构的变量地址,发现配置后会 @@ -186,3 +186,66 @@ ZEND_API ZEND_INI_MH(OnUpdateLong) return SUCCESS; } ``` +如果PHP提供的几个on_modify不能满足需求可以自定义on_modify函数,举个例子:将php.ini中的配置`mytest.class`插入MYTESY_G(class_table)哈希表,则可以在扩展中定义这样一个on_modify:`ZEND_INI_MH(OnUpdateAddArray)`,将php.ini映射到全局变量的完整代码: +```c +//php_mytest.h +#define MYTEST_G(v) ZEND_MODULE_GLOBALS_ACCESSOR(mytest, v) + +ZEND_BEGIN_MODULE_GLOBALS(mytest) + zend_long open_cache; + HashTable class_table; +ZEND_END_MODULE_GLOBALS(mytest) + +//自定义on_modify函数 +ZEND_API ZEND_INI_MH(OnUpdateAddArray); +``` +``` +//mytest.c +ZEND_DECLARE_MODULE_GLOBALS(mytest) + +PHP_INI_BEGIN() + STD_PHP_INI_ENTRY("mytest.open_cache", "109", PHP_INI_ALL, OnUpdateLong, open_cache, zend_mytest_globals, mytest_globals) + STD_PHP_INI_ENTRY("mytest.class", "stdClass", PHP_INI_ALL, OnUpdateAddArray, class_table, zend_mytest_globals, mytest_globals) +PHP_INI_END(); + +ZEND_API ZEND_INI_MH(OnUpdateAddArray) +{ + HashTable *ht; + zval val; +#ifndef ZTS + char *base = (char *) mh_arg2; +#else + char *base; + base = (char *) ts_resource(*((int *) mh_arg2)); +#endif + + ht = (HashTable*)(base+(size_t) mh_arg1); + ZVAL_NULL(&val); + zend_hash_add(ht, new_value, &val); +} + +PHP_MINIT_FUNCTION(mytest) +{ + zend_hash_init(&MYTEST_G(class_table), 0, NULL, NULL, 1); + //将php.ini解析到指定结构体 + REGISTER_INI_ENTRIES(); + + printf("open_cache %d\n", MYTEST_G(open_cache)); +} + +zend_module_entry mytest_module_entry = { + STANDARD_MODULE_HEADER, + "mytest", + NULL,//mytest_functions, + PHP_MINIT(mytest), + NULL,//PHP_MSHUTDOWN(mytest), + NULL,//PHP_RINIT(mytest), + NULL,//PHP_RSHUTDOWN(mytest), + NULL,//PHP_MINFO(mytest), + "1.0.0", + STANDARD_MODULE_PROPERTIES +}; + +ZEND_GET_MODULE(mytest) +``` + diff --git a/README.md b/README.md index 698bf29..2aaa720 100644 --- a/README.md +++ b/README.md @@ -57,9 +57,9 @@ * [7.3.3 编写扩展的基本步骤](7/extension_intro.md) * [7.3.4 config.m4](7/extension_intro.md) * [7.4 钩子函数](7/hook.md) - * 7.5 扩展配置 - * 7.5.1 全局变量 - * 7.5.2 ini配置 + * [7.5 运行时配置](7/conf.md) + * [7.5.1 全局变量](7/conf.md) + * [7.5.2 ini配置](7/conf.md) * 7.7 变量的操作 * 7.8 函数的操作 * 7.5.1 扩展中调用自定义函数 From d3c0e039438bc398f7d9041333c4bc75fa46f7d8 Mon Sep 17 00:00:00 2001 From: pangudashu Date: Sun, 21 May 2017 20:56:35 +0800 Subject: [PATCH 264/379] update --- 7/conf.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/7/conf.md b/7/conf.md index 7b46511..8104a9a 100644 --- a/7/conf.md +++ b/7/conf.md @@ -199,7 +199,7 @@ ZEND_END_MODULE_GLOBALS(mytest) //自定义on_modify函数 ZEND_API ZEND_INI_MH(OnUpdateAddArray); ``` -``` +```c //mytest.c ZEND_DECLARE_MODULE_GLOBALS(mytest) @@ -246,6 +246,11 @@ zend_module_entry mytest_module_entry = { STANDARD_MODULE_PROPERTIES }; +#ifdef COMPILE_DL_TIMEOUT +#ifdef ZTS +ZEND_TSRMLS_CACHE_DEFINE() +#endif ZEND_GET_MODULE(mytest) +#endif ``` From ac71ec23f94e3db83cd27e3214ceab6afb4c234e Mon Sep 17 00:00:00 2001 From: pangudashu Date: Sun, 21 May 2017 20:59:24 +0800 Subject: [PATCH 265/379] update --- 7/conf.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/7/conf.md b/7/conf.md index 8104a9a..e3c007b 100644 --- a/7/conf.md +++ b/7/conf.md @@ -78,6 +78,8 @@ STD_PHP_INI_ENTRY(name,default_value,modifiable,on_modify,property_name,struct_t * __struct_type:__ 映射结构的类型 * __struct_ptr:__ 映射结构的变量地址,发现配置后会 +> 除了STD_PHP_INI_ENTRY()这个宏还有一个类似的宏`STD_PHP_INI_BOOLEAN()`,用法一致,差别在于后者会自动把配置添加到phpinfo()输出中。 + 这个宏展开后生成一个`zend_ini_entry_def`结构: ```c typedef struct _zend_ini_entry_def { From ddc0528b606faa75b2d68a39c1b089495cb1316a Mon Sep 17 00:00:00 2001 From: pangudashu Date: Sun, 21 May 2017 21:10:02 +0800 Subject: [PATCH 266/379] update --- 7/conf.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/7/conf.md b/7/conf.md index e3c007b..5d070af 100644 --- a/7/conf.md +++ b/7/conf.md @@ -255,4 +255,8 @@ ZEND_TSRMLS_CACHE_DEFINE() ZEND_GET_MODULE(mytest) #endif ``` +### 7.5.3 小节 +本节我们主要介绍了线程安全的全局变量的使用以及如何将php.ini配置项解析到C语言变量中,使用时主要分为两步: +* __定义解析规则:__ 通过PHP_INI_BEGIN()、PHP_INI_END()、STD_PHP_INI_ENTRY()配置 +* __执行规则映射:__ 由REGISTER_INI_ENTRIES()来完成,这个操作之后解析目的变量就可以使用了 From f40a35a4500e3e889648663246ea71fdaf00b90a Mon Sep 17 00:00:00 2001 From: pangudashu Date: Sun, 21 May 2017 21:11:20 +0800 Subject: [PATCH 267/379] finish php.ini --- 7/conf.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/7/conf.md b/7/conf.md index 5d070af..9808276 100644 --- a/7/conf.md +++ b/7/conf.md @@ -255,8 +255,7 @@ ZEND_TSRMLS_CACHE_DEFINE() ZEND_GET_MODULE(mytest) #endif ``` -### 7.5.3 小节 -本节我们主要介绍了线程安全的全局变量的使用以及如何将php.ini配置项解析到C语言变量中,使用时主要分为两步: +本节主要介绍了如何将php.ini配置项解析到C语言变量中,总结下主要分为两步: * __定义解析规则:__ 通过PHP_INI_BEGIN()、PHP_INI_END()、STD_PHP_INI_ENTRY()配置 * __执行规则映射:__ 由REGISTER_INI_ENTRIES()来完成,这个操作之后解析目的变量就可以使用了 From 9c7c45d0ec649164830f3fb6ec4f82ce1f0b72e5 Mon Sep 17 00:00:00 2001 From: pangudashu Date: Sun, 21 May 2017 21:15:09 +0800 Subject: [PATCH 268/379] update --- 7/conf.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/7/conf.md b/7/conf.md index 9808276..9ae5975 100644 --- a/7/conf.md +++ b/7/conf.md @@ -34,7 +34,7 @@ zend_mytest_globals mytest_globals; 看起来是不是跟EG、CG的定义非常像?这个宏展开后: ```c //ZTS -#define MYTEST_G(v) ZEND_TSRMG(mytest_globals_id, zend_##module_name##_globals *, v) +#define MYTEST_G(v) ZEND_TSRMG(mytest_globals_id, zend_mytest_globals *, v) //非ZTS #define MYTEST_G(v) (mytest_globals.v) From be427c20e283e36ea030ecee8e88cdbaacd612cc Mon Sep 17 00:00:00 2001 From: qinpeng Date: Mon, 22 May 2017 10:21:17 +0800 Subject: [PATCH 269/379] add func --- 7/func.md | 103 +++++++++++++++++++++ README.md | 6 +- 7/execute_timeout.md => execute_timeout.md | 0 3 files changed, 106 insertions(+), 3 deletions(-) create mode 100644 7/func.md rename 7/execute_timeout.md => execute_timeout.md (100%) diff --git a/7/func.md b/7/func.md new file mode 100644 index 0000000..5e85966 --- /dev/null +++ b/7/func.md @@ -0,0 +1,103 @@ +## 7.6 函数 + +### 7.6.1 内部函数 +通过扩展可以将C语言实现的函数提供给PHP脚本使用,如同大量PHP内置函数一样,这些函数统称为内部函数(internal function),与PHP脚本中定义的用户函数不同,它们无需经历用户函数的编译过程,同时执行时也不像用户函数那样每一个指令都调用一次C语言编写的handler函数,因此,内部函数的执行效率更高。除了性能上的优势,内部函数还可以拥有更高的控制权限,可发挥的作用也更大,能够完成很多用户函数无法实现的功能。 + +#### 7.6.1.1 内部函数的定义 +前面介绍PHP函数的编译时曾经详细介绍过PHP函数的实现,函数通过`zend_function`来表示,这是一个联合体,用户函数使用`zend_function.op_array`,内部函数使用`zend_function.internal_function`,两者具有相同的头部用来记录函数的基本信息。不管是用户函数还是内部函数,其最终都被注册到EG(function_table)中,函数被调用时根据函数名称向这个符号表中查找。从内部函数的注册、使用过程可以看出,其定义实际非常简单,我们只需要定义一个`zend_internal_function`结构,然后注册到EG(function_table)中即可,接下来再重新看下内部函数的结构: +```c +typedef struct _zend_internal_function { + /* Common elements */ + zend_uchar type; + zend_uchar arg_flags[3]; /* bitset of arg_info.pass_by_reference */ + uint32_t fn_flags; + zend_string* function_name; + zend_class_entry *scope; + zend_function *prototype; + uint32_t num_args; + uint32_t required_num_args; + zend_internal_arg_info *arg_info; + /* END of common elements */ + + void (*handler)(INTERNAL_FUNCTION_PARAMETERS); //函数指针,展开:void (*handler)(zend_execute_data *execute_data, zval *return_value) + struct _zend_module_entry *module; + void *reserved[ZEND_MAX_RESERVED_RESOURCES]; +} zend_internal_function; +``` +Common elements就是与用户函数相同的头部,用来记录函数的基本信息:函数类型、参数信息、函数名等,handler是此内部函数的具体实现,PHP提供了一个宏用于此handler的定义:`PHP_FUNCTION(function_name)`或`ZEND_FUNCTION()`,展开后: +```c +void (*handler)(zend_execute_data *execute_data, zval *return_value) +``` +也就是内部函数会得到两个参数:execute_data、return_value,execute_data不用再说了,return_value是函数的返回值,这两个值在扩展中会经常用到。 + +比如要在扩展中定义两个函数:my_func_1()、my_func_2(),首先是编写函数: +```c +PHP_FUNCTION(my_func_1) +{ + printf("Hello, I'm my_func_1\n"); +} + +PHP_FUNCTION(my_func_2) +{ + printf("Hello, I'm my_func_2\n"); +} +``` +函数定义完了就需要向PHP注册了,这里并不需要扩展自己注册,PHP提供了一个内部函数注册结构:zend_function_entry,扩展只需要为每个内部函数生成这样一个结构,然后把它们保存到扩展`zend_module_entry.functions`即可,在加载扩展中会自动向EG(function_table)注册。 +```c +typedef struct _zend_function_entry { + const char *fname; //函数名称 + void (*handler)(INTERNAL_FUNCTION_PARAMETERS); //handler实现 + const struct _zend_internal_arg_info *arg_info;//参数信息 + uint32_t num_args; //参数数目 + uint32_t flags; +} zend_function_entry; +``` +zend_function_entry结构可以通过`PHP_FE()`或`ZEND_FE()`定义: +```c +const zend_function_entry mytest_functions[] = { + PHP_FE(my_func_1, NULL) + PHP_FE(my_func_2, NULL) + PHP_FE_END //末尾必须加这个 +}; +``` +这几个宏的定义为: +```c +#define ZEND_FE(name, arg_info) ZEND_FENTRY(name, ZEND_FN(name), arg_info, 0) +#define ZEND_FENTRY(zend_name, name, arg_info, flags) { #zend_name, name, arg_info, (uint32_t) (sizeof(arg_info)/sizeof(struct _zend_internal_arg_info)-1), flags }, +#define ZEND_FN(name) zif_##name +``` +内部函数的名称前加了`zif_`前缀,以防与内核中的函数冲突,所以如果想用gdb调试扩展定义的函数记得加上这个前缀。最后将`zend_module_entry.functions`设置为`timeout_functions`即可: +```c +zend_module_entry mytest_module_entry = { + STANDARD_MODULE_HEADER, + "mytest", + mytest_functions, + NULL, //PHP_MINIT(mytest), + NULL, //PHP_MSHUTDOWN(mytest), + NULL, //PHP_RINIT(mytest), + NULL, //PHP_RSHUTDOWN(mytest), + NULL, //PHP_MINFO(mytest), + "1.0.0", + STANDARD_MODULE_PROPERTIES +}; +``` +下面来测试下这两个函数能否使用,编译安装后在PHP脚本中调用这两个函数: +```php +//test.php +my_func_1(); +my_func_2(); +``` +cli模式下执行`php test.php`将输出: +``` +Hello, I'm my_func_1 +Hello, I'm my_func_2 +``` +大功告成,函数已经能够正常工作了,后续的工作就是不断完善handler实现扩展自己的功能了。 + +#### 7.6.1.2 函数参数 + +#### 7.6.1.3 函数返回值 + +### 7.6.2 调用用户函数 + + diff --git a/README.md b/README.md index 2aaa720..50f7eac 100644 --- a/README.md +++ b/README.md @@ -60,10 +60,10 @@ * [7.5 运行时配置](7/conf.md) * [7.5.1 全局变量](7/conf.md) * [7.5.2 ini配置](7/conf.md) + * 7.6 函数 + * [7.6.1 内部函数](7/func.md) + * 7.6.2 调用用户函数 * 7.7 变量的操作 - * 7.8 函数的操作 - * 7.5.1 扩展中调用自定义函数 - * 7.5.2 创建内部函数 * 7.9 面向对象 * 7.6.1 扩展中创建对象 * 7.6.2 创建内部类 diff --git a/7/execute_timeout.md b/execute_timeout.md similarity index 100% rename from 7/execute_timeout.md rename to execute_timeout.md From fdc34c3be149c0fe1f361476b9f8bc567cdbd54e Mon Sep 17 00:00:00 2001 From: qinpeng Date: Wed, 24 May 2017 09:29:45 +0800 Subject: [PATCH 270/379] update class --- 3/zend_class.md | 2 ++ 3/zend_object.md | 6 +++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/3/zend_class.md b/3/zend_class.md index 4079dbd..9fd2016 100644 --- a/3/zend_class.md +++ b/3/zend_class.md @@ -88,6 +88,8 @@ struct _zend_class_entry { } info; } ``` +> create_object为实例化对象的操作,可以通过扩展自定义这个函数 + 举个例子具体看下,定义一个User类,它继承了Human类,User类中有一个常量、一个静态属性、两个普通属性: ```php //父类 diff --git a/3/zend_object.md b/3/zend_object.md index e5e83e5..cf44ef7 100644 --- a/3/zend_object.md +++ b/3/zend_object.md @@ -10,7 +10,7 @@ struct _zend_object { zend_refcounted_h gc; //引用计数 uint32_t handle; zend_class_entry *ce; //所属类 - const zend_object_handlers *handlers; //对象的一些操作接口 + const zend_object_handlers *handlers; //对象操作处理函数 HashTable *properties; zval properties_table[1]; //普通属性值数组 }; @@ -67,6 +67,10 @@ ZEND_API zend_object_handlers std_object_handlers = { NULL, /* compare */ } ``` +> __Note:__ 这些handler用于操作对象(如:设置、读取属性),std_object_handlers是PHP定义的默认、标准的处理函数,在扩展中可以自定义handler,比如:重定义write_property,这样设置一个对象的属性时将调用扩展自己定义的处理函数,让扩展拥有了更高的控制权限。 +> +> 需要注意的是:const zend_object_handlers *handlers,这里的handlers指针加了const修饰符,const修饰的是handlers**指向的对象**,而不是handlers指针本身,所以扩展中可以将一个对象的handlers修改为另一个zend_object_handlers指针,但无法修改zend_object_handlers中的值,比如:`obj->handlers->write_property = xxx`将报错,而:`obj->handlers = xxx`则是可以的。 + __(4)properties:__ 普通成员属性哈希表,对象创建之初这个值为NULL,主要是在动态定义属性时会用到,与properties_table有一定关系,下一节我们将单独说明,这里暂时忽略。 __(5)properties_table:__ 成员属性数组,还记得我们在介绍类一节时提过非静态属性存储在对象结构中吗?就是这个properties_table!注意,它是一个数组,`zend_object`是个变长结构体,分配时会根据非静态属性的数量确定其大小。 From 2bd01a15e9b3bdfab00c5c52ee7ccc20bac3018b Mon Sep 17 00:00:00 2001 From: qinpeng Date: Wed, 24 May 2017 09:44:30 +0800 Subject: [PATCH 271/379] update --- 3/zend_class.md | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/3/zend_class.md b/3/zend_class.md index 9fd2016..e0bc8f5 100644 --- a/3/zend_class.md +++ b/3/zend_class.md @@ -88,8 +88,19 @@ struct _zend_class_entry { } info; } ``` -> create_object为实例化对象的操作,可以通过扩展自定义这个函数 +create_object为实例化对象的操作,可以通过扩展自定义一个函数来接管实例化对象的操作,没有定义这个函数的话将由默认的`zend_objects_new()`处理,自定义时可以参考这个函数的实现: +```c +//注意:此操作并没有将属性拷贝到zend_object中:由object_properties_init()完成 +ZEND_API zend_object *zend_objects_new(zend_class_entry *ce) +{ + zend_object *object = emalloc(sizeof(zend_object) + zend_object_properties_size(ce)); + zend_object_std_init(object, ce); + //设置对象操作的handler + object->handlers = &std_object_handlers; + return object; +} +``` 举个例子具体看下,定义一个User类,它继承了Human类,User类中有一个常量、一个静态属性、两个普通属性: ```php //父类 From 4c45985df06b79446199cd847b9abbd4eba458a0 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Wed, 24 May 2017 11:52:17 +0800 Subject: [PATCH 272/379] update --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 50f7eac..717c6ad 100644 --- a/README.md +++ b/README.md @@ -74,6 +74,6 @@ * 7.8.3 Memcached ## 反馈 -[交流&吐槽](https://github.com/pangudashu/php7-internal/issues/3) [错误反馈](https://github.com/pangudashu/php7-internal/issues/2) +[交流&吐槽](https://github.com/pangudashu/php7-internal/issues/7) [错误反馈](https://github.com/pangudashu/php7-internal/issues/2) From 517b366ebf2ab01c9fe541fab2ed6b5a50b9f0d2 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Wed, 24 May 2017 11:53:26 +0800 Subject: [PATCH 273/379] update --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 717c6ad..50f7eac 100644 --- a/README.md +++ b/README.md @@ -74,6 +74,6 @@ * 7.8.3 Memcached ## 反馈 -[交流&吐槽](https://github.com/pangudashu/php7-internal/issues/7) [错误反馈](https://github.com/pangudashu/php7-internal/issues/2) +[交流&吐槽](https://github.com/pangudashu/php7-internal/issues/3) [错误反馈](https://github.com/pangudashu/php7-internal/issues/2) From 1dddf7b3579771453be26b537c0d7b1ce2602914 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Wed, 24 May 2017 17:23:54 +0800 Subject: [PATCH 274/379] update --- 3/function_implement.md | 38 +++++++++++++++++++++++++++++++++++--- 1 file changed, 35 insertions(+), 3 deletions(-) diff --git a/3/function_implement.md b/3/function_implement.md index 4458dec..047a593 100644 --- a/3/function_implement.md +++ b/3/function_implement.md @@ -88,16 +88,48 @@ function my_function(){ 另外参数还有其它的信息,比如默认值、引用传递,这些信息通过`zend_arg_info`结构记录: ```c typedef struct _zend_arg_info { - zend_string *name; //函数名 + zend_string *name; //参数名 zend_string *class_name; zend_uchar type_hint; //显式声明的参数类型,比如(array $param_1) zend_uchar pass_by_reference; //是否引用传参,参数前加&的这个值就是1 - zend_bool allow_null; //是否允许为空 + zend_bool allow_null; //是否允许为NULL,注意:这个值并不是用来表示参数是否为必传的 zend_bool is_variadic; //是否为可变参数,即...用法,与golang的用法相同,5.6以上新增的一个用法 } zend_arg_info; ``` -每个参数都有一个上面的结构,所有参数的结构保存在`zend_op_array.arg_info`数组中。 +每个参数都有一个上面的结构,所有参数的结构保存在`zend_op_array.arg_info`数组中,这里有一个地方需要注意:`zend_op_array->arg_info`数组保存的并不全是输入参数,如果函数声明了返回值类型则也会为它创建一个`zend_arg_info`,这个结构在arg_info数组的第一个位置,这种情况下`zend_op_array->arg_info`指向的实际是数组的第二个位置,返回值的结构通过`zend_op_array->arg_info[-1]`读取,编译时的处理具体如下。 +```c +//函数参数的编译 +void zend_compile_params(zend_ast *ast, zend_ast *return_type_ast) +{ + zend_ast_list *list = zend_ast_get_list(ast); + uint32_t i; + zend_op_array *op_array = CG(active_op_array); + zend_arg_info *arg_infos; + + if (return_type_ast) { + //声明了返回值类型:function my_func():array{...} + //多分配一个zend_arg_info + arg_infos = safe_emalloc(sizeof(zend_arg_info), list->children + 1, 0); + ... + arg_infos->allow_null = 0; + ... + //arg_infos指向了下一个位置 + arg_infos++; + op_array->fn_flags |= ZEND_ACC_HAS_RETURN_TYPE; + } else { + //没有声明返回值类型 + if (list->children == 0) { + return; + } + arg_infos = safe_emalloc(sizeof(zend_arg_info), list->children, 0); + } + ... + op_array->num_args = list->children; + //声明了返回值的情况下arg_infos已经指向了数组的第二个元素 + op_array->arg_info = arg_infos; +} +``` #### 3.2.1.3 函数的编译 我们在上一篇文章介绍过PHP代码的编译过程,主要是PHP->AST->Opcodes的转化,上面也说了函数其实就是将一组PHP代码编译为单独的opcodes,函数的调用就是不同opcodes间的切换,所以函数的编译过程与普通PHP代码基本一致,只是会有一些特殊操作,我们以3.2.1.2开始那个例子简单看下编译过程。 From 6bb03a4d67c6767194e4486697c7baf2d3b3f3db Mon Sep 17 00:00:00 2001 From: qinpeng Date: Wed, 24 May 2017 17:25:55 +0800 Subject: [PATCH 275/379] update --- 3/function_implement.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/3/function_implement.md b/3/function_implement.md index 047a593..e8e83e0 100644 --- a/3/function_implement.md +++ b/3/function_implement.md @@ -96,7 +96,7 @@ typedef struct _zend_arg_info { zend_bool is_variadic; //是否为可变参数,即...用法,与golang的用法相同,5.6以上新增的一个用法 } zend_arg_info; ``` -每个参数都有一个上面的结构,所有参数的结构保存在`zend_op_array.arg_info`数组中,这里有一个地方需要注意:`zend_op_array->arg_info`数组保存的并不全是输入参数,如果函数声明了返回值类型则也会为它创建一个`zend_arg_info`,这个结构在arg_info数组的第一个位置,这种情况下`zend_op_array->arg_info`指向的实际是数组的第二个位置,返回值的结构通过`zend_op_array->arg_info[-1]`读取,编译时的处理具体如下。 +每个参数都有一个上面的结构,所有参数的结构保存在`zend_op_array.arg_info`数组中,这里有一个地方需要注意:`zend_op_array->arg_info`数组保存的并不全是输入参数,如果函数声明了返回值类型则也会为它创建一个`zend_arg_info`,这个结构在arg_info数组的第一个位置,这种情况下`zend_op_array->arg_info`指向的实际是数组的第二个位置,返回值的结构通过`zend_op_array->arg_info[-1]`读取,这里先单独看下编译时的处理: ```c //函数参数的编译 void zend_compile_params(zend_ast *ast, zend_ast *return_type_ast) @@ -224,7 +224,7 @@ $c = 345; //编译到zend_op_array_1 >> __操作2:__ 每个参数生成一条opcode,如果是可变参数其opcode=ZEND_RECV_VARIADIC,如果有默认值则为ZEND_RECV_INIT,否则为ZEND_RECV -> 上面的例子中$a编号为96,$b为112,同时生成了两条opcode:ZEND_RECV、ZEND_RECV_INIT,调用的时候会根据具体传参数量跳过部分opcode,比如这个函数我们这么调用`my_function($a)`则ZEND_RECV这条opcode就直接跳过了,然后执行ZEND_RECV_INIT将默认值写到112位置,具体的编译过程在`zend_compile_params()`中,这里不再展开。 +> 上面的例子中$a编号为96,$b为112,同时生成了两条opcode:ZEND_RECV、ZEND_RECV_INIT,调用的时候会根据具体传参数量跳过部分opcode,比如这个函数我们这么调用`my_function($a)`则ZEND_RECV这条opcode就直接跳过了,然后执行ZEND_RECV_INIT将默认值写到112位置,具体的编译过程在`zend_compile_params()`中,上面已经介绍过。 > __(3)__ 编译函数内部语法,这个跟普通PHP代码编译过程无异。 From c4a135e4984f19f5aeef813f36c8538c1fe050d2 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Wed, 24 May 2017 20:06:30 +0800 Subject: [PATCH 276/379] update --- 7/func.md | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/7/func.md b/7/func.md index 5e85966..a1d3a30 100644 --- a/7/func.md +++ b/7/func.md @@ -95,6 +95,34 @@ Hello, I'm my_func_2 大功告成,函数已经能够正常工作了,后续的工作就是不断完善handler实现扩展自己的功能了。 #### 7.6.1.2 函数参数 +上面我们定义的函数没有接收任何参数,那么扩展定义的内部函数如何读取参数呢?首先回顾下函数参数的实现:用户自定义函数在编译时会为每个参数创建一个`zend_arg_info`结构,这个结构用来记录参数的名称、是否引用传参、是否为可变参数等,在存储上函数参数与局部变量相同,都分配在zend_execute_data上,且最先分配的就是函数参数,调用函数时首先会进行参数传递,按参数次序依次将参数的value从调用空间传递到被调函数的zend_execute_data,函数内部像访问普通局部变量一样通过存储位置访问参数,这是用户自定义函数的参数实现。 + +内部函数与用户自定义函数最大的不同在于内部函数就是一个普通的C函数,除函数参数以外在zend_execute_data上没有其他变量的分配,函数参数是从PHP用户空间传到函数的,它们与用户自定义函数完全相同,包括参数的分配方式、传参过程,也是按照参数次序依次分配在zend_execute_data上,所以在扩展中定义的函数直接按照顺序从zend_execute_data上读取对应的值即可,PHP中通过`zend_parse_parameters()`这个函数解析zend_execute_data上保存的参数: +```c +zend_parse_parameters(int num_args, const char *type_spec, ...); +``` +num_args为实际传参数,通过`ZEND_NUM_ARGS()`获取;type_spec是一个字符串,用来标识解析参数的类型,比如:"la"表示第一个参数为整形,第二个为数组,将按照这个解析到指定变量;后面是一个可变参数,用来指定解析到的变量,这个值与type_spec配合使用,即type_spec用来指定解析的变量类型,可变参数用来指定要解析到的变量,这个值必须是指针。 + +解析的过程也比较容易理解,因为传给函数的参数已经保存到zend_execute_data上了,所以解析的过程就是按照type_spec指定的各个类型,依次从zend_execute_data上获取参数的value,然后保存到解析到的地址上,比如: +```c +PHP_FUNCTION(my_func_1) +{ + zend_long lval; + zval *arr; + + if(zend_parse_parameters(ZEND_NUM_ARGS(), "la", &lval, &arr) == FAILURE){ + RETURN_FALSE; + } + ... +} +``` +对应的内存关系: + +![](../img/interal_func_param.png) + + + +内部函数与用户自定义函数的参数均分配在zend_execute_data上。 #### 7.6.1.3 函数返回值 From d777c90f165044460223eb9ba8a520149db44446 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Wed, 24 May 2017 20:06:56 +0800 Subject: [PATCH 277/379] update --- 3/function_implement.md | 6 ++++-- img/func_exe_call.png | Bin 27899 -> 27553 bytes img/func_exe_init.png | Bin 37323 -> 35012 bytes img/internal_func_param.png | Bin 0 -> 27592 bytes 4 files changed, 4 insertions(+), 2 deletions(-) create mode 100644 img/internal_func_param.png diff --git a/3/function_implement.md b/3/function_implement.md index e8e83e0..921ad01 100644 --- a/3/function_implement.md +++ b/3/function_implement.md @@ -85,7 +85,7 @@ function my_function(){ return $ret; } ``` -另外参数还有其它的信息,比如默认值、引用传递,这些信息通过`zend_arg_info`结构记录: +另外参数还有其它的信息,这些信息通过`zend_arg_info`结构记录: ```c typedef struct _zend_arg_info { zend_string *name; //参数名 @@ -225,7 +225,9 @@ $c = 345; //编译到zend_op_array_1 >> __操作2:__ 每个参数生成一条opcode,如果是可变参数其opcode=ZEND_RECV_VARIADIC,如果有默认值则为ZEND_RECV_INIT,否则为ZEND_RECV > 上面的例子中$a编号为96,$b为112,同时生成了两条opcode:ZEND_RECV、ZEND_RECV_INIT,调用的时候会根据具体传参数量跳过部分opcode,比如这个函数我们这么调用`my_function($a)`则ZEND_RECV这条opcode就直接跳过了,然后执行ZEND_RECV_INIT将默认值写到112位置,具体的编译过程在`zend_compile_params()`中,上面已经介绍过。 - +> +> 参数默认值的保存与普通变量赋值相同:`$a = array()`,`array()`保存在literals,参数的默认值也是如此。 +> > __(3)__ 编译函数内部语法,这个跟普通PHP代码编译过程无异。 > __(4)__ pass_two(),上一篇介绍过,不再赘述。 diff --git a/img/func_exe_call.png b/img/func_exe_call.png index 9980c3aea696ae3757063f504a8d6bd8215d0a17..f812ab8b09eb4f89cc12dbe99f043fa6d5ff80b3 100644 GIT binary patch literal 27553 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 Ml(m&A6du0#Kgzf?UjP6A literal 27899 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

+HN!_`T=1CZS%w!WEoZ^dTt{ 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 literal 37323 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 K=Mk^m`hNh^NtJ*A diff --git a/img/internal_func_param.png b/img/internal_func_param.png new file mode 100644 index 0000000000000000000000000000000000000000..36fa4cc40c932abce05e3cbf11735aa2f0af2572 GIT binary patch literal 27592 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 PHk?1JdM1}_bpO8q>}8`Y literal 0 HcmV?d00001 From a7f28c02e2c47ade05540aad03784814527756f2 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Wed, 24 May 2017 20:16:09 +0800 Subject: [PATCH 278/379] update --- 7/func.md | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/7/func.md b/7/func.md index a1d3a30..ffe0a84 100644 --- a/7/func.md +++ b/7/func.md @@ -118,11 +118,21 @@ PHP_FUNCTION(my_func_1) ``` 对应的内存关系: -![](../img/interal_func_param.png) +![](../img/internal_func_param.png) +注意:解析时除了整形、浮点型、布尔型和NULL是直接硬拷贝value外,其它解析到的变量只能是指针,arr为zend_execute_data上param_1的地址,即:`arr = ¶m_1`,所以图中arr、param_1之间用的不是箭头指向,也就是说参数始终存储在zend_execute_data上,内部函数要用只能从zend_execute_data上取。接下来详细介绍下`zend_parse_parameters()`不同类型的解析用法。 +(1)整形、浮点型、布尔型、NULL -内部函数与用户自定义函数的参数均分配在zend_execute_data上。 +(2)数组 + +(3)对象 + +(4)资源 + +(5)字符串 + +(6)其它标识符 #### 7.6.1.3 函数返回值 From 8ca6e50c9c18af979fdac9a8bc53662130b4bf9a Mon Sep 17 00:00:00 2001 From: qinpeng Date: Thu, 25 May 2017 18:02:13 +0800 Subject: [PATCH 279/379] update --- 7/func.md | 162 ++++++++++++++++++++++++++++++++++-- img/internal_func_param.png | Bin 27592 -> 29284 bytes 2 files changed, 155 insertions(+), 7 deletions(-) diff --git a/7/func.md b/7/func.md index ffe0a84..276134c 100644 --- a/7/func.md +++ b/7/func.md @@ -94,7 +94,7 @@ Hello, I'm my_func_2 ``` 大功告成,函数已经能够正常工作了,后续的工作就是不断完善handler实现扩展自己的功能了。 -#### 7.6.1.2 函数参数 +#### 7.6.1.2 函数参数解析 上面我们定义的函数没有接收任何参数,那么扩展定义的内部函数如何读取参数呢?首先回顾下函数参数的实现:用户自定义函数在编译时会为每个参数创建一个`zend_arg_info`结构,这个结构用来记录参数的名称、是否引用传参、是否为可变参数等,在存储上函数参数与局部变量相同,都分配在zend_execute_data上,且最先分配的就是函数参数,调用函数时首先会进行参数传递,按参数次序依次将参数的value从调用空间传递到被调函数的zend_execute_data,函数内部像访问普通局部变量一样通过存储位置访问参数,这是用户自定义函数的参数实现。 内部函数与用户自定义函数最大的不同在于内部函数就是一个普通的C函数,除函数参数以外在zend_execute_data上没有其他变量的分配,函数参数是从PHP用户空间传到函数的,它们与用户自定义函数完全相同,包括参数的分配方式、传参过程,也是按照参数次序依次分配在zend_execute_data上,所以在扩展中定义的函数直接按照顺序从zend_execute_data上读取对应的值即可,PHP中通过`zend_parse_parameters()`这个函数解析zend_execute_data上保存的参数: @@ -122,17 +122,165 @@ PHP_FUNCTION(my_func_1) 注意:解析时除了整形、浮点型、布尔型和NULL是直接硬拷贝value外,其它解析到的变量只能是指针,arr为zend_execute_data上param_1的地址,即:`arr = ¶m_1`,所以图中arr、param_1之间用的不是箭头指向,也就是说参数始终存储在zend_execute_data上,内部函数要用只能从zend_execute_data上取。接下来详细介绍下`zend_parse_parameters()`不同类型的解析用法。 -(1)整形、浮点型、布尔型、NULL +__(1)整形:l、L__ -(2)数组 +整形通过"l"、"L"标识,表示解析的参数为整形,解析到的变量类型必须是`zend_long`,不能解析其它类型,如果输入的参数不是整形将按照类型转换规则将其转为整形: +```c +zend_long lval; + +if(zend_parse_parameters(ZEND_NUM_ARGS(), "l", &lval){ + ... +} +printf("lval:%d\n", lval); +``` +如果在标识符后加"!",即:"l!"、"L!",则必须再提供一个zend_bool变量的地址,通过这个值可以判断传入的参数是否为NULL,如果为NULL则将要解析到的zend_long值设置为0,同时zend_bool设置为1: +```c +zend_long lval; //如果参数为NULL则此值被设为0 +zend_bool is_null; //如果参数为NULL则此值为1,否则为0 + +if(zend_parse_parameters(ZEND_NUM_ARGS(), "l!", &lval, &is_null){ + ... +} +``` +具体的解析过程: +```c +//zend_API.c #line:519 +case 'l': +case 'L': +{ + //这里获取解析到的变量地址取的是zend_long *,所以只能解析到zend_long + zend_long *p = va_arg(*va, zend_long *); + zend_bool *is_null = NULL; + + //后面加"!"时check_null为1 + if (check_null) { + is_null = va_arg(*va, zend_bool *); + } + + if (!zend_parse_arg_long(arg, p, is_null, check_null, c == 'L')) { + return "integer"; + } +} +``` +```c +static zend_always_inline int zend_parse_arg_long(zval *arg, zend_long *dest, zend_bool *is_null, int check_null, int cap) +{ + if (check_null) { + *is_null = 0; + } + if (EXPECTED(Z_TYPE_P(arg) == IS_LONG)) { + //传参为整形,无需转化 + *dest = Z_LVAL_P(arg); + } else if (check_null && Z_TYPE_P(arg) == IS_NULL) { + //传参为NULL + *is_null = 1; + *dest = 0; + } else if (cap) { + //"L"的情况 + return zend_parse_arg_long_cap_slow(arg, dest); + } else { + //"l"的情况 + return zend_parse_arg_long_slow(arg, dest); + } + return 1; +} +``` +> __Note:__ "l"与"L"的区别在于,当传参不是整形且转为整形后超过了整形的大小范围时,"L"将值调整为整形的最大或最小值,而"l"将报错,比如传的参数是字符串"9223372036854775808",转整形后超过了unsigned int64的最大值:0xFFFFFFFFFFFFFFFF,"L"将解析为0xFFFFFFFFFFFFFFFF。 + +__(2)布尔型:b__ + +通过"b"标识符表示将传入的参数解析为布尔型,解析到的变量必须是zend_bool: +```c +zend_bool ok; + +if(zend_parse_parameters(ZEND_NUM_ARGS(), "b", &ok, &is_null) == FAILURE){ + ... +} +``` +"b!"的用法与整形的完全相同,也必须再提供一个zend_bool的地址用于获取传参是否为NULL,如果为NULL,则zend_bool为0,用于获取是否NULL的zend_bool为1。 + +__(3)浮点型:d__ + +通过"d"标识符表示将参数解析为浮点型,解析的变量类型必须为double: +```c +double dval; + +if(zend_parse_parameters(ZEND_NUM_ARGS(), "d", &dval) == FAILURE){ + ... +} +``` +具体解析过程不再展开,"d!"与整形、布尔型用法完全相同。 + +__(4)字符串:s、S、p、P__ + +字符串解析有两种形式:char*、zend_string,其中"s"将参数解析到`char*`,且需要额外提供一个size_t类型的变量用于获取字符串长度,"S"将解析到zend_string: +```c +char *str; +size_t str_len; + +if(zend_parse_parameters(ZEND_NUM_ARGS(), "s", &str, &str_len) == FAILURE){ + ... +} +``` +```c +zend_string *str; + +if(zend_parse_parameters(ZEND_NUM_ARGS(), "S", &str) == FAILURE){ + ... +} +``` +"s!"、"S!"与整形、布尔型用法不同,字符串时不需要额外提供zend_bool的地址,如果参数为NULL,则char*、zend_string将设置为NULL。除了"s"、"S"之外还有两个类似的:"p"、"P",从解析规则来看主要用于解析路径,实际与普通字符串没什么区别,尚不清楚这俩有什么特殊用法。 + +__(5)数组:a、A、h、H__ + +数组的解析也有两类,一类是解析到zval层面,另一类是解析到HashTable,其中"a"、"A"解析到的变量必须是zval,"h"、"H"解析到HashTable,这两类是等价的: +```c +zval *arr; //必须是zval指针,不能是zval arr,因为参数保存在zend_execute_data上,arr为此空间上参数的地址 +HashTable *ht; + +if(zend_parse_parameters(ZEND_NUM_ARGS(), "ah", &arr, &ht) == FAILURE){ + ... +} +``` +具体解析过程: +```c +case 'A': +case 'a': +{ + //解析到zval * + zval **p = va_arg(*va, zval **); + + if (!zend_parse_arg_array(arg, p, check_null, c == 'A')) { + return "array"; + } +} +break; + +case 'H': +case 'h': +{ + //解析到HashTable * + HashTable **p = va_arg(*va, HashTable **); + + if (!zend_parse_arg_array_ht(arg, p, check_null, c == 'H')) { + return "array"; + } +} +break; +``` +"a!"、"A!"、"h!"、"H!"的用法与字符串一致,也不需要额外提供别的地址,如果传参为NULL,则对应解析到的zval*、HashTable*也为NULL。 +> __Note:__ +> +> 1、"a"与"A"当传参为数组时没有任何差别,它们的区别在于:如果传参为对象"A"将按照对象解析到zval,而"a"将报错 +> +> 2、"h"与"H"当传参为数组时同样没有差别,当传参为对象时,"H"将把对象的成员参数数组解析到目标变量,"h"将报错 -(3)对象 +__(3)对象__ -(4)资源 +__(4)资源__ -(5)字符串 -(6)其它标识符 +__(6)其它标识符__ #### 7.6.1.3 函数返回值 diff --git a/img/internal_func_param.png b/img/internal_func_param.png index 36fa4cc40c932abce05e3cbf11735aa2f0af2572..28fc04970a6c89e33c5f574b2e00b38e29fd785a 100644 GIT binary patch literal 29284 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
Aoo=;!WAX_@f0!TdJQGf(Y6Fdpc;;vetH9f`r z%1Rh_D39xlux7S5uEU0mGZWyf*!YaJR_vwIqobVM&;bLC!Ic~Zcf_#+%NG#)%p$gQ zV83W%67(T@2Na(rU-@UEkNZR|WhbxK87g5_#)HSW5R|33 zzSFPFtY7e~HH{6zp_agtlN7y>y;;!6MJ&9@~4jC=g<8q zl#T+Zz#R~!YtEye-vwL^lCPalxQGN+!}?x(?3XNA-0H|oL<2ly;&-)IGY$_1FX_U} z*_NZeXI=%%h3{Us1w{eZoPVrDgrRx*wKK8;xWilEhSB3yhFUZ1U%O#Whv8X4O6D;) z?EN$RG%jCc8vymNgJ!f;3+Gd*t52a*M&%%pQMZlsq{(d4QVEt>(XXynasoL zhodaFLzKiE-;oL}{I*~Q!gl?g@M0~-jR3fu6v7?K}1>t!#rwdyeS|YqXWqJAdZ0ICP(B4Aq9hu$l=6&wmgE-TZ z(tT!Uu5OYt7L;Wi+&2`jAM}xr9zKfeaW3gaBKB+!@Ad2hcRPQChK33+&)oj2dU^2L ztGaL0=;K(mo!KT3*apl|F3vsYouGY`#u}uBe~)UGwFvDv->!aUaqj_J&AaU>6$qKU ztS7fIb$>v3l@>u15-$A$LY3>nuRDjS=L;ujgeAfg-&G$cg+mlA*A&?8W0EM@gVQKX zBmG=Fc1UbRc5ztUjv;%XGE^gt<sG^I=rZ1DltIvot(hJV2q0Gy!T zagJ)TfYrus8Dnqe)JhpUyQWG}~{cKD&F@4uVl5 zn2YRqX_mX_&^lL+W9T%~NNT5II{6^B9QAYfP zUL;?ESYl_{eBOJAcg<}!+W&newKQ(}gG@4m-oWkuy~HIMrnRk|ni^Ra^!s(R3^X5* HZG-<0@F5|y literal 27592 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 PHk?1JdM1}_bpO8q>}8`Y From 5a53c46c79b9c6b992da403bffe450ae4b0a4e8a Mon Sep 17 00:00:00 2001 From: qinpeng Date: Thu, 25 May 2017 19:25:48 +0800 Subject: [PATCH 280/379] update --- 7/func.md | 43 ++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 40 insertions(+), 3 deletions(-) diff --git a/7/func.md b/7/func.md index 276134c..8c9e6f9 100644 --- a/7/func.md +++ b/7/func.md @@ -275,12 +275,49 @@ break; > > 2、"h"与"H"当传参为数组时同样没有差别,当传参为对象时,"H"将把对象的成员参数数组解析到目标变量,"h"将报错 -__(3)对象__ +__(6)对象:o、O__ -__(4)资源__ +如果参数是一个对象则可以通过"o"、"O"将其解析到目标变量,注意:只能解析为zval*,无法解析为zend_object*。 +```c +zval *obj; + +if(zend_parse_parameters(ZEND_NUM_ARGS(), "o", &obj) == FAILURE){ + ... +} +``` +"O"是要求解析指定类或其子类的对象,类似传参时显式的声明了参数类型的用法:`function my_func(MyClass $obj){...}`,如果参数不是指定类的实例化对象则无法解析。 + +"o!"、"O!"与字符串用法相同。 + +__(7)资源:r__ + +如果参数为资源则可以通过"r"获取其zval的地址,但是无法直接解析到zend_resource的地址,与对象相同。 +```c +zval *res; + +if(zend_parse_parameters(ZEND_NUM_ARGS(), "r", &res) == FAILURE){ + ... +} +``` +"r!"与字符串用法相同。 + +__(8)类:C__ + +如果参数是一个类则可以通过"C"解析出zend_class_entry地址:`function my_func(stdClass){...}`,这里有个地方比较特殊,解析到的变量可以设定为一个类,这种情况下解析时将会找到的类与指定的类之间的父子关系,只有存在父子关系才能解析,如果只是想根据参数获取类型的zend_class_entry地址,记得将解析到的地址初始化为NULL,否则将会不可预料的错误。 +```c +zend_class_entry *ce = NULL; //初始为NULL + +if(zend_parse_parameters(ZEND_NUM_ARGS(), "C", &ce) == FAILURE){ + RETURN_FALSE; +} +``` +__(9)通用解析:z__ + +"z"表示按参数实际类型解析,比如参数为字符串就解析为字符串,参数为数组就解析为数组,这种实际就是将zend_execute_data上的参数地址拷贝到目的变量了,没有做任何转化。 +"z!"与字符串用法相同。 -__(6)其它标识符__ +__(10)其它标识符__ #### 7.6.1.3 函数返回值 From 0a075123758b7d7945f0de93630185176cb4f5ab Mon Sep 17 00:00:00 2001 From: qinpeng Date: Thu, 25 May 2017 21:06:37 +0800 Subject: [PATCH 281/379] update --- 7/func.md | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/7/func.md b/7/func.md index 8c9e6f9..d477072 100644 --- a/7/func.md +++ b/7/func.md @@ -311,13 +311,36 @@ if(zend_parse_parameters(ZEND_NUM_ARGS(), "C", &ce) == FAILURE){ RETURN_FALSE; } ``` -__(9)通用解析:z__ +__(9)callable:f__ + +callable指函数或成员方法,如果参数是函数名称字符串、array(对象/类,成员方法),则可以通过"f"标识符解析出`zend_fcall_info`结构,这个结构是调用函数、成员方法时的唯一输入。 +```c +zend_fcall_info callable; //注意,这两个结构不能是指针 +zend_fcall_info_cache call_cache; + +if(zend_parse_parameters(ZEND_NUM_ARGS(), "f", &callable, &call_cache) == FAILURE){ + RETURN_FALSE; +} +``` +函数调用: +```php +my_func_1("func_name"); +或 +my_func_1(array('class_name', 'static_method')); +或 +my_func_1(array($object, 'method')); +``` +解析出`zend_fcall_info`后就可以通过`zend_call_function()`调用函数、成员方法了,提供"f"解析到`zend_fcall_info`的用意是简化函数调用的操作,否则需要我们自己去查找函数、检查是否可被调用等工作,关于这个结构稍后介绍函数调用时再作详细说明。 + +__(10)通用解析:z__ "z"表示按参数实际类型解析,比如参数为字符串就解析为字符串,参数为数组就解析为数组,这种实际就是将zend_execute_data上的参数地址拷贝到目的变量了,没有做任何转化。 "z!"与字符串用法相同。 -__(10)其它标识符__ +__(11)其它标识符__ + +除了上面介绍的这些表示符,以外还有几个有特殊用法的标识符:"|"、"+"、"*",它们并不是用来表示数据类型的。 #### 7.6.1.3 函数返回值 From 2731b38c844f20a9ae1bb06e92bfd3a5c04b2e03 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Fri, 26 May 2017 09:38:45 +0800 Subject: [PATCH 282/379] update --- 7/func.md | 43 +++++++++++++++++-------------------------- 1 file changed, 17 insertions(+), 26 deletions(-) diff --git a/7/func.md b/7/func.md index d477072..0689a21 100644 --- a/7/func.md +++ b/7/func.md @@ -1,9 +1,8 @@ ## 7.6 函数 -### 7.6.1 内部函数 +### 7.6.1 内部函数注册 通过扩展可以将C语言实现的函数提供给PHP脚本使用,如同大量PHP内置函数一样,这些函数统称为内部函数(internal function),与PHP脚本中定义的用户函数不同,它们无需经历用户函数的编译过程,同时执行时也不像用户函数那样每一个指令都调用一次C语言编写的handler函数,因此,内部函数的执行效率更高。除了性能上的优势,内部函数还可以拥有更高的控制权限,可发挥的作用也更大,能够完成很多用户函数无法实现的功能。 -#### 7.6.1.1 内部函数的定义 前面介绍PHP函数的编译时曾经详细介绍过PHP函数的实现,函数通过`zend_function`来表示,这是一个联合体,用户函数使用`zend_function.op_array`,内部函数使用`zend_function.internal_function`,两者具有相同的头部用来记录函数的基本信息。不管是用户函数还是内部函数,其最终都被注册到EG(function_table)中,函数被调用时根据函数名称向这个符号表中查找。从内部函数的注册、使用过程可以看出,其定义实际非常简单,我们只需要定义一个`zend_internal_function`结构,然后注册到EG(function_table)中即可,接下来再重新看下内部函数的结构: ```c typedef struct _zend_internal_function { @@ -94,7 +93,7 @@ Hello, I'm my_func_2 ``` 大功告成,函数已经能够正常工作了,后续的工作就是不断完善handler实现扩展自己的功能了。 -#### 7.6.1.2 函数参数解析 +### 7.6.2 函数参数解析 上面我们定义的函数没有接收任何参数,那么扩展定义的内部函数如何读取参数呢?首先回顾下函数参数的实现:用户自定义函数在编译时会为每个参数创建一个`zend_arg_info`结构,这个结构用来记录参数的名称、是否引用传参、是否为可变参数等,在存储上函数参数与局部变量相同,都分配在zend_execute_data上,且最先分配的就是函数参数,调用函数时首先会进行参数传递,按参数次序依次将参数的value从调用空间传递到被调函数的zend_execute_data,函数内部像访问普通局部变量一样通过存储位置访问参数,这是用户自定义函数的参数实现。 内部函数与用户自定义函数最大的不同在于内部函数就是一个普通的C函数,除函数参数以外在zend_execute_data上没有其他变量的分配,函数参数是从PHP用户空间传到函数的,它们与用户自定义函数完全相同,包括参数的分配方式、传参过程,也是按照参数次序依次分配在zend_execute_data上,所以在扩展中定义的函数直接按照顺序从zend_execute_data上读取对应的值即可,PHP中通过`zend_parse_parameters()`这个函数解析zend_execute_data上保存的参数: @@ -122,8 +121,7 @@ PHP_FUNCTION(my_func_1) 注意:解析时除了整形、浮点型、布尔型和NULL是直接硬拷贝value外,其它解析到的变量只能是指针,arr为zend_execute_data上param_1的地址,即:`arr = ¶m_1`,所以图中arr、param_1之间用的不是箭头指向,也就是说参数始终存储在zend_execute_data上,内部函数要用只能从zend_execute_data上取。接下来详细介绍下`zend_parse_parameters()`不同类型的解析用法。 -__(1)整形:l、L__ - +#### 7.6.2.1 整形:l、L 整形通过"l"、"L"标识,表示解析的参数为整形,解析到的变量类型必须是`zend_long`,不能解析其它类型,如果输入的参数不是整形将按照类型转换规则将其转为整形: ```c zend_long lval; @@ -187,8 +185,7 @@ static zend_always_inline int zend_parse_arg_long(zval *arg, zend_long *dest, ze ``` > __Note:__ "l"与"L"的区别在于,当传参不是整形且转为整形后超过了整形的大小范围时,"L"将值调整为整形的最大或最小值,而"l"将报错,比如传的参数是字符串"9223372036854775808",转整形后超过了unsigned int64的最大值:0xFFFFFFFFFFFFFFFF,"L"将解析为0xFFFFFFFFFFFFFFFF。 -__(2)布尔型:b__ - +#### 7.6.2.2 布尔型:b 通过"b"标识符表示将传入的参数解析为布尔型,解析到的变量必须是zend_bool: ```c zend_bool ok; @@ -199,7 +196,7 @@ if(zend_parse_parameters(ZEND_NUM_ARGS(), "b", &ok, &is_null) == FAILURE){ ``` "b!"的用法与整形的完全相同,也必须再提供一个zend_bool的地址用于获取传参是否为NULL,如果为NULL,则zend_bool为0,用于获取是否NULL的zend_bool为1。 -__(3)浮点型:d__ +#### 7.6.2.3 浮点型:d 通过"d"标识符表示将参数解析为浮点型,解析的变量类型必须为double: ```c @@ -211,8 +208,7 @@ if(zend_parse_parameters(ZEND_NUM_ARGS(), "d", &dval) == FAILURE){ ``` 具体解析过程不再展开,"d!"与整形、布尔型用法完全相同。 -__(4)字符串:s、S、p、P__ - +#### 7.6.2.4 字符串:s、S、p、P 字符串解析有两种形式:char*、zend_string,其中"s"将参数解析到`char*`,且需要额外提供一个size_t类型的变量用于获取字符串长度,"S"将解析到zend_string: ```c char *str; @@ -231,8 +227,7 @@ if(zend_parse_parameters(ZEND_NUM_ARGS(), "S", &str) == FAILURE){ ``` "s!"、"S!"与整形、布尔型用法不同,字符串时不需要额外提供zend_bool的地址,如果参数为NULL,则char*、zend_string将设置为NULL。除了"s"、"S"之外还有两个类似的:"p"、"P",从解析规则来看主要用于解析路径,实际与普通字符串没什么区别,尚不清楚这俩有什么特殊用法。 -__(5)数组:a、A、h、H__ - +#### 7.6.2.5 数组:a、A、h、H 数组的解析也有两类,一类是解析到zval层面,另一类是解析到HashTable,其中"a"、"A"解析到的变量必须是zval,"h"、"H"解析到HashTable,这两类是等价的: ```c zval *arr; //必须是zval指针,不能是zval arr,因为参数保存在zend_execute_data上,arr为此空间上参数的地址 @@ -275,8 +270,7 @@ break; > > 2、"h"与"H"当传参为数组时同样没有差别,当传参为对象时,"H"将把对象的成员参数数组解析到目标变量,"h"将报错 -__(6)对象:o、O__ - +#### 7.6.2.6 对象:o、O 如果参数是一个对象则可以通过"o"、"O"将其解析到目标变量,注意:只能解析为zval*,无法解析为zend_object*。 ```c zval *obj; @@ -289,8 +283,7 @@ if(zend_parse_parameters(ZEND_NUM_ARGS(), "o", &obj) == FAILURE){ "o!"、"O!"与字符串用法相同。 -__(7)资源:r__ - +#### 7.6.2.7 资源:r 如果参数为资源则可以通过"r"获取其zval的地址,但是无法直接解析到zend_resource的地址,与对象相同。 ```c zval *res; @@ -301,8 +294,7 @@ if(zend_parse_parameters(ZEND_NUM_ARGS(), "r", &res) == FAILURE){ ``` "r!"与字符串用法相同。 -__(8)类:C__ - +#### 7.6.2.8 类:C 如果参数是一个类则可以通过"C"解析出zend_class_entry地址:`function my_func(stdClass){...}`,这里有个地方比较特殊,解析到的变量可以设定为一个类,这种情况下解析时将会找到的类与指定的类之间的父子关系,只有存在父子关系才能解析,如果只是想根据参数获取类型的zend_class_entry地址,记得将解析到的地址初始化为NULL,否则将会不可预料的错误。 ```c zend_class_entry *ce = NULL; //初始为NULL @@ -311,8 +303,7 @@ if(zend_parse_parameters(ZEND_NUM_ARGS(), "C", &ce) == FAILURE){ RETURN_FALSE; } ``` -__(9)callable:f__ - +#### 7.6.2.9 callable:f callable指函数或成员方法,如果参数是函数名称字符串、array(对象/类,成员方法),则可以通过"f"标识符解析出`zend_fcall_info`结构,这个结构是调用函数、成员方法时的唯一输入。 ```c zend_fcall_info callable; //注意,这两个结构不能是指针 @@ -332,18 +323,18 @@ my_func_1(array($object, 'method')); ``` 解析出`zend_fcall_info`后就可以通过`zend_call_function()`调用函数、成员方法了,提供"f"解析到`zend_fcall_info`的用意是简化函数调用的操作,否则需要我们自己去查找函数、检查是否可被调用等工作,关于这个结构稍后介绍函数调用时再作详细说明。 -__(10)通用解析:z__ - +#### 7.6.2.10 通用解析:z "z"表示按参数实际类型解析,比如参数为字符串就解析为字符串,参数为数组就解析为数组,这种实际就是将zend_execute_data上的参数地址拷贝到目的变量了,没有做任何转化。 "z!"与字符串用法相同。 -__(11)其它标识符__ - +#### 7.6.2.11 其它标识符 除了上面介绍的这些表示符,以外还有几个有特殊用法的标识符:"|"、"+"、"*",它们并不是用来表示数据类型的。 -#### 7.6.1.3 函数返回值 +### 7.6.3 引用传参 + +### 7.6.4 函数返回值 -### 7.6.2 调用用户函数 +### 7.6.5 函数调用 From e54e0284bf3815e50999fd424382741dcd6fd087 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Fri, 26 May 2017 09:47:25 +0800 Subject: [PATCH 283/379] update --- 7/func.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/7/func.md b/7/func.md index 0689a21..263ee53 100644 --- a/7/func.md +++ b/7/func.md @@ -100,7 +100,9 @@ Hello, I'm my_func_2 ```c zend_parse_parameters(int num_args, const char *type_spec, ...); ``` -num_args为实际传参数,通过`ZEND_NUM_ARGS()`获取;type_spec是一个字符串,用来标识解析参数的类型,比如:"la"表示第一个参数为整形,第二个为数组,将按照这个解析到指定变量;后面是一个可变参数,用来指定解析到的变量,这个值与type_spec配合使用,即type_spec用来指定解析的变量类型,可变参数用来指定要解析到的变量,这个值必须是指针。 +* num_args为实际传参数,通过`ZEND_NUM_ARGS()`获取:zend_execute_data->This.u2.num_args,前面曾介绍过`zend_execute_data->This`这个zval的用途; +* type_spec是一个字符串,用来标识解析参数的类型,比如:"la"表示第一个参数为整形,第二个为数组,将按照这个解析到指定变量; +* 后面是一个可变参数,用来指定解析到的变量,这个值与type_spec配合使用,即type_spec用来指定解析的变量类型,可变参数用来指定要解析到的变量,这个值必须是指针。 解析的过程也比较容易理解,因为传给函数的参数已经保存到zend_execute_data上了,所以解析的过程就是按照type_spec指定的各个类型,依次从zend_execute_data上获取参数的value,然后保存到解析到的地址上,比如: ```c From 8537fc6e6b486f8f281812a3011ebeacd669ad4d Mon Sep 17 00:00:00 2001 From: qinpeng Date: Fri, 26 May 2017 17:16:59 +0800 Subject: [PATCH 284/379] update --- 7/func.md | 90 +++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 85 insertions(+), 5 deletions(-) diff --git a/7/func.md b/7/func.md index 263ee53..f7b6093 100644 --- a/7/func.md +++ b/7/func.md @@ -121,7 +121,7 @@ PHP_FUNCTION(my_func_1) ![](../img/internal_func_param.png) -注意:解析时除了整形、浮点型、布尔型和NULL是直接硬拷贝value外,其它解析到的变量只能是指针,arr为zend_execute_data上param_1的地址,即:`arr = ¶m_1`,所以图中arr、param_1之间用的不是箭头指向,也就是说参数始终存储在zend_execute_data上,内部函数要用只能从zend_execute_data上取。接下来详细介绍下`zend_parse_parameters()`不同类型的解析用法。 +注意:解析时除了整形、浮点型、布尔型是直接硬拷贝value外,其它解析到的变量只能是指针,arr为zend_execute_data上param_1的地址,即:`arr = ¶m_1`,所以图中arr、param_1之间用的不是箭头指向,也就是说参数始终存储在zend_execute_data上,内部函数要用只能从zend_execute_data上取。接下来详细介绍下`zend_parse_parameters()`不同类型的解析方式。 #### 7.6.2.1 整形:l、L 整形通过"l"、"L"标识,表示解析的参数为整形,解析到的变量类型必须是`zend_long`,不能解析其它类型,如果输入的参数不是整形将按照类型转换规则将其转为整形: @@ -311,16 +311,16 @@ callable指函数或成员方法,如果参数是函数名称字符串、array( zend_fcall_info callable; //注意,这两个结构不能是指针 zend_fcall_info_cache call_cache; -if(zend_parse_parameters(ZEND_NUM_ARGS(), "f", &callable, &call_cache) == FAILURE){ +if(zend_parse_parameters( RETURN_FALSE; } ``` 函数调用: ```php my_func_1("func_name"); -或 +//或 my_func_1(array('class_name', 'static_method')); -或 +//或 my_func_1(array($object, 'method')); ``` 解析出`zend_fcall_info`后就可以通过`zend_call_function()`调用函数、成员方法了,提供"f"解析到`zend_fcall_info`的用意是简化函数调用的操作,否则需要我们自己去查找函数、检查是否可被调用等工作,关于这个结构稍后介绍函数调用时再作详细说明。 @@ -331,9 +331,89 @@ my_func_1(array($object, 'method')); "z!"与字符串用法相同。 #### 7.6.2.11 其它标识符 -除了上面介绍的这些表示符,以外还有几个有特殊用法的标识符:"|"、"+"、"*",它们并不是用来表示数据类型的。 +除了上面介绍的这些解析符号以外,还有几个有特殊用法的标识符:"|"、"+"、"*",它们并不是用来表示某种数据类型的。 +* __|:__ 表示此后的参数为可选参数,可以不传,比如解析规则为:"al|b",则可以传2个或3个参数,如果是:"alb",则必须传3个,否则将报错; +* __+/*:__ 用于可变参数,注意这里与PHP函数...的用法不太一样,PHP中可以把函数最后一个参数前加...,表示调用时可以传多个参数,这些参数都会插入...参数的数组中,"*/+"也表示这个参数是可变的,但内核中只能接收一个值,即使传了多个后面那些也解析不到,"*"、"+"的区别在于"*"表示可以不传可变参数,而"+"表示可变参数至少有一个。 ### 7.6.3 引用传参 +上一节介绍了如何在内部函数中解析参数,这里还有一种情况没有讲到,那就是引用传参: +```php +$a = array(); + +function my_func(&$a){ + $a[] = 1; +} +``` +上面这个例子在函数中对$a的修改将反映到原变量上,那么这种用法如何在内部函数中实现呢?上一节介绍参数解析的过程中并没有提到用户函数中参数的zend_arg_info结构,内部函数中也有类似的一个结构用于函数注册时指定参数的一些信息:zend_internal_arg_info。 +```c +typedef struct _zend_internal_arg_info { + const char *name; //参数名 + const char *class_name; + zend_uchar type_hint; //显式声明的类型 + zend_uchar pass_by_reference; //是否引用传参 + zend_bool allow_null; //是否允许参数为NULL,类似"!"的用法 + zend_bool is_variadic; //是否为可变参数 +} zend_internal_arg_info; +``` +这个结构几乎与zend_arg_info完全一样,不同的地方只在于name、class_name的类型,zend_arg_info这两个成员的类型都是zend_string。如果函数需要使用引用类型的参数或返回引用就需要创建函数的参数数组,这个数组通过:`ZEND_BEGIN_ARG_INFO()或ZEND_BEGIN_ARG_INFO_EX()`、`ZEND_END_ARG_INFO()`宏定义: +```c +#define ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(name, return_reference, required_num_args, type, class_name, allow_null) +#define ZEND_BEGIN_ARG_INFO_EX(name, _unused, return_reference, required_num_args) +#define ZEND_BEGIN_ARG_INFO(name, _unused) +``` +* __name:__ 参数数组名,注册函数`PHP_FE(function, arg_info)`会用到 +* ___unused:__ 保留值,暂时无用 +* __return_reference:__ 返回值是否为引用 +* __required_num_args:__ required参数数 +* __type:__ 返回值类型 + +这两个宏需要与`ZEND_END_ARG_INFO()`配合使用: +```c +ZEND_BEGIN_ARG_INFO_EX(arginfo_my_func_1, 0, 0, 2) + ... +ZEND_END_ARG_INFO() +``` +接着就是在上面两个宏中间定义每一个参数的zend_internal_arg_info,PHP提供的宏有: +```c +//pass_by_ref表示是否引用传参,name为参数名称 +#define ZEND_ARG_INFO(pass_by_ref, name) { #name, NULL, 0, pass_by_ref, 0, 0 }, + +//只声明此参数为引用传参 +#define ZEND_ARG_PASS_INFO(pass_by_ref) { NULL, NULL, 0, pass_by_ref, 0, 0 }, + +//显式声明此参数的类型为指定类的对象,等价于PHP中这样声明:MyClass $obj +#define ZEND_ARG_OBJ_INFO(pass_by_ref, name, classname, allow_null) { #name, #classname, IS_OBJECT, pass_by_ref, allow_null, 0 }, + +//显式声明此参数类型为数组,等价于:array $arr +#define ZEND_ARG_ARRAY_INFO(pass_by_ref, name, allow_null) { #name, NULL, IS_ARRAY, pass_by_ref, allow_null, 0 }, + +//显式声明为callable,将检查函数、成员方法是否可调 +#define ZEND_ARG_CALLABLE_INFO(pass_by_ref, name, allow_null) { #name, NULL, IS_CALLABLE, pass_by_ref, allow_null, 0 }, + +//通用宏,自定义各个字段 +#define ZEND_ARG_TYPE_INFO(pass_by_ref, name, type_hint, allow_null) { #name, NULL, type_hint, pass_by_ref, allow_null, 0 }, + +//声明为可变参数 +#define ZEND_ARG_VARIADIC_INFO(pass_by_ref, name) { #name, NULL, 0, pass_by_ref, 0, 1 }, +``` + +展开后: +```c +static const zend_internal_arg_info name[] = { + { (const char*)(zend_uintptr_t)(2), NULL, 0, 0, 0, 0 }, + { name, NULL, 0, 0, 0, 0 }, + { id, NULL, 0, 1, 0, 0 }, +} +``` +第一个数组元素用于记录必传参数的数量以及返回值是否为引用。定义完这个数组接下来就需要把这个数组告诉函数,`PHP_FE()`宏的第二个参数就是接收这个数组的: +```c +const zend_function_entry mytest_functions[] = { + PHP_FE(my_func_1, arginfo_my_func_1) + PHP_FE(my_func_2, NULL) + PHP_FE_END //末尾必须加这个 +}; +``` + ### 7.6.4 函数返回值 From 1de9b7a02aee175b1f8c4047957817b9076dda32 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Fri, 26 May 2017 18:36:08 +0800 Subject: [PATCH 285/379] update --- 7/func.md | 45 +++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 41 insertions(+), 4 deletions(-) diff --git a/7/func.md b/7/func.md index f7b6093..ca3559b 100644 --- a/7/func.md +++ b/7/func.md @@ -396,16 +396,28 @@ ZEND_END_ARG_INFO() //声明为可变参数 #define ZEND_ARG_VARIADIC_INFO(pass_by_ref, name) { #name, NULL, 0, pass_by_ref, 0, 1 }, ``` - +举个例子来看: +```php +function my_func_1(&$a, Exception $c){ + ... +} +``` +用内核实现则可以这么定义: +```c +ZEND_BEGIN_ARG_INFO_EX(arginfo_my_func_1, 0, 0, 1) + ZEND_ARG_INFO(1, a) //引用 + ZEND_ARG_OBJ_INFO(0, b, Exception, 0) //注意:这里不要把字符串加"" +ZEND_END_ARG_INFO() +``` 展开后: ```c static const zend_internal_arg_info name[] = { { (const char*)(zend_uintptr_t)(2), NULL, 0, 0, 0, 0 }, - { name, NULL, 0, 0, 0, 0 }, - { id, NULL, 0, 1, 0, 0 }, + { "a", NULL, 0, 0, 0, 0 }, + { "b", "Exception", 8, 1, 0, 0 }, } ``` -第一个数组元素用于记录必传参数的数量以及返回值是否为引用。定义完这个数组接下来就需要把这个数组告诉函数,`PHP_FE()`宏的第二个参数就是接收这个数组的: +第一个数组元素用于记录必传参数的数量以及返回值是否为引用。定义完这个数组接下来就需要把这个数组告诉函数: ```c const zend_function_entry mytest_functions[] = { PHP_FE(my_func_1, arginfo_my_func_1) @@ -413,7 +425,32 @@ const zend_function_entry mytest_functions[] = { PHP_FE_END //末尾必须加这个 }; ``` +引用参数通过`zend_parse_parameters()`解析时只能使用"z"解析,不能再直接解析为zend_value了,否则引用将失效: +``` +PHP_FUNCTION(my_func_1) +{ + zval *lval; //必须为zval,定义为zend_long也能解析出,但不是引用 + zval *obj; + if(zend_parse_parameters(ZEND_NUM_ARGS(), "zo", &lval, &obj) == FAILURE){ + RETURN_FALSE; + } + + //lval的类型为IS_REFERENCE + zval *real_val = Z_REFVAL_P(lval); //获取实际引用的zval地址:&(lval.value->ref.val) + Z_LVAL_P(real_val) = 100; //设置实际引用的类型 +} +``` +```php +$a = 90; +$b = new Exception; +my_func_1($a, $b); + +echo $a; +==========[output]=========== +100 +``` +> __Note:__ 参数数组与zend_parse_parameters()有很多功能重合,两者都会生效,对zend_internal_arg_info验证在zend_parse_parameters()之前,为避免混乱两者应该保持一致;另外,虽然内部函数的参数数组并不强制定义声明,但还是建议声明。 ### 7.6.4 函数返回值 From 4ab82326e59e259be97302bbcd34166e3206aa97 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Fri, 26 May 2017 20:13:40 +0800 Subject: [PATCH 286/379] update --- 7/func.md | 101 +++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 96 insertions(+), 5 deletions(-) diff --git a/7/func.md b/7/func.md index ca3559b..d002b57 100644 --- a/7/func.md +++ b/7/func.md @@ -25,9 +25,12 @@ typedef struct _zend_internal_function { ``` Common elements就是与用户函数相同的头部,用来记录函数的基本信息:函数类型、参数信息、函数名等,handler是此内部函数的具体实现,PHP提供了一个宏用于此handler的定义:`PHP_FUNCTION(function_name)`或`ZEND_FUNCTION()`,展开后: ```c -void (*handler)(zend_execute_data *execute_data, zval *return_value) +void *zif_function_name(zend_execute_data *execute_data, zval *return_value) +{ + ... +} ``` -也就是内部函数会得到两个参数:execute_data、return_value,execute_data不用再说了,return_value是函数的返回值,这两个值在扩展中会经常用到。 +PHP为函数名加了"zif_"前缀,gdb调试时记得加上这个前缀;另外内部函数定义了两个参数:execute_data、return_value,execute_data不用再说了,return_value是函数的返回值,这两个值在扩展中会经常用到。 比如要在扩展中定义两个函数:my_func_1()、my_func_2(),首先是编写函数: ```c @@ -65,12 +68,12 @@ const zend_function_entry mytest_functions[] = { #define ZEND_FENTRY(zend_name, name, arg_info, flags) { #zend_name, name, arg_info, (uint32_t) (sizeof(arg_info)/sizeof(struct _zend_internal_arg_info)-1), flags }, #define ZEND_FN(name) zif_##name ``` -内部函数的名称前加了`zif_`前缀,以防与内核中的函数冲突,所以如果想用gdb调试扩展定义的函数记得加上这个前缀。最后将`zend_module_entry.functions`设置为`timeout_functions`即可: +最后将`zend_module_entry->functions`设置为`timeout_functions`即可: ```c zend_module_entry mytest_module_entry = { STANDARD_MODULE_HEADER, "mytest", - mytest_functions, + mytest_functions, //functions NULL, //PHP_MINIT(mytest), NULL, //PHP_MSHUTDOWN(mytest), NULL, //PHP_RINIT(mytest), @@ -426,7 +429,7 @@ const zend_function_entry mytest_functions[] = { }; ``` 引用参数通过`zend_parse_parameters()`解析时只能使用"z"解析,不能再直接解析为zend_value了,否则引用将失效: -``` +```c PHP_FUNCTION(my_func_1) { zval *lval; //必须为zval,定义为zend_long也能解析出,但不是引用 @@ -453,7 +456,95 @@ echo $a; > __Note:__ 参数数组与zend_parse_parameters()有很多功能重合,两者都会生效,对zend_internal_arg_info验证在zend_parse_parameters()之前,为避免混乱两者应该保持一致;另外,虽然内部函数的参数数组并不强制定义声明,但还是建议声明。 ### 7.6.4 函数返回值 +调用内部函数时其返回值指针作为参数传入,这个参数为`zval *return_value`,如果函数有返回值直接设置此指针即可,需要特别注意的是设置返回值时需要增加其引用计数,举个例子来看: + ```c +PHP_FUNCTION(my_func_1) +{ + zval *arr; + + if(zend_parse_parameters(ZEND_NUM_ARGS(), "a", &arr) == FAILURE){ + RETURN_FALSE; + } + //增加引用计数 + Z_ADDREF_P(arr); + + //设置返回值为数组: + //return_value->u1.type = IS_ARRAY; + //return_value->value->arr = arr->value->arr; + ZVAL_ARR(return_value, Z_ARR_P(arr)); +} +``` +此函数接收一个数组,然后直接返回该数组,相当于: +```php +function my_func_1($arr){ + return $arr; +} +``` +调用该函数: +```php +$a = array(); //$a -> zend_array(refcount:1) +$b = my_func_1($a); //传参后:参数arr -> zend_array(refcount:2) + //然后函数内部赋给了返回值:$b,$a,arr -> zend_array(refcount:3) + //函数return阶段释放了参数:$b,$a -> zend_array(refcount:2) +var_dump($b); +=============[output]=========== +array(0) { +} +``` +虽然可以直接设置return_value,但实际使用时并不建议这么做,因为PHP提供了很多专门用于设置返回值的宏,这些宏定义在`zend_API.h`中: +```c +//返回布尔型,b:IS_FALSE、IS_TRUE +#define RETURN_BOOL(b) { RETVAL_BOOL(b); return; } + +//返回NULL +#define RETURN_NULL() { RETVAL_NULL(); return;} + +//返回整形,l类型:zend_long +#define RETURN_LONG(l) { RETVAL_LONG(l); return; } + +//返回浮点值,d类型:double +#define RETURN_DOUBLE(d) { RETVAL_DOUBLE(d); return; } + +//返回字符串,可返回内部字符串,s类型为:zend_string * +#define RETURN_STR(s) { RETVAL_STR(s); return; } + +//返回内部字符串,这种变量将不会被回收,s类型为:zend_string * +#define RETURN_INTERNED_STR(s) { RETVAL_INTERNED_STR(s); return; } + +//返回普通字符串,非内部字符串,s类型为:zend_string * +#define RETURN_NEW_STR(s) { RETVAL_NEW_STR(s); return; } + +//拷贝字符串用于返回,这个会自己加引用计数,s类型为:zend_string * +#define RETURN_STR_COPY(s) { RETVAL_STR_COPY(s); return; } + +//返回char *类型的字符串,s类型为char * +#define RETURN_STRING(s) { RETVAL_STRING(s); return; } + +//返回char *类型的字符串,s类型为char *,l为字符串长度,类型为size_t +#define RETURN_STRINGL(s, l) { RETVAL_STRINGL(s, l); return; } + +//返回空字符串 +#define RETURN_EMPTY_STRING() { RETVAL_EMPTY_STRING(); return; } + +//返回资源,r类型:zend_resource * +#define RETURN_RES(r) { RETVAL_RES(r); return; } + +//返回数组,r类型:zend_array * +#define RETURN_ARR(r) { RETVAL_ARR(r); return; } + +//返回对象,r类型:zend_object * +#define RETURN_OBJ(r) { RETVAL_OBJ(r); return; } + +//返回zval +#define RETURN_ZVAL(zv, copy, dtor) { RETVAL_ZVAL(zv, copy, dtor); return; } + +//返回false +#define RETURN_FALSE { RETVAL_FALSE; return; } + +//返回true +#define RETURN_TRUE { RETVAL_TRUE; return; } +``` ### 7.6.5 函数调用 From cd5e8449f885b3b0ecc60b077828c9c19fe7a694 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Sat, 27 May 2017 13:21:38 +0800 Subject: [PATCH 287/379] update --- 7/func.md | 203 ++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 197 insertions(+), 6 deletions(-) diff --git a/7/func.md b/7/func.md index d002b57..20e2ab0 100644 --- a/7/func.md +++ b/7/func.md @@ -107,7 +107,7 @@ zend_parse_parameters(int num_args, const char *type_spec, ...); * type_spec是一个字符串,用来标识解析参数的类型,比如:"la"表示第一个参数为整形,第二个为数组,将按照这个解析到指定变量; * 后面是一个可变参数,用来指定解析到的变量,这个值与type_spec配合使用,即type_spec用来指定解析的变量类型,可变参数用来指定要解析到的变量,这个值必须是指针。 -解析的过程也比较容易理解,因为传给函数的参数已经保存到zend_execute_data上了,所以解析的过程就是按照type_spec指定的各个类型,依次从zend_execute_data上获取参数的value,然后保存到解析到的地址上,比如: +i解析的过程也比较容易理解,调用函数时首先会把参数拷贝到调用函数的zend_execute_data上,所以解析的过程就是按照type_spec指定的各个类型,依次从zend_execute_data上获取参数,然后将参数地址赋给目标变量,比如下面这个例子: ```c PHP_FUNCTION(my_func_1) { @@ -124,7 +124,49 @@ PHP_FUNCTION(my_func_1) ![](../img/internal_func_param.png) -注意:解析时除了整形、浮点型、布尔型是直接硬拷贝value外,其它解析到的变量只能是指针,arr为zend_execute_data上param_1的地址,即:`arr = ¶m_1`,所以图中arr、param_1之间用的不是箭头指向,也就是说参数始终存储在zend_execute_data上,内部函数要用只能从zend_execute_data上取。接下来详细介绍下`zend_parse_parameters()`不同类型的解析方式。 +注意:解析时除了整形、浮点型、布尔型是直接硬拷贝value外,其它解析到的变量只能是指针,arr为zend_execute_data上param_1的地址,即:`zval *arr = ¶m_1`,所以图中arr、param_1之间用的不是箭头指向,也就是说参数始终存储在zend_execute_data上,解析获取的是这些参数的地址。`zend_parse_parameters()`调用了`zend_parse_va_args()`进行处理,简单看下解析过程: +```c +//va就是定义的要解析到的各个变量的地址 +static int zend_parse_va_args(int num_args, const char *type_spec, va_list *va, int flags) +{ + const char *spec_walk; + int min_num_args = -1; //最少参数数 + int max_num_args = 0; //要解析的参数总数 + int post_varargs = 0; + zval *arg; + int arg_count; //实际传参数 + + //遍历type_spec计算出min_num_args、max_num_args + for (spec_walk = type_spec; *spec_walk; spec_walk++) { + ... + } + ... + //检查数目是否合法 + if (num_args < min_num_args || (num_args > max_num_args && max_num_args >= 0)) { + ... + } + //获取实际传参数:zend_execute_data.This.u2.num_args + arg_count = ZEND_CALL_NUM_ARGS(EG(current_execute_data)); + ... + i = 0; + //逐个解析参数 + while (num_args-- > 0) { + ... + //获取第i个参数的zval地址:arg就是在zend_execute_data上分配的局部变量 + arg = ZEND_CALL_ARG(EG(current_execute_data), i + 1); + + //解析第i个参数 + if (zend_parse_arg(i+1, arg, va, &type_spec, flags) == FAILURE) { + if (varargs && *varargs) { + *varargs = NULL; + } + return FAILURE; + } + i++; + } +} +``` +接下来详细看下不同类型的解析方式。 #### 7.6.2.1 整形:l、L 整形通过"l"、"L"标识,表示解析的参数为整形,解析到的变量类型必须是`zend_long`,不能解析其它类型,如果输入的参数不是整形将按照类型转换规则将其转为整形: @@ -328,7 +370,7 @@ my_func_1(array($object, 'method')); ``` 解析出`zend_fcall_info`后就可以通过`zend_call_function()`调用函数、成员方法了,提供"f"解析到`zend_fcall_info`的用意是简化函数调用的操作,否则需要我们自己去查找函数、检查是否可被调用等工作,关于这个结构稍后介绍函数调用时再作详细说明。 -#### 7.6.2.10 通用解析:z +#### 7.6.2.10 任意类型:z "z"表示按参数实际类型解析,比如参数为字符串就解析为字符串,参数为数组就解析为数组,这种实际就是将zend_execute_data上的参数地址拷贝到目的变量了,没有做任何转化。 "z!"与字符串用法相同。 @@ -360,15 +402,13 @@ typedef struct _zend_internal_arg_info { ``` 这个结构几乎与zend_arg_info完全一样,不同的地方只在于name、class_name的类型,zend_arg_info这两个成员的类型都是zend_string。如果函数需要使用引用类型的参数或返回引用就需要创建函数的参数数组,这个数组通过:`ZEND_BEGIN_ARG_INFO()或ZEND_BEGIN_ARG_INFO_EX()`、`ZEND_END_ARG_INFO()`宏定义: ```c -#define ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(name, return_reference, required_num_args, type, class_name, allow_null) #define ZEND_BEGIN_ARG_INFO_EX(name, _unused, return_reference, required_num_args) #define ZEND_BEGIN_ARG_INFO(name, _unused) ``` * __name:__ 参数数组名,注册函数`PHP_FE(function, arg_info)`会用到 * ___unused:__ 保留值,暂时无用 -* __return_reference:__ 返回值是否为引用 +* __return_reference:__ 返回值是否为引用,一般很少会用到 * __required_num_args:__ required参数数 -* __type:__ 返回值类型 这两个宏需要与`ZEND_END_ARG_INFO()`配合使用: ```c @@ -415,6 +455,7 @@ ZEND_END_ARG_INFO() 展开后: ```c static const zend_internal_arg_info name[] = { + //多出来的这个是给返回值用的 { (const char*)(zend_uintptr_t)(2), NULL, 0, 0, 0, 0 }, { "a", NULL, 0, 0, 0, 0 }, { "b", "Exception", 8, 1, 0, 0 }, @@ -546,5 +587,155 @@ array(0) { #define RETURN_TRUE { RETVAL_TRUE; return; } ``` ### 7.6.5 函数调用 +实际应用中,扩展可能需要调用用户自定义的函数或者其他扩展定义的内部函数,前面章节已经介绍过函数的执行过程,这里不再重复,本节只介绍下PHP提供的函数调用API的使用: +```c +ZEND_API int call_user_function(HashTable *function_table, zval *object, zval *function_name, zval *retval_ptr, uint32_t param_count, zval params[]); +``` +各参数的含义: +* __function_table:__ 函数符号表,普通函数是EG(function_table),如果是成员方法则是zend_class_entry.function_table +* __object:__ 调用成员方法时的对象 +* __function_name:__ 调用的函数名称 +* __retval_ptr:__ 函数返回值地址 +* __param_count:__ 参数数量 +* __params:__ 参数数组 + +从接口的定义看其使用还是很简单的,不需要我们关心执行过程中各阶段复杂的操作。下面从一个具体的例子看下其使用: + +(1)在PHP中定义了一个普通的函数,将参数$i加上100后返回: +```php +function mySum($i){ + return $i+100; +} +``` +(2)接下来在扩展中调用这个函数: +```c +PHP_FUNCTION(my_func_1) +{ + zend_long i; + zval call_func_name, call_func_ret, call_func_params[1]; + uint32_t call_func_param_cnt = 1; + zend_string *call_func_str; + char *func_name = "mySum"; + + if(zend_parse_parameters(ZEND_NUM_ARGS(), "l", &i) == FAILURE){ + RETURN_FALSE; + } + + //分配zend_string:调用完需要释放 + call_func_str = zend_string_init(func_name, strlen(func_name), 0); + //设置到zval + ZVAL_STR(&call_func_name, call_func_str); + + //设置参数 + ZVAL_LONG(&call_func_params[0], i); + + //call + if(SUCCESS != call_user_function(EG(function_table), NULL, &call_func_name, &call_func_ret, call_func_param_cnt, call_func_params)){ + zend_string_release(call_func_str); + RETURN_FALSE; + } + zend_string_release(call_func_str); + RETURN_LONG(Z_LVAL(call_func_ret)); +} +``` +(3)最后调用这个内部函数: +```php +function mySum($i){ + return $i+100; +} + +echo my_func_1(60); +===========[output]=========== +160 +``` +`call_user_function()`并不是只能调用PHP脚本中定义的函数,内核或其它扩展注册的函数同样可以通过此函数调用,比如:array_merge()。 +```c +PHP_FUNCTION(my_func_1) +{ + zend_array *arr1, *arr2; + zval call_func_name, call_func_ret, call_func_params[2]; + uint32_t call_func_param_cnt = 2; + zend_string *call_func_str; + char *func_name = "array_merge"; + + if(zend_parse_parameters(ZEND_NUM_ARGS(), "hh", &arr1, &arr2) == FAILURE){ + RETURN_FALSE; + } + //分配zend_string + call_func_str = zend_string_init(func_name, strlen(func_name), 0); + //设置到zval + ZVAL_STR(&call_func_name, call_func_str); + + ZVAL_ARR(&call_func_params[0], arr1); + ZVAL_ARR(&call_func_params[1], arr2); + + if(SUCCESS != call_user_function(EG(function_table), NULL, &call_func_name, &call_func_ret, call_func_param_cnt, call_func_params)){ + zend_string_release(call_func_str); + RETURN_FALSE; + } + zend_string_release(call_func_str); + RETURN_ARR(Z_ARRVAL(call_func_ret)); +} +``` +```php +$arr1 = array(1,2); +$arr2 = array(3,4); + +$arr = my_func_1($arr1, $arr2); +var_dump($arr); +``` +你可能会注意到,上面的例子通过`call_user_function()`调用函数时并没有增加两个数组参数的引用计数,但根据前面介绍的内容:函数传参时不会硬拷贝value,而是增加参数value的引用计数,然后在函数return阶段再把引用减掉。实际是`call_user_function()`替我们完成了这个工作,下面简单看下其处理过程。 +```c +int call_user_function(HashTable *function_table, zval *object, zval *function_name, zval *retval_ptr, uint32_t param_count, zval params[]) +{ + return call_user_function_ex(function_table, object, function_name, retval_ptr, param_count, params, 1, NULL); +} +int call_user_function_ex(HashTable *function_table, zval *object, zval *function_name, zval *retval_ptr, uint32_t param_count, zval params[], int no_separation, zend_array *symbol_table) +{ + zend_fcall_info fci; + + fci.size = sizeof(fci); + fci.function_table = function_table; + fci.object = object ? Z_OBJ_P(object) : NULL; + ZVAL_COPY_VALUE(&fci.function_name, function_name); + fci.retval = retval_ptr; + fci.param_count = param_count; + fci.params = params; + fci.no_separation = (zend_bool) no_separation; + fci.symbol_table = symbol_table; + + return zend_call_function(&fci, NULL); +} +``` +`call_user_function()`将我们提供的参数组装为`zend_fcall_info`结构,然后调用`zend_call_function()`进行处理,还记得`zend_parse_parameters()`那个"f"解析符吗?它也是将输入的函数名称解析为一个`zend_fcall_info`,可以更方便的调用函数,同时我们也可以自己创建一个`zend_fcall_info`结构,然后使用`zend_call_function()`完成函数的调用。 +```c +int zend_call_function(zend_fcall_info *fci, zend_fcall_info_cache *fci_cache) +{ + ... + for (i=0; iparam_count; i++) { + zval *param; + zval *arg = &fci->params[i]; + ... + //为参数添加引用 + if (Z_OPT_REFCOUNTED_P(arg)) { + Z_ADDREF_P(arg); + } + } + ... + //调用的是用户函数 + if (func->type == ZEND_USER_FUNCTION) { + //执行 + zend_init_execute_data(call, &func->op_array, fci->retval); + zend_execute_ex(call); + }else if (func->type == ZEND_INTERNAL_FUNCTION){ //内部函数 + if (EXPECTED(zend_execute_internal == NULL)) { + func->internal_function.handler(call, fci->retval); + } else { + zend_execute_internal(call, fci->retval); + } + } + ... +} +``` From 5ad155fcef4e5a0e2e4c54909c8d8abc873b9a2e Mon Sep 17 00:00:00 2001 From: qinpeng Date: Sat, 27 May 2017 13:26:45 +0800 Subject: [PATCH 288/379] finish function --- 3/function_implement.md | 2 +- README.md | 9 ++++++--- img/internal_func_param.png | Bin 29284 -> 32873 bytes 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/3/function_implement.md b/3/function_implement.md index 921ad01..5373d41 100644 --- a/3/function_implement.md +++ b/3/function_implement.md @@ -93,7 +93,7 @@ typedef struct _zend_arg_info { zend_uchar type_hint; //显式声明的参数类型,比如(array $param_1) zend_uchar pass_by_reference; //是否引用传参,参数前加&的这个值就是1 zend_bool allow_null; //是否允许为NULL,注意:这个值并不是用来表示参数是否为必传的 - zend_bool is_variadic; //是否为可变参数,即...用法,与golang的用法相同,5.6以上新增的一个用法 + zend_bool is_variadic; //是否为可变参数,即...用法,与golang的用法相同,5.6以上新增的一个用法:function my_func($a, ...$b){...} } zend_arg_info; ``` 每个参数都有一个上面的结构,所有参数的结构保存在`zend_op_array.arg_info`数组中,这里有一个地方需要注意:`zend_op_array->arg_info`数组保存的并不全是输入参数,如果函数声明了返回值类型则也会为它创建一个`zend_arg_info`,这个结构在arg_info数组的第一个位置,这种情况下`zend_op_array->arg_info`指向的实际是数组的第二个位置,返回值的结构通过`zend_op_array->arg_info[-1]`读取,这里先单独看下编译时的处理: diff --git a/README.md b/README.md index 50f7eac..09af586 100644 --- a/README.md +++ b/README.md @@ -60,9 +60,12 @@ * [7.5 运行时配置](7/conf.md) * [7.5.1 全局变量](7/conf.md) * [7.5.2 ini配置](7/conf.md) - * 7.6 函数 - * [7.6.1 内部函数](7/func.md) - * 7.6.2 调用用户函数 + * [7.6 函数](7/func.md) + * 7.6.1 内部函数注册 + * 7.6.2 函数参数解析 + * 7.6.3 引用传参 + * 7.6.4 函数返回值 + * 7.6.5 函数调用 * 7.7 变量的操作 * 7.9 面向对象 * 7.6.1 扩展中创建对象 diff --git a/img/internal_func_param.png b/img/internal_func_param.png index 28fc04970a6c89e33c5f574b2e00b38e29fd785a..ee11322d520dc26e1e7958660fb2c18a3bd6d369 100644 GIT binary patch literal 32873 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
Aoo=;!WAX_@f0!TdJQGf(Y6Fdpc;;vetH9f`r z%1Rh_D39xlux7S5uEU0mGZWyf*!YaJR_vwIqobVM&;bLC!Ic~Zcf_#+%NG#)%p$gQ zV83W%67(T@2Na(rU-@UEkNZR|WhbxK87g5_#)HSW5R|33 zzSFPFtY7e~HH{6zp_agtlN7y>y;;!6MJ&9@~4jC=g<8q zl#T+Zz#R~!YtEye-vwL^lCPalxQGN+!}?x(?3XNA-0H|oL<2ly;&-)IGY$_1FX_U} z*_NZeXI=%%h3{Us1w{eZoPVrDgrRx*wKK8;xWilEhSB3yhFUZ1U%O#Whv8X4O6D;) z?EN$RG%jCc8vymNgJ!f;3+Gd*t52a*M&%%pQMZlsq{(d4QVEt>(XXynasoL zhodaFLzKiE-;oL}{I*~Q!gl?g@M0~-jR3fu6v7?K}1>t!#rwdyeS|YqXWqJAdZ0ICP(B4Aq9hu$l=6&wmgE-TZ z(tT!Uu5OYt7L;Wi+&2`jAM}xr9zKfeaW3gaBKB+!@Ad2hcRPQChK33+&)oj2dU^2L ztGaL0=;K(mo!KT3*apl|F3vsYouGY`#u}uBe~)UGwFvDv->!aUaqj_J&AaU>6$qKU ztS7fIb$>v3l@>u15-$A$LY3>nuRDjS=L;ujgeAfg-&G$cg+mlA*A&?8W0EM@gVQKX zBmG=Fc1UbRc5ztUjv;%XGE^gt<sG^I=rZ1DltIvot(hJV2q0Gy!T zagJ)TfYrus8Dnqe)JhpUyQWG}~{cKD&F@4uVl5 zn2YRqX_mX_&^lL+W9T%~NNT5II{6^B9QAYfP zUL;?ESYl_{eBOJAcg<}!+W&newKQ(}gG@4m-oWkuy~HIMrnRk|ni^Ra^!s(R3^X5* HZG-<0@F5|y From f91fecdab0a2fab3945626589478e18b5a55cf4d Mon Sep 17 00:00:00 2001 From: qinpeng Date: Sat, 27 May 2017 15:12:46 +0800 Subject: [PATCH 289/379] add var --- 7/var.md | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 7/var.md diff --git a/7/var.md b/7/var.md new file mode 100644 index 0000000..f21886e --- /dev/null +++ b/7/var.md @@ -0,0 +1,33 @@ +## 7.7 zval的操作 +扩展中经常会用到各种类型的zval,PHP提供了很多宏用于不同类型zval的操作,尽管我们也可以自己操作zval,但这并不是一个好习惯,因为zval有很多其它用途的标识,如果自己去管理这些值将是非常繁琐的一件事,所以我们应该使用PHP提供的这些宏来操作用到的zval。 + +本节提到的zval泛指zval及各种zend_value。 + +### 7.7.1 生成不同类型的zval +PHP7将变量的引用计数转移到了具体的value上,所以zval更多的是作为统一的传输格式,很多情况下只是临时性使用,比如函数调用时的传参,最终需要的数据是zval携带的zend_value,函数从zval取得zend_value后就不再关心zval了,这种就可以直接在栈上分配zval。分配完zval后需要将其设置为我们需要的类型以及设置其zend_value,PHP中定义的`ZVAL_XXX()`系列宏就是用来干这个的,这些宏第一个参数z均为要设置的zval的指针,后面为要设置的zend_value。 + +* __ZVAL_UNDEF(z):__ 表示zval被销毁 +* __ZVAL_NULL(z):__ 设置为NULL +* __ZVAL_FALSE(z):__ 设置为false +* __ZVAL_TRUE(z):__ 设置为true +* __ZVAL_BOOL(z, b):__ 设置为布尔型,b为IS_TRUE、IS_FALSE,与上面两个等价 +* __ZVAL_LONG(z, l):__ 设置为整形,l类型为zend_long,如:`zval z; ZVAL_LONG(&z, 88);` +* __ZVAL_DOUBLE(z, d):__ 设置为浮点型,d类型为double +* __ZVAL_STR(z, s):__ 设置字符串,将z的value设置为s,s类型为zend_string*,不会增加s的refcount,支持interned strings +* __ZVAL_NEW_STR(z, s):__ 同ZVAL_STR(z, s),s为普通字符串,不支持interned strings +* __ZVAL_STR_COPY(z, s):__ 将s拷贝到z的value,s类型为zend_string*,同ZVAL_STR(z, s),这里会增加s的refcount +* __ZVAL_ARR(z, a):__ 设置为数组,a类型为zend_array* +* __ZVAL_NEW_ARR(z):__ 新分配一个数组,主动分配一个zend_array +* __ZVAL_NEW_PERSISTENT_ARR(z):__ 创建持久化数组,通过malloc分配,需要手动释放 +* __ZVAL_OBJ(z, o):__ 设置为对象,o类型为zend_object* +* __ZVAL_RES(z, r):__ 设置为资源,r类型为zend_resource* +* __ZVAL_NEW_RES(z, h, p, t):__ 新创建一个资源,h为资源handle,t为type,p为资源ptr指向结构 +* __ZVAL_REF(z, r):__ 设置为引用,r类型为zend_reference* +* __ZVAL_NEW_EMPTY_REF(z):__ 新创建一个空引用,没有设置具体引用的value +* __ZVAL_NEW_REF(z, r):__ 新创建一个引用,r为引用的值,类型为zval* +* ... + +### 7.7.2 获取zval的值 + +### 7.7.3 引用计数 + From ea143bcf90d5f7cc4e2bf379f9a16d962f92576f Mon Sep 17 00:00:00 2001 From: qinpeng Date: Sat, 27 May 2017 19:23:05 +0800 Subject: [PATCH 290/379] add var --- 7/var.md | 82 +++++++++++++++++++++++++++++++++++++++++++++++++++++-- README.md | 7 ++++- 2 files changed, 86 insertions(+), 3 deletions(-) diff --git a/7/var.md b/7/var.md index f21886e..9e9d33b 100644 --- a/7/var.md +++ b/7/var.md @@ -3,7 +3,7 @@ 本节提到的zval泛指zval及各种zend_value。 -### 7.7.1 生成不同类型的zval +### 7.7.1 新生成各类型zval PHP7将变量的引用计数转移到了具体的value上,所以zval更多的是作为统一的传输格式,很多情况下只是临时性使用,比如函数调用时的传参,最终需要的数据是zval携带的zend_value,函数从zval取得zend_value后就不再关心zval了,这种就可以直接在栈上分配zval。分配完zval后需要将其设置为我们需要的类型以及设置其zend_value,PHP中定义的`ZVAL_XXX()`系列宏就是用来干这个的,这些宏第一个参数z均为要设置的zval的指针,后面为要设置的zend_value。 * __ZVAL_UNDEF(z):__ 表示zval被销毁 @@ -27,7 +27,85 @@ PHP7将变量的引用计数转移到了具体的value上,所以zval更多的 * __ZVAL_NEW_REF(z, r):__ 新创建一个引用,r为引用的值,类型为zval* * ... -### 7.7.2 获取zval的值 +### 7.7.2 获取zval的值及类型 +zval的类型通过`Z_TYPE(zval)`、`Z_TYPE_P(zval*)`两个宏获取,这个值取的就是`zval.u1.v.type`,但是设置时不要只修改这个type,而是要设置typeinfo,因为zval还有其它的标识需要设置,比如是否使用引用计数、是否可被垃圾回收、是否可被复制等等。 +内核提供了`Z_XXX(zval)`、`Z_XXX_P(zval*)`系列的宏用于获取不同类型zval的value。 + +* __Z_LVAL(zval)、Z_LVAL_P(zval_p):__ 返回zend_long +* __Z_DVAL(zval)、Z_DVAL_P(zval_p):__ 返回double +* __Z_STR(zval)、Z_STR_P(zval_p):__ 返回zend_string* +* __Z_STRVAL(zval)、Z_STRVAL_P(zval_p):__ 返回char*,即:zend_string->val +* __Z_STRLEN(zval)、Z_STRLEN_P(zval_p):__ 获取字符串长度 +* __Z_STRHASH(zval)、Z_STRHASH_P(zval_p):__ 获取字符串的哈希值 +* __Z_ARR(zval)、Z_ARR_P(zval_p)、Z_ARRVAL(zval)、Z_ARRVAL_P(zval_p):__ 返回zend_array* +* __Z_OBJ(zval)、Z_OBJ_P(zval_p):__ 返回zend_object* +* __Z_OBJ_HT(zval)、Z_OBJ_HT_P(zval_p):__ 返回对象的zend_object_handlers,即zend_object->handlers +* __Z_OBJ_HANDLER(zval, hf)、Z_OBJ_HANDLER_P(zv_p, hf):__ 获取对象各操作的handler指针,hf为write_property、read_property等,注意:这个宏取到的为只读,不要试图修改这个值(如:Z_OBJ_HANDLER(obj, write_property) = xxx;),因为对象的handlers成员前加了const修饰符 +* __Z_OBJCE(zval)、Z_OBJCE_P(zval_p):__ 返回对象的zend_class_entry* +* __Z_OBJPROP(zval)、Z_OBJPROP_P(zval_p):__ 获取对象的成员数组 +* __Z_RES(zval)、Z_RES_P(zval_p):__ 返回zend_resource* +* __Z_RES_HANDLE(zval)、Z_RES_HANDLE_P(zval_p):__ 返回资源handle +* __Z_RES_TYPE(zval)、Z_RES_TYPE_P(zval_p):__ 返回资源type +* __Z_RES_VAL(zval)、Z_RES_VAL_P(zval_p):__ 返回资源ptr +* __Z_REF(zval)、Z_REF_P(zval_p):__ 返回zend_reference* +* __Z_REFVAL(zval)、Z_REFVAL_P(zval_p):__ 返回引用的zval* + +除了这些与PHP变量类型相关的宏之外,还有一些内核自己使用类型的宏: +```c +//获取indirect的zval,指向另一个zval +#define Z_INDIRECT(zval) (zval).value.zv +#define Z_INDIRECT_P(zval_p) Z_INDIRECT(*(zval_p)) + +#define Z_CE(zval) (zval).value.ce +#define Z_CE_P(zval_p) Z_CE(*(zval_p)) + +#define Z_FUNC(zval) (zval).value.func +#define Z_FUNC_P(zval_p) Z_FUNC(*(zval_p)) + +#define Z_PTR(zval) (zval).value.ptr +#define Z_PTR_P(zval_p) Z_PTR(*(zval_p)) +``` +zend_string常用的宏: +```c +//zstr类型为zend_string* +#define ZSTR_VAL(zstr) (zstr)->val +#define ZSTR_LEN(zstr) (zstr)->len +#define ZSTR_H(zstr) (zstr)->h +#define ZSTR_HASH(zstr) zend_string_hash_val(zstr) +``` ### 7.7.3 引用计数 +```c +//获取引用数:pz类型为zval* +#define Z_REFCOUNT_P(pz) zval_refcount_p(pz) +//设置引用数 +#define Z_SET_REFCOUNT_P(pz, rc) zval_set_refcount_p(pz, rc) +//增加引用 +#define Z_ADDREF_P(pz) zval_addref_p(pz) +//减少引用 +#define Z_DELREF_P(pz) zval_delref_p(pz) + +#define Z_REFCOUNT(z) Z_REFCOUNT_P(&(z)) +#define Z_SET_REFCOUNT(z, rc) Z_SET_REFCOUNT_P(&(z), rc) +#define Z_ADDREF(z) Z_ADDREF_P(&(z)) +#define Z_DELREF(z) Z_DELREF_P(&(z)) + +//只对使用了引用计数的变量类型增加引用,建议使用这个 +#define Z_TRY_ADDREF_P(pz) do { \ + if (Z_REFCOUNTED_P((pz))) { \ + Z_ADDREF_P((pz)); \ + } \ +} while (0) + +#define Z_TRY_DELREF_P(pz) do { \ + if (Z_REFCOUNTED_P((pz))) { \ + Z_DELREF_P((pz)); \ + } \ +} while (0) + +#define Z_TRY_ADDREF(z) Z_TRY_ADDREF_P(&(z)) +#define Z_TRY_DELREF(z) Z_TRY_DELREF_P(&(z)) +``` + +### 7.7.4 数组操作 diff --git a/README.md b/README.md index 09af586..a079a27 100644 --- a/README.md +++ b/README.md @@ -66,7 +66,12 @@ * 7.6.3 引用传参 * 7.6.4 函数返回值 * 7.6.5 函数调用 - * 7.7 变量的操作 + * [7.7 zval的操作](7/var.md) + * [7.7.1 新生成各类型zval](7/var.md) + * [7.7.2 获取zval的值及类型](7/var.md) + * [7.7.3 引用计数](7/var.md) + * [7.7.4 数组操作](7/var.md) + * 7.8 常量 * 7.9 面向对象 * 7.6.1 扩展中创建对象 * 7.6.2 创建内部类 From 43af2f3d86547c4e8aae12dca20876ae8f78b747 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Tue, 30 May 2017 19:36:51 +0800 Subject: [PATCH 291/379] update --- 7/var.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/7/var.md b/7/var.md index 9e9d33b..e017101 100644 --- a/7/var.md +++ b/7/var.md @@ -109,3 +109,7 @@ zend_string常用的宏: ### 7.7.4 数组操作 +```c +ZVAL_NEW_ARR(array); +zend_hash_init(Z_ARRVAL_P(array), size, NULL, ZVAL_PTR_DTOR, 0); +``` From 7b66791ba4f8dd8dd713ec57b69f5a1b2d1b2133 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Wed, 31 May 2017 14:30:36 +0800 Subject: [PATCH 292/379] update --- 7/var.md | 74 ++++++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 61 insertions(+), 13 deletions(-) diff --git a/7/var.md b/7/var.md index e017101..7dfa28d 100644 --- a/7/var.md +++ b/7/var.md @@ -1,8 +1,6 @@ ## 7.7 zval的操作 扩展中经常会用到各种类型的zval,PHP提供了很多宏用于不同类型zval的操作,尽管我们也可以自己操作zval,但这并不是一个好习惯,因为zval有很多其它用途的标识,如果自己去管理这些值将是非常繁琐的一件事,所以我们应该使用PHP提供的这些宏来操作用到的zval。 -本节提到的zval泛指zval及各种zend_value。 - ### 7.7.1 新生成各类型zval PHP7将变量的引用计数转移到了具体的value上,所以zval更多的是作为统一的传输格式,很多情况下只是临时性使用,比如函数调用时的传参,最终需要的数据是zval携带的zend_value,函数从zval取得zend_value后就不再关心zval了,这种就可以直接在栈上分配zval。分配完zval后需要将其设置为我们需要的类型以及设置其zend_value,PHP中定义的`ZVAL_XXX()`系列宏就是用来干这个的,这些宏第一个参数z均为要设置的zval的指针,后面为要设置的zend_value。 @@ -66,14 +64,6 @@ zval的类型通过`Z_TYPE(zval)`、`Z_TYPE_P(zval*)`两个宏获取,这个值 #define Z_PTR(zval) (zval).value.ptr #define Z_PTR_P(zval_p) Z_PTR(*(zval_p)) ``` -zend_string常用的宏: -```c -//zstr类型为zend_string* -#define ZSTR_VAL(zstr) (zstr)->val -#define ZSTR_LEN(zstr) (zstr)->len -#define ZSTR_H(zstr) (zstr)->h -#define ZSTR_HASH(zstr) zend_string_hash_val(zstr) -``` ### 7.7.3 引用计数 ```c //获取引用数:pz类型为zval* @@ -106,10 +96,68 @@ zend_string常用的宏: #define Z_TRY_ADDREF(z) Z_TRY_ADDREF_P(&(z)) #define Z_TRY_DELREF(z) Z_TRY_DELREF_P(&(z)) ``` +### 7.7.4 字符串操作 +zend_string常用的宏及函数: +```c +//创建zend_string +zend_string *zend_string_init(const char *str, size_t len, int persistent); + +//字符串复制,只增加引用 +zend_string *zend_string_copy(zend_string *s); + +//字符串拷贝,硬拷贝 +zend_string *zend_string_dup(zend_string *s, int persistent); + +//将字符串按len大小重新分配,会减少s的refcount,返回新的字符串 +zend_string *zend_string_realloc(zend_string *s, size_t len, int persistent); + +//延长字符串,与zend_string_realloc()类似,不同的是len不能小于s的长度 +zend_string *zend_string_extend(zend_string *s, size_t len, int persistent); + +//截断字符串,与zend_string_realloc()类似,不同的是len不能大于s的长度 +zend_string *zend_string_truncate(zend_string *s, size_t len, int persistent); -### 7.7.4 数组操作 +//释放字符串,减少refcount,为0时销毁 +void zend_string_release(zend_string *s); +//销毁字符串,不管引用计数是否为0 +void zend_string_free(zend_string *s); + +//比较两个字符串是否相等,区分大小写,memcmp() +zend_bool zend_string_equals(zend_string *s1, zend_string *s2); + +//比较两个字符串是否相等,不区分大小写 +#define zend_string_equals_ci(s1, s2) \ + (ZSTR_LEN(s1) == ZSTR_LEN(s2) && !zend_binary_strcasecmp(ZSTR_VAL(s1), ZSTR_LEN(s1), ZSTR_VAL(s2), ZSTR_LEN(s2))) + +//其它宏,zstr类型为zend_string* +#define ZSTR_VAL(zstr) (zstr)->val //获取字符串 +#define ZSTR_LEN(zstr) (zstr)->len //获取字符串长度 +#define ZSTR_H(zstr) (zstr)->h //获取字符串哈希值 +#define ZSTR_HASH(zstr) zend_string_hash_val(zstr) //计算字符串哈希值 +``` +### 7.7.5 数组操作 +#### 7.7.5.1 创建数组 +创建一个新的HashTable分为两步:首先是分配zend_array内存,这个可以通过`ZVAL_NEW_ARR()`宏分配,也可以自己直接分配;然后初始化数组,通过`zend_hash_init()`宏完成,如果不进行初始化数组将无法使用。 ```c -ZVAL_NEW_ARR(array); -zend_hash_init(Z_ARRVAL_P(array), size, NULL, ZVAL_PTR_DTOR, 0); +#define zend_hash_init(ht, nSize, pHashFunction, pDestructor, persistent) \ + _zend_hash_init((ht), (nSize), (pDestructor), (persistent) ZEND_FILE_LINE_CC) ``` +* __ht:__ 数组地址HashTable*,如果内部使用可以直接通过emalloc分配 +* __nSize:__ 初始化大小,只是参考值,这个值会被对齐到2^n,最小为8 +* __pHashFunction:__ 无用,设置为NULL即可 +* __pDestructor:__ 销毁或更新数组元素时会回调这个函数处理,比如在函数中创建一个数组返回给PHP用户空间作为变量使用,则需要将这个值设为ZVAL_PTR_DTOR,当变量销毁时将调用此函数进行清理,如果不设置的话可能会造成内存泄漏 +* __persistent:__ 是否持久化 +示例: +```c +zval array; +uint32_t size; + +ZVAL_NEW_ARR(&array); +zend_hash_init(Z_ARRVAL(array), size, NULL, ZVAL_PTR_DTOR, 0); +``` +#### 7.7.5.2 插入、更新元素 + +#### 7.7.5.3 查找元素 + +#### 7.7.5.4 销毁数组 From 724ae5d87c4c12a9dc9320b826252097731f7d74 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Wed, 31 May 2017 16:34:53 +0800 Subject: [PATCH 293/379] update hash --- 7/var.md | 113 +++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 110 insertions(+), 3 deletions(-) diff --git a/7/var.md b/7/var.md index 7dfa28d..e42cd94 100644 --- a/7/var.md +++ b/7/var.md @@ -97,7 +97,7 @@ zval的类型通过`Z_TYPE(zval)`、`Z_TYPE_P(zval*)`两个宏获取,这个值 #define Z_TRY_DELREF(z) Z_TRY_DELREF_P(&(z)) ``` ### 7.7.4 字符串操作 -zend_string常用的宏及函数: +PHP中字符串(即:zend_string)操作相关的宏及函数: ```c //创建zend_string zend_string *zend_string_init(const char *str, size_t len, int persistent); @@ -117,6 +117,15 @@ zend_string *zend_string_extend(zend_string *s, size_t len, int persistent); //截断字符串,与zend_string_realloc()类似,不同的是len不能大于s的长度 zend_string *zend_string_truncate(zend_string *s, size_t len, int persistent); +//获取字符串refcount +uint32_t zend_string_refcount(const zend_string *s); + +//增加字符串refcount +uint32_t zend_string_addref(zend_string *s); + +//减少字符串refcount +uint32_t zend_string_delref(zend_string *s); + //释放字符串,减少refcount,为0时销毁 void zend_string_release(zend_string *s); @@ -146,8 +155,9 @@ zend_bool zend_string_equals(zend_string *s1, zend_string *s2); * __ht:__ 数组地址HashTable*,如果内部使用可以直接通过emalloc分配 * __nSize:__ 初始化大小,只是参考值,这个值会被对齐到2^n,最小为8 * __pHashFunction:__ 无用,设置为NULL即可 -* __pDestructor:__ 销毁或更新数组元素时会回调这个函数处理,比如在函数中创建一个数组返回给PHP用户空间作为变量使用,则需要将这个值设为ZVAL_PTR_DTOR,当变量销毁时将调用此函数进行清理,如果不设置的话可能会造成内存泄漏 +* __pDestructor:__ 删除或更新数组元素时会调用这个函数对操作的元素进行处理,比如将一个字符串插入数组,字符串的refcount增加,删除时不是简单的将元素的Bucket删除就可以了,还需要对其refcount进行处理,这个函数就是进行清理工作的 * __persistent:__ 是否持久化 + 示例: ```c zval array; @@ -157,7 +167,104 @@ ZVAL_NEW_ARR(&array); zend_hash_init(Z_ARRVAL(array), size, NULL, ZVAL_PTR_DTOR, 0); ``` #### 7.7.5.2 插入、更新元素 +数组元素的插入、更新主要有三种情况:key为zend_string、key为普通字符串、key为数值索引,相关的宏及函数: +```c +// 1) key为zend_string + +//插入或更新元素,会增加key的refcount +#define zend_hash_update(ht, key, pData) \ + _zend_hash_update(ht, key, pData ZEND_FILE_LINE_CC) + +//插入或更新元素,当Bucket类型为indirect时,将pData更新至indirect的值,而不是更新Bucket +#define zend_hash_update_ind(ht, key, pData) \ + _zend_hash_update_ind(ht, key, pData ZEND_FILE_LINE_CC) + +//添加元素,与zend_hash_update()类似,不同的地方在于如果元素已经存在则不会更新 +#define zend_hash_add(ht, key, pData) \ + _zend_hash_add(ht, key, pData ZEND_FILE_LINE_CC) + +//直接插入元素,不管key存在与否,如果存在也不覆盖原来元素,而是当做哈希冲突处理,所有会出现一个数组中key相同的情况,慎用!!! +#define zend_hash_add_new(ht, key, pData) \ + _zend_hash_add_new(ht, key, pData ZEND_FILE_LINE_CC) + +// 2) key为普通字符串:char* + +//与上面几个对应,这里的key为普通字符串,会自动生成zend_string的key +#define zend_hash_str_update(ht, key, len, pData) \ + _zend_hash_str_update(ht, key, len, pData ZEND_FILE_LINE_CC) +#define zend_hash_str_update_ind(ht, key, len, pData) \ + _zend_hash_str_update_ind(ht, key, len, pData ZEND_FILE_LINE_CC) +#define zend_hash_str_add(ht, key, len, pData) \ + _zend_hash_str_add(ht, key, len, pData ZEND_FILE_LINE_CC) +#define zend_hash_str_add_new(ht, key, len, pData) \ + _zend_hash_str_add_new(ht, key, len, pData ZEND_FILE_LINE_CC) + +// 3) key为数值索引 + +//插入元素,h为数值 +#define zend_hash_index_add(ht, h, pData) \ + _zend_hash_index_add(ht, h, pData ZEND_FILE_LINE_CC) + +//与zend_hash_add_new()类似 +#define zend_hash_index_add_new(ht, h, pData) \ + _zend_hash_index_add_new(ht, h, pData ZEND_FILE_LINE_CC) + +//更新第h个元素 +#define zend_hash_index_update(ht, h, pData) \ + _zend_hash_index_update(ht, h, pData ZEND_FILE_LINE_CC) + +//使用自动索引值 +#define zend_hash_next_index_insert(ht, pData) \ + _zend_hash_next_index_insert(ht, pData ZEND_FILE_LINE_CC) +#define zend_hash_next_index_insert_new(ht, pData) \ + _zend_hash_next_index_insert_new(ht, pData ZEND_FILE_LINE_CC) +``` #### 7.7.5.3 查找元素 +```c +//根据zend_string key查找数组元素 +ZEND_API zval* ZEND_FASTCALL zend_hash_find(const HashTable *ht, zend_string *key); + +//根据普通字符串key查找元素 +ZEND_API zval* ZEND_FASTCALL zend_hash_str_find(const HashTable *ht, const char *key, size_t len); + +//获取数值索引元素 +ZEND_API zval* ZEND_FASTCALL zend_hash_index_find(const HashTable *ht, zend_ulong h); + +//判断元素是否存在 +ZEND_API zend_bool ZEND_FASTCALL zend_hash_exists(const HashTable *ht, zend_string *key); +ZEND_API zend_bool ZEND_FASTCALL zend_hash_str_exists(const HashTable *ht, const char *str, size_t len); +ZEND_API zend_bool ZEND_FASTCALL zend_hash_index_exists(const HashTable *ht, zend_ulong h); + +//获取数组元素数 +#define zend_hash_num_elements(ht) \ + (ht)->nNumOfElements +//与zend_hash_num_elements()类似,会有一些特殊处理 +ZEND_API uint32_t zend_array_count(HashTable *ht); +``` +#### 7.7.5.4 删除元素 +```c +//删除key +ZEND_API int ZEND_FASTCALL zend_hash_del(HashTable *ht, zend_string *key); + +//与zend_hash_del()类似,不同地方是如果元素类型为indirect则同时销毁indirect的值 +ZEND_API int ZEND_FASTCALL zend_hash_del_ind(HashTable *ht, zend_string *key); +ZEND_API int ZEND_FASTCALL zend_hash_str_del(HashTable *ht, const char *key, size_t len); +ZEND_API int ZEND_FASTCALL zend_hash_str_del_ind(HashTable *ht, const char *key, size_t len); +ZEND_API int ZEND_FASTCALL zend_hash_index_del(HashTable *ht, zend_ulong h); +ZEND_API void ZEND_FASTCALL zend_hash_del_bucket(HashTable *ht, Bucket *p); +``` +#### 7.7.5.5 数组遍历 + + +#### 7.7.5.6 其它操作 +```c +#define zend_hash_merge(target, source, pCopyConstructor, overwrite) \ + _zend_hash_merge(target, source, pCopyConstructor, overwrite ZEND_FILE_LINE_CC) + +#define zend_hash_sort(ht, compare_func, renumber) \ + zend_hash_sort_ex(ht, zend_sort, compare_func, renumber) +``` + +#### 7.7.5.5 销毁数组 -#### 7.7.5.4 销毁数组 From abf42e3e4ef61b4f4bdc07197b22998b6a313e8b Mon Sep 17 00:00:00 2001 From: qinpeng Date: Wed, 31 May 2017 17:37:28 +0800 Subject: [PATCH 294/379] finish var --- 7/var.md | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++----- README.md | 3 ++- 2 files changed, 56 insertions(+), 6 deletions(-) diff --git a/7/var.md b/7/var.md index e42cd94..9869898 100644 --- a/7/var.md +++ b/7/var.md @@ -254,17 +254,66 @@ ZEND_API int ZEND_FASTCALL zend_hash_str_del_ind(HashTable *ht, const char *key, ZEND_API int ZEND_FASTCALL zend_hash_index_del(HashTable *ht, zend_ulong h); ZEND_API void ZEND_FASTCALL zend_hash_del_bucket(HashTable *ht, Bucket *p); ``` -#### 7.7.5.5 数组遍历 - - +#### 7.7.5.5 遍历 +数组遍历类似foreach的用法,在扩展中可以通过如下的方式遍历: +```c +zval *val; +ZEND_HASH_FOREACH_VAL(ht, val) { + ... +} ZEND_HASH_FOREACH_END(); +``` +遍历过程中会把数组元素赋值给val,除了上面这个宏还有很多其他用于遍历的宏,这里列几个比较常用的: +```c +//遍历获取所有的数值索引 +#define ZEND_HASH_FOREACH_NUM_KEY(ht, _h) \ + ZEND_HASH_FOREACH(ht, 0); \ + _h = _p->h; + +//遍历获取所有的key +#define ZEND_HASH_FOREACH_STR_KEY(ht, _key) \ + ZEND_HASH_FOREACH(ht, 0); \ + _key = _p->key; + +//上面两个的聚合 +#define ZEND_HASH_FOREACH_KEY(ht, _h, _key) \ + ZEND_HASH_FOREACH(ht, 0); \ + _h = _p->h; \ + _key = _p->key; + +//遍历获取数值索引key及value +#define ZEND_HASH_FOREACH_NUM_KEY_VAL(ht, _h, _val) \ + ZEND_HASH_FOREACH(ht, 0); \ + _h = _p->h; \ + _val = _z; + +//遍历获取key及value +#define ZEND_HASH_FOREACH_STR_KEY_VAL(ht, _key, _val) \ + ZEND_HASH_FOREACH(ht, 0); \ + _key = _p->key; \ + _val = _z; + +#define ZEND_HASH_FOREACH_KEY_VAL(ht, _h, _key, _val) \ + ZEND_HASH_FOREACH(ht, 0); \ + _h = _p->h; \ + _key = _p->key; \ + _val = _z; +``` #### 7.7.5.6 其它操作 ```c +//合并两个数组,将source合并到target,overwrite为元素冲突时是否覆盖 #define zend_hash_merge(target, source, pCopyConstructor, overwrite) \ _zend_hash_merge(target, source, pCopyConstructor, overwrite ZEND_FILE_LINE_CC) +//导出数组 +ZEND_API HashTable* ZEND_FASTCALL zend_array_dup(HashTable *source); +``` +```c #define zend_hash_sort(ht, compare_func, renumber) \ zend_hash_sort_ex(ht, zend_sort, compare_func, renumber) ``` +数组排序,compare_func为typedef int (*compare_func_t)(const void *, const void *),需要自己定义比较函数,参数类型为Bucket*,renumber表示是否更改键值,如果为1则会在排序后重新生成各元素的h。PHP中的sort()、rsort()、ksort()等都是基于这个函数实现的。 -#### 7.7.5.5 销毁数组 - +#### 7.7.5.7 销毁数组 +```c +ZEND_API void ZEND_FASTCALL zend_array_destroy(HashTable *ht); +``` diff --git a/README.md b/README.md index a079a27..add3a42 100644 --- a/README.md +++ b/README.md @@ -70,7 +70,8 @@ * [7.7.1 新生成各类型zval](7/var.md) * [7.7.2 获取zval的值及类型](7/var.md) * [7.7.3 引用计数](7/var.md) - * [7.7.4 数组操作](7/var.md) + * [7.7.4 字符串操作](7/var.md) + * [7.7.5 数组操作](7/var.md) * 7.8 常量 * 7.9 面向对象 * 7.6.1 扩展中创建对象 From dda249f77c888fb010455c8fa1b4d60b0e4dc85a Mon Sep 17 00:00:00 2001 From: qinpeng Date: Wed, 31 May 2017 18:07:43 +0800 Subject: [PATCH 295/379] update --- 7/contant.md | 46 ++++++++++++++++++++++++++++++++++++++++++++++ README.md | 2 +- 2 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 7/contant.md diff --git a/7/contant.md b/7/contant.md new file mode 100644 index 0000000..13a638f --- /dev/null +++ b/7/contant.md @@ -0,0 +1,46 @@ +## 7.8 常量 +常量的具体实现前面章节已经介绍过,这里不再重复。PHP提供了很多用于常量注册的宏,可以在扩展的`PHP_MINIT_FUNCTION()`中定义: +```c +//注册NULL常量 +#define REGISTER_NULL_CONSTANT(name, flags) \ + zend_register_null_constant((name), sizeof(name)-1, (flags), module_number) + +//注册bool常量 +#define REGISTER_BOOL_CONSTANT(name, bval, flags) \ + zend_register_bool_constant((name), sizeof(name)-1, (bval), (flags), module_number) + +//注册整形常量 +#define REGISTER_LONG_CONSTANT(name, lval, flags) \ + zend_register_long_constant((name), sizeof(name)-1, (lval), (flags), module_number) + +//注册浮点型常量 +#define REGISTER_DOUBLE_CONSTANT(name, dval, flags) \ + zend_register_double_constant((name), sizeof(name)-1, (dval), (flags), module_number) + +//注册字符串常量,str类型为char* +#define REGISTER_STRING_CONSTANT(name, str, flags) \ + zend_register_string_constant((name), sizeof(name)-1, (str), (flags), module_number) + +//注册字符串常量,截取指定长度,str类型为char* +#define REGISTER_STRINGL_CONSTANT(name, str, len, flags) \ + zend_register_stringl_constant((name), sizeof(name)-1, (str), (len), (flags), module_number) +``` +除了上面这些还有`REGISTER_NS_XXX`系列的宏用于带namespace的常量注册,另外如果这些类型不能满足需求,则可以通过`zend_register_constant(zend_constant *c)`注册,比如常量类型为数组。 +```c +PHP_MINIT_FUNCTION(mytest) +{ + ... + + REGISTER_STRING_CONSTANT("MY_CONS_1", "this is a constant", CONST_CS | CONST_PERSISTENT); +} +``` +```php +echo MY_CONS_1; +=========[output]========= +this is a constant +``` +如果在扩展中需要用到其他扩展或内核定义的常量,则可以通过以下函数获取常量的值: +```c +ZEND_API zval *zend_get_constant(zend_string *name); +ZEND_API zval *zend_get_constant_str(const char *name, size_t name_len); +``` diff --git a/README.md b/README.md index add3a42..60435e4 100644 --- a/README.md +++ b/README.md @@ -72,7 +72,7 @@ * [7.7.3 引用计数](7/var.md) * [7.7.4 字符串操作](7/var.md) * [7.7.5 数组操作](7/var.md) - * 7.8 常量 + * [7.8 常量](7/constant.md) * 7.9 面向对象 * 7.6.1 扩展中创建对象 * 7.6.2 创建内部类 From f12b91ef7a32264118a3877f06541a1545e3cf91 Mon Sep 17 00:00:00 2001 From: maben Date: Thu, 1 Jun 2017 19:22:08 +0800 Subject: [PATCH 296/379] Rename contant.md to constant.md --- 7/{contant.md => constant.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename 7/{contant.md => constant.md} (100%) diff --git a/7/contant.md b/7/constant.md similarity index 100% rename from 7/contant.md rename to 7/constant.md From a35aec506ae79db4daf2d162e093a16faac74fb2 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Thu, 1 Jun 2017 19:54:38 +0800 Subject: [PATCH 297/379] update --- 1/base_introduction.md | 23 +++++++++++++---------- 7/func.md | 1 - 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/1/base_introduction.md b/1/base_introduction.md index c2d564f..ca78c99 100644 --- a/1/base_introduction.md +++ b/1/base_introduction.md @@ -1,4 +1,4 @@ -## 1.1 PHP简介 +## 1.1 PHP概述 ### 1.1.1 PHP的历史发展 PHP是一种非常流行的高级脚本语言,尤其适合Web开发,快速、灵活和实用是PHP最重要的特点。PHP自1995年由Lerdorf创建以来,在全球得到了非常广泛的应用。 @@ -9,7 +9,7 @@ PHP是一种非常流行的高级脚本语言,尤其适合Web开发,快速 在2000年5月22日,以Zend Engine 1.0为基础的PHP 4正式发布,2004年7月13日则发布了PHP 5,PHP 5则使用了第二代的Zend Engine。PHP包含了许多新特色:完全实现面向对象、引入PDO、以及许多性能方面的改进。目前PHP5.X仍然是应用非常广泛的一个版本。 -### 1.1.2 PHP特点 +### 1.1.2 特性 PHP 独特的语法混合了 C、Java、Perl 以及 PHP 自创新的语法,丰富的语法支持、同时支持面向对象、面向过程,相比C、Java等语言具有语法简洁、使用灵活、开发效率高、容易学习等特点。 * 开源免费:PHP社群有大量活跃的开发者贡献代码 @@ -19,17 +19,20 @@ PHP 独特的语法混合了 C、Java、Perl 以及 PHP 自创新的语法,丰 * 扩展性:允许用户使用C/C++扩展PHP * 跨平台:可以在unix、windows、max os等系统上面使用PHP -## 1.2 PHP7特性 -PHP7在内核方面做了很多优化,大大提高了PHP的性能,比如zval结构以及引用计数的改变节省了内存的使用。接下来我们简单看下PHP7都有哪些比较大的改进。 +### 1.1.3 PHP的相关组成 +#### 1.1.3.1 SAPI +PHP本身可以理解为是一个库函数,提供语言的编译与执行服务,它有标准的输入、输出,而SAPI是PHP的接入层,它接收用户的请求,然后调用PHP内核提供的一些接口完成PHP脚本的执行,所以严格意义上讲SAPI并不算PHP内核的一部分。 +PHP的角色就好比是leveldb,它实现了基本存储功能,但是没有网络处理模块,而我们基于leveldb实现的完整存储服务就好比是SAPI。 -## 1.3 PHP内核的组成 +PHP中常用的SAPI有cli、php-fpm,cli是命令行下执行PHP脚本的实现:`bin/php script.php`,它是单进程的,处理模型比较简单,而php-fpm相对比较复杂,它实现了网络处理模块,用于与web服务器交互。 -### 1.1.1 SAPI -PHP本身可以理解为是一个库函数,它有标准的输入、输出,而SAPI可以认为是PHP的一个使用者,它可以调用PHP内核提供的一些接口,所以严格意义上讲SAPI并不算PHP内核的一部分,最常用的SAPI就是cli、php-fpm这两个了,它们是再普通不过的C程序了,main函数通常也是定义在SAPI中,而PHP就是一个纯碎的解析器。 +#### 1.1.3.2 Zend引擎 +Zend是PHP语言实现的最为重要的部分,是PHP最基础、最核心的部分,它的源码在/Zend目录下,PHP代码从编译到执行都是由Zend完成的,后面章节绝大部分的源码分析都是针对Zend的。Zend整体由两个部分组成: -### 1.1.3 Zend引擎 -Zend是PHP语言实现的核心,比如语法分析、代码执行等等都是Zend引擎实现的,这是PHP最基础、最核心的部分,我们后面绝大部分的源码分析都是针对Zend的。 +* __编译器:__ 负责将PHP代码编译为抽象语法树,然后进一步编译为可执行的opcodes,这个过程相当于GCC的工作,编译器是一个语言实现的基础 +* __执行器:__ 负责执行编译器输出的opcodes,也就是执行PHP脚本中编写的代码逻辑 + +#### 1.1.3.3 扩展 -## 1.4 PHP执行的几个阶段 diff --git a/7/func.md b/7/func.md index 20e2ab0..0807f69 100644 --- a/7/func.md +++ b/7/func.md @@ -1,5 +1,4 @@ ## 7.6 函数 - ### 7.6.1 内部函数注册 通过扩展可以将C语言实现的函数提供给PHP脚本使用,如同大量PHP内置函数一样,这些函数统称为内部函数(internal function),与PHP脚本中定义的用户函数不同,它们无需经历用户函数的编译过程,同时执行时也不像用户函数那样每一个指令都调用一次C语言编写的handler函数,因此,内部函数的执行效率更高。除了性能上的优势,内部函数还可以拥有更高的控制权限,可发挥的作用也更大,能够完成很多用户函数无法实现的功能。 From 793759b774c7738f24e0e63ff4a176e20ca87a4a Mon Sep 17 00:00:00 2001 From: eric Date: Fri, 2 Jun 2017 11:18:23 +0800 Subject: [PATCH 298/379] Update zval.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修正类型 --- 2/zval.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2/zval.md b/2/zval.md index afe479b..a0e2b22 100644 --- a/2/zval.md +++ b/2/zval.md @@ -60,7 +60,7 @@ struct _zval_struct { }; ``` `zval`结构比较简单,内嵌一个union类型的`zend_value`保存具体变量类型的值或指针,`zval`中还有两个union:`u1`、`u2`: -* __u1:__ 它的意义比较直观,变量的类型就通过`u1.type`区分,另外一个值`type_flags`为类型掩码,在变量的内存管理、gc机制中会用到,第三部分会详细分析,至于后面两个`const_flags`、`reserved`暂且不管 +* __u1:__ 它的意义比较直观,变量的类型就通过`u1.v.type`区分,另外一个值`type_flags`为类型掩码,在变量的内存管理、gc机制中会用到,第三部分会详细分析,至于后面两个`const_flags`、`reserved`暂且不管 * __u2:__ 这个值纯粹是个辅助值,假如`zval`只有:`value`、`u1`两个值,整个zval的大小也会对齐到16byte,既然不管有没有u2大小都是16byte,把多余的4byte拿出来用于一些特殊用途还是很划算的,比如next在哈希表解决哈希冲突时会用到,还有fe_pos在foreach会用到...... 从`zend_value`可以看出,除`long`、`double`类型直接存储值外,其它类型都为指针,指向各自的结构。 From 1a6ef79382f77dadc9a43f05227093ee1a747c99 Mon Sep 17 00:00:00 2001 From: maben Date: Fri, 2 Jun 2017 18:15:09 +0800 Subject: [PATCH 299/379] update --- 3/zend_compile_opcode.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/3/zend_compile_opcode.md b/3/zend_compile_opcode.md index f48e7da..a8fde50 100644 --- a/3/zend_compile_opcode.md +++ b/3/zend_compile_opcode.md @@ -245,7 +245,7 @@ int main() return 0; } ``` -我们知道name的值分配在栈上,而"pangudashu"分配在常量区,那么"name"变量名分配在哪呢? +我们知道指针name分配在栈上,而"pangudashu"分配在常量区,那么"name"变量名分配在哪呢? 实际上C里面是不会存变量名称的,编译的过程会将变量名替换为偏移量表示:`ebp - 偏移量`或`esp + 偏移量`,将上面的代码转为汇编: ```c @@ -272,7 +272,7 @@ main: ![php vs c](../img/php_vs_c.png) -在编译时就可确定且不会改变的量称为字面量,也称作常量(IS_CONST),这些值在编译阶段就已经分配zval,保存在`zend_op_array->literals`数组中(对应c程序的常量内存区),访问时通过`_zend_op_array->literals + 偏移量`读取,举个例子: +在编译时就可确定且不会改变的量称为字面量,也称作常量(IS_CONST),这些值在编译阶段就已经分配zval,保存在`zend_op_array->literals`数组中(对应c程序的常量存储区),访问时通过`_zend_op_array->literals + 偏移量`读取,举个例子: ```c kind) { case xxx: ... - break; + break; case ZEND_AST_ECHO: zend_compile_echo(ast); break; - ... + ... default: { znode result; From 7ea4b9cdfcadc185c4e1e113eb6d7fb8a80c243d Mon Sep 17 00:00:00 2001 From: iam2c <1584684300@qq.com> Date: Fri, 2 Jun 2017 18:28:39 +0800 Subject: [PATCH 300/379] Update include.md --- 4/include.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/4/include.md b/4/include.md index 8df3fd2..3e54ec8 100644 --- a/4/include.md +++ b/4/include.md @@ -94,7 +94,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INCLUDE_OR_EVAL_SPEC_CONST_HAN ![](../img/include_2.png) -> 注意:这里include文件中定义的var_1实际是替换了原文件中的变量,也就是只有一个var_1,所以此处zend_array的引用是1而不是2 +> 注意:这里include文件中定义的var_2实际是替换了原文件中的变量,也就是只有一个var_2,所以此处zend_array的引用是1而不是2 接下来就是被包含文件的执行,执行到`$var_2 = array()`时,将原array(1,2,3)引用减1变为0,这时候将其释放,然后将新的value:array()赋给$var_2,这个过程就是普通变量的赋值过程,注意此时调用文件中的$var_2仍然指向被释放掉的value,此时的内存关系: From c9554e35855ef4ea721f8991c3f666a001f3e2cf Mon Sep 17 00:00:00 2001 From: eric Date: Fri, 2 Jun 2017 20:41:40 +0800 Subject: [PATCH 301/379] Update zend_ht.md --- 2/zend_ht.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2/zend_ht.md b/2/zend_ht.md index 335c700..7014515 100644 --- a/2/zend_ht.md +++ b/2/zend_ht.md @@ -155,7 +155,7 @@ static void ZEND_FASTCALL zend_hash_do_resize(HashTable *ht) ``` ### 2.2.6 重建散列表 -当删除元素达到一定数量或扩容后都需要重建散列表,因为value在Bucket位置移动了或哈希数组nTableSize变化了导致key与value的映射关系改变,重建过程实际就是遍历Bucket数组中的value,然后重新计算映射值更新到散列表,除了更新散列表之外,这里还有一个重要的处理:移除已删除的value,开始的时候我们说过,删除value时只是将value的type表为了IS_UNDEF,并没有实际从Bucket数组中删除,如果这些value一直存在那么将浪费很多空间,所以这里会把它们移除,操作的方式也比较简单:将后面未删除的value依次前移,具体过程如下: +当删除元素达到一定数量或扩容后都需要重建散列表,因为value在Bucket位置移动了或哈希数组nTableSize变化了导致key与value的映射关系改变,重建过程实际就是遍历Bucket数组中的value,然后重新计算映射值更新到散列表,除了更新散列表之外,这里还有一个重要的处理:移除已删除的value,开始的时候我们说过,删除value时只是将value的type变为了IS_UNDEF,并没有实际从Bucket数组中删除,如果这些value一直存在那么将浪费很多空间,所以这里会把它们移除,操作的方式也比较简单:将后面未删除的value依次前移,具体过程如下: ```c //zend_hash.c ZEND_API int ZEND_FASTCALL zend_hash_rehash(HashTable *ht) From 7b6d44cae77d127dd112503cd74eae73a6329c3c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=9B=98=E5=8F=A4=E5=A4=A7=E5=8F=94?= Date: Sat, 3 Jun 2017 09:33:04 +0800 Subject: [PATCH 302/379] Update zend_ht.md --- 2/zend_ht.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/2/zend_ht.md b/2/zend_ht.md index 7014515..95d8177 100644 --- a/2/zend_ht.md +++ b/2/zend_ht.md @@ -38,7 +38,7 @@ struct _zend_array { dtor_func_t pDestructor; }; ``` -HashTable中有两个非常相近的值:`nNumUsed`、`nNumOfElements`,`nNumOfElements`表示哈希表已有元素数,那这个值不跟`nNumUsed`一样吗?为什么要定义两个呢?实际上它们有不同的含义,当将一个元素从哈希表删除时并不会将对应的Bucket移除,而是将Bucket存储的zval标示为`IS_UNDEF`,只有扩容时发现nNumOfElements与nNumUsed相差达到一定数量(这个数量是:`ht->nNumUsed - ht->nNumOfElements > (ht->nNumOfElements >> 5)`)时才会将已删除的元素全部移除,重新构建哈希表。所以`nNumUsed`>=`nNumOfElements`。 +HashTable中有两个非常相近的值:`nNumUsed`、`nNumOfElements`,`nNumOfElements`表示哈希表已有元素数,那这个值不跟`nNumUsed`一样吗?为什么要定义两个呢?实际上它们有不同的含义,当将一个元素从哈希表删除时并不会将对应的Bucket移除,而是将Bucket存储的zval修改为`IS_UNDEF`,只有扩容时发现nNumOfElements与nNumUsed相差达到一定数量(这个数量是:`ht->nNumUsed - ht->nNumOfElements > (ht->nNumOfElements >> 5)`)时才会将已删除的元素全部移除,重新构建哈希表。所以`nNumUsed`>=`nNumOfElements`。 HashTable中另外一个非常重要的值`arData`,这个值指向存储元素数组的第一个Bucket,插入元素时按顺序 __依次插入__ 数组,比如第一个元素在arData[0]、第二个在arData[1]...arData[nNumUsed]。PHP数组的有序性正是通过`arData`保证的,这是第一个与普通散列表实现不同的地方。 @@ -155,7 +155,7 @@ static void ZEND_FASTCALL zend_hash_do_resize(HashTable *ht) ``` ### 2.2.6 重建散列表 -当删除元素达到一定数量或扩容后都需要重建散列表,因为value在Bucket位置移动了或哈希数组nTableSize变化了导致key与value的映射关系改变,重建过程实际就是遍历Bucket数组中的value,然后重新计算映射值更新到散列表,除了更新散列表之外,这里还有一个重要的处理:移除已删除的value,开始的时候我们说过,删除value时只是将value的type变为了IS_UNDEF,并没有实际从Bucket数组中删除,如果这些value一直存在那么将浪费很多空间,所以这里会把它们移除,操作的方式也比较简单:将后面未删除的value依次前移,具体过程如下: +当删除元素达到一定数量或扩容后都需要重建散列表,因为value在Bucket位置移动了或哈希数组nTableSize变化了导致key与value的映射关系改变,重建过程实际就是遍历Bucket数组中的value,然后重新计算映射值更新到散列表,除了更新散列表之外,这里还有一个重要的处理:移除已删除的value,开始的时候我们说过,删除value时只是将value的type设置为IS_UNDEF,并没有实际从Bucket数组中删除,如果这些value一直存在那么将浪费很多空间,所以这里会把它们移除,操作的方式也比较简单:将后面未删除的value依次前移,具体过程如下: ```c //zend_hash.c ZEND_API int ZEND_FASTCALL zend_hash_rehash(HashTable *ht) From e542a3d14b28e642563766c4958a92e78b94eb79 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Sat, 3 Jun 2017 20:06:02 +0800 Subject: [PATCH 303/379] =?UTF-8?q?fpm=E5=AE=9E=E7=8E=B0=E8=A7=A3=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 1/fpm.md | 354 +++++++++++++++++++++++++++++++++++++ img/fastcgi.png | Bin 0 -> 9472 bytes img/master_event_1.png | Bin 0 -> 10295 bytes img/worker_pool.png | Bin 0 -> 11814 bytes img/worker_pool_struct.png | Bin 0 -> 43232 bytes 5 files changed, 354 insertions(+) create mode 100644 1/fpm.md create mode 100644 img/fastcgi.png create mode 100644 img/master_event_1.png create mode 100644 img/worker_pool.png create mode 100644 img/worker_pool_struct.png diff --git a/1/fpm.md b/1/fpm.md new file mode 100644 index 0000000..8d73f36 --- /dev/null +++ b/1/fpm.md @@ -0,0 +1,354 @@ +## 1.3 FPM +### 1.3.1 概述 +FPM(FastCGI Process Manager)是PHP FastCGI运行模式的一个进程管理器,从它的定义可以看出,FPM的核心功能是进程管理,那么它用来管理什么进程呢?这个问题就需要从FastCGI说起了。 + +FastCGI是Web服务器(如:Nginx、Apache)和处理程序之间的一种通信协议,它是与Http类似的一种应用层通信协议,注意:它只是一种协议! + +前面曾一再强调,PHP只是一个脚本解析器,你可以把它理解为一个普通的函数,输入是PHP脚本。输出是执行结果,假如我们想用PHP代替shell,在命令行中执行一个文件,那么就可以写一个程序来嵌入PHP解析器,这就是cli模式,这种模式下PHP就是普通的一个命令工具。接着我们又想:能不能让PHP处理http请求呢?这时就涉及到了网络处理,PHP需要接收请求、解析协议,然后处理完成返回请求。在网络应用场景下,PHP并没有像Golang那样实现http网络库,而是实现了FastCGI协议,然后与web服务器配合实现了http的处理,web服务器来处理http请求,然后将解析的结果再通过FastCGI协议转发给处理程序,处理程序处理完成后将结果返回给web服务器,web服务器再返回给用户,如下图所示。 + +![](../img/fastcgi.png) + +PHP实现了FastCGI协议的解析,但是并没有具体实现网络处理,一般的处理模型:多进程、多线程,多进程模型通常是主进程只负责管理子进程,而基本的网络事件由各个子进程处理,nginx、fpm就是这种模式;另一种多线程模型与多进程类似,只是它是线程粒度,通常会由主线程监听、接收请求,然后交由子线程处理,memcached就是这种模式,有的也是采用多进程那种模式:主线程只负责管理子线程不处理网络事件,各个子线程监听、接收、处理请求,memcached使用udp协议时采用的是这种模式。 + +### 1.3.2 基本实现 +概括来说,fpm的实现就是创建一个master进程,在master进程中创建并监听socket,然后fork出多个子进程,这些子进程各自accept请求,子进程的处理非常简单,它在启动后阻塞在accept上,有请求到达后开始读取请求数据,读取完成后开始处理然后再返回,在这期间是不会接收其它请求的,也就是说fpm的子进程同时只能响应一个请求,只有把这个请求处理完成后才会accept下一个请求,这一点与nginx的事件驱动有很大的区别,nginx的子进程通过epoll管理套接字,如果一个请求数据还未发送完成则会处理下一个请求,即一个进程会同时连接多个请求,它是非阻塞的模型,只处理活跃的套接字。 + +fpm的master进程与worker进程之间不会直接进行通信,master通过共享内存获取worker进程的信息,比如worker进程当前状态、已处理请求数等,当master进程要杀掉一个worker进程时则通过发送信号的方式通知worker进程。 + +fpm可以同时监听多个端口,每个端口对应一个worker pool,而每个pool下对应多个worker进程,类似nginx中server概念。 + +![](../img/worker_pool.png) + +在php-fpm.conf中通过`[pool name]`声明一个worker pool: +``` +[web1] +listen = 127.0.0.1:9000 +... + +[web2] +listen = 127.0.0.1:9001 +... +``` +启动fpm后查看进程:ps -aux|grep fpm +```c +root 27155 0.0 0.1 144704 2720 ? Ss 15:16 0:00 php-fpm: master process (/usr/local/php7/etc/php-fpm.conf) +nobody 27156 0.0 0.1 144676 2416 ? S 15:16 0:00 php-fpm: pool web1 +nobody 27157 0.0 0.1 144676 2416 ? S 15:16 0:00 php-fpm: pool web1 +nobody 27159 0.0 0.1 144680 2376 ? S 15:16 0:00 php-fpm: pool web2 +nobody 27160 0.0 0.1 144680 2376 ? S 15:16 0:00 php-fpm: pool web2 +``` +具体实现上worker pool通过`fpm_worker_pool_s`这个结构表示,多个worker pool组成一个单链表: +```c +struct fpm_worker_pool_s { + struct fpm_worker_pool_s *next; //指向下一个worker pool + struct fpm_worker_pool_config_s *config; //conf配置:pm、max_children、start_servers... + int listening_socket; //监听的套接字 + ... + + //以下这个值用于master定时检查、记录worker数 + struct fpm_child_s *children; //当前pool的worker链表 + int running_children; //当前pool的worker运行总数 + int idle_spawn_rate; + int warn_max_children; + + struct fpm_scoreboard_s *scoreboard; //记录worker的运行信息,比如空闲、忙碌worker数 + ... +} +``` +### 1.3.3 FPM的初始化 +接下来看下fpm的启动流程,从`main()`函数开始: +```c +//sapi/fpm/fpm/fpm_main.c +int main(int argc, char *argv[]) +{ + ... + //注册SAPI:将全局变量sapi_module设置为cgi_sapi_module + sapi_startup(&cgi_sapi_module); + ... + //执行php_module_starup() + if (cgi_sapi_module.startup(&cgi_sapi_module) == FAILURE) { + return FPM_EXIT_SOFTWARE; + } + ... + //初始化 + if(0 > fpm_init(...)){ + ... + } + ... + fpm_is_running = 1; + + fcgi_fd = fpm_run(&max_requests);//后面都是worker进程的操作,master进程不会走到下面 + parent = 0; + ... +} +``` +`fpm_init()`主要有以下几个关键操作: + +__(1)fpm_conf_init_main():__ + +解析php-fpm.conf配置文件,分配worker pool内存结构并保存到全局变量中:fpm_worker_all_pools,各worker pool配置解析到`fpm_worker_pool_s->config`中。 + +__(2)fpm_scoreboard_init_main():__ 分配用于记录worker进程运行信息的共享内存,按照worker pool的最大worker进程数分配,每个worker pool分配一个`fpm_scoreboard_s`结构,pool下对应的每个worker进程分配一个`fpm_scoreboard_proc_s`结构,各结构的对应关系如下图。 + +![](../worker_pool_struct.png) + +__(3)fpm_signals_init_main():__ +```c +static int sp[2]; + +int fpm_signals_init_main() +{ + struct sigaction act; + + //创建一个全双工管道 + if (0 > socketpair(AF_UNIX, SOCK_STREAM, 0, sp)) { + return -1; + } + //注册信号处理handler + act.sa_handler = sig_handler; + sigfillset(&act.sa_mask); + if (0 > sigaction(SIGTERM, &act, 0) || + 0 > sigaction(SIGINT, &act, 0) || + 0 > sigaction(SIGUSR1, &act, 0) || + 0 > sigaction(SIGUSR2, &act, 0) || + 0 > sigaction(SIGCHLD, &act, 0) || + 0 > sigaction(SIGQUIT, &act, 0)) { + return -1; + } + return 0; +} +``` +这里会通过`socketpair()`创建一个管道,这个管道并不是用于master与worker进程通信的,它只在master进程中使用,具体用途在稍后介绍event事件处理时再作说明。另外设置master的信号处理handler,当master收到SIGTERM、SIGINT、SIGUSR1、SIGUSR2、SIGCHLD、SIGQUIT这些信号时将调用`sig_handler()`处理: +```c +static void sig_handler(int signo) +{ + static const char sig_chars[NSIG + 1] = { + [SIGTERM] = 'T', + [SIGINT] = 'I', + [SIGUSR1] = '1', + [SIGUSR2] = '2', + [SIGQUIT] = 'Q', + [SIGCHLD] = 'C' + }; + char s; + ... + s = sig_chars[signo]; + //将信号通知写入管道sp[1]端 + write(sp[1], &s, sizeof(s)); + ... +} +``` +__(4)fpm_sockets_init_main()__ + +创建每个worker pool的socket套接字。 + +__(5)fpm_event_init_main():__ + +启动master的事件管理,fpm实现了一个事件管理器用于管理IO、定时事件,其中IO事件通过kqueue、epoll、poll、select等管理,定时事件就是定时器,一定时间后触发某个事件。 + +在`fpm_init()`初始化完成后接下来就是最关键的`fpm_run()`操作了,此环节将fork子进程,启动进程管理器,另外master进程将不会再返回,只有各worker进程会返回,也就是说`fpm_run()`之后的操作均是worker进程的。 +```c +int fpm_run(int *max_requests) +{ + struct fpm_worker_pool_s *wp; + for (wp = fpm_worker_all_pools; wp; wp = wp->next) { + //调用fpm_children_make() fork子进程 + is_parent = fpm_children_create_initial(wp); + + if (!is_parent) { + goto run_child; + } + } + //master进程将进入event循环,不再往下走 + fpm_event_loop(0); + +run_child: //只有worker进程会到这里 + + *max_requests = fpm_globals.max_requests; + return fpm_globals.listening_socket; //返回监听的套接字 +} +``` +在fork后worker进程返回了监听的套接字继续main()后面的处理,而master将永远阻塞在`fpm_event_loop()`,接下来分别介绍master、worker进程的后续操作。 + +### 1.3.4 处理请求 +`fpm_run()`执行后将fork出worker进程,worker进程返回`main()`中继续向下执行,后面的流程就是worker进程不断accept请求,然后执行PHP脚本并返回。整体流程如下: + +* __(1)等待请求:__ worker进程阻塞在fcgi_accept_request()等待请求; +* __(2)解析请求:__ fastcgi请求到达后被worker接收,然后开始接收并解析请求数据,直到request数据完全到达; +* __(3)请求初始化:__ 执行php_request_startup(),此阶段会调用每个扩展的:PHP_RINIT_FUNCTION(); +* __(4)编译、执行:__ 由php_execute_script()完成PHP脚本的编译、执行; +* __(5)关闭请求:__ 请求完成后执行php_request_shutdown(),此阶段会调用每个扩展的:PHP_RSHUTDOWN_FUNCTION(),然后进入步骤(1)等待下一个请求。 + +```c +int main(int argc, char *argv[]) +{ + ... + fcgi_fd = fpm_run(&max_requests); + parent = 0; + + //初始化fastcgi请求 + request = fpm_init_request(fcgi_fd); + + //worker进程将阻塞在这,等待请求 + while (EXPECTED(fcgi_accept_request(request) >= 0)) { + SG(server_context) = (void *) request; + init_request_info(); + + //请求开始 + if (UNEXPECTED(php_request_startup() == FAILURE)) { + ... + } + ... + + fpm_request_executing(); + //编译、执行PHP脚本 + php_execute_script(&file_handle); + ... + //请求结束 + php_request_shutdown((void *) 0); + ... + } + ... + //worker进程退出 + php_module_shutdown(); + ... +} +``` +worker进程一次请求的处理被划分为5个阶段: + +* __FPM_REQUEST_ACCEPTING:__ 等待请求阶段 +* __FPM_REQUEST_READING_HEADERS:__ 读取fastcgi请求header阶段 +* __FPM_REQUEST_INFO:__ 获取请求信息阶段,此阶段是将请求的method、query stirng、request uri等信息保存到各worker进程的fpm_scoreboard_proc_s结构中,此操作需要加锁,因为master进程也会操作此结构 +* __FPM_REQUEST_EXECUTING:__ 执行请求阶段 +* __FPM_REQUEST_END:__ 没有使用 +* __FPM_REQUEST_FINISHED:__ 请求处理完成 + +worker处理到各个阶段时将会把当前阶段更新到`fpm_scoreboard_proc_s->request_stage`,master进程正是通过这个标识判断worker进程是否空闲的。 + +### 1.3.5 进程管理 +这一节我们来看下master是如何管理worker进程的,首先介绍下三种不同的进程管理方式: + +* __static:__ 这种方式比较简单,在启动时master按照`pm.max_children`配置fork出相应数量的worker进程,即worker进程数是固定不变的 +* __dynamic:__ 动态进程管理,首先在fpm启动时按照`pm.start_servers`初始化一定数量的worker,运行期间如果master发现空闲worker数低于`pm.min_spare_servers`配置数(表示请求比较多,worker处理不过来了)则会fork worker进程,但总的worker数不能超过`pm.max_children`,如果master发现空闲worker数超过了`pm.max_spare_servers`(表示闲着的worker太多了)则会杀掉一些worker,避免占用过多资源,master通过这4个值来控制worker数 +* __ondemand:__ 这种方式一般很少用,在启动时不分配worker进程,等到有请求了后再通知master进程fork worker进程,总的worker数不超过`pm.max_children`,处理完成后worker进程不会立即退出,当空闲时间超过`pm.process_idle_timeout`后再退出 + +前面介绍到在`fpm_run()`master进程将进入`fpm_event_loop()`: +```c +void fpm_event_loop(int err) +{ + //创建一个io read的监听事件,这里监听的就是在fpm_init()阶段中通过socketpair()创建管道sp[1] + //当sp[1]可读时将回调fpm_got_signal() + fpm_event_set(&signal_fd_event, fpm_signals_get_fd(), FPM_EV_READ, &fpm_got_signal, NULL); + fpm_event_add(&signal_fd_event, 0); + + //如果在php-fpm.conf配置了request_terminate_timeout则启动心跳检查 + if (fpm_globals.heartbeat > 0) { + fpm_pctl_heartbeat(NULL, 0, NULL); + } + //定时触发进程管理 + fpm_pctl_perform_idle_server_maintenance_heartbeat(NULL, 0, NULL); + + //进入事件循环,master进程将阻塞在此 + while (1) { + ... + //等待IO事件 + ret = module->wait(fpm_event_queue_fd, timeout); + ... + //检查定时器事件 + ... + } +} +``` +这就是master整体的处理,其进程管理主要依赖注册的几个事件,接下来我们详细分析下这几个事件的功能。 + +__(1)sp[1]管道可读事件:__ + +在`fpm_init()`阶段master曾创建了一个全双工的管道:sp,然后在这里创建了一个sp[1]可读的事件,当sp[1]可读时将交由`fpm_got_signal()`处理,向sp[0]写数据时sp[1]才会可读,那么什么时机会向sp[0]写数据呢?前面已经提到了:当master收到注册的那几种信号时会写入sp[0]端,这个时候将触发sp[1]可读事件。 + +![](../img/master_event_1.png) + +这个事件是master用于处理信号的,我们根据master注册的信号逐个看下不同用途: + +* __SIGINT/SIGTERM/SIGQUIT:__ 退出fpm,在master收到退出信号后将向所有的worker进程发送退出信号,然后master退出 +* __SIGUSR1:__ 重新加载日志文件,生产环境中通常会对日志进行切割,切割后会生成一个新的日志文件,如果fpm不重新加载将无法继续写入日志,这个时候就需要向master发送一个USR1的信号 +* __SIGUSR2:__ 重启fpm,首先master也是会向所有的worker进程发送退出信号,然后master会调用execvp()重新启动fpm,最后旧的master退出 +* __SIGCHLD:__ 这个信号是子进程退出时操作系统发送给父进程的,子进程退出时,内核将子进程置为僵尸状态,这个进程称为僵尸进程,它只保留最小的一些内核数据结构,以便父进程查询子进程的退出状态,只有当父进程调用wait或者waitpid函数查询子进程退出状态后子进程才告终止,fpm中当worker进程因为异常原因(比如coredump了)退出而非master主动杀掉时master将受到此信号,这个时候父进程将调用waitpid()查下子进程的退出,然后检查下是不是需要重新fork新的worker + +具体处理逻辑在`fpm_got_signal()`函数中,这里不再罗列。 + +__(2)fpm_pctl_perform_idle_server_maintenance_heartbeat():__ + +这是进程管理实现的主要事件,master启动了一个定时器,每割1s触发一次,主要用于dynamic、ondemand模式下的worker管理,master会定时检查各work pool的worker进程数,通过此定时器实现worker数量的控制,处理逻辑如下: +```c +static void fpm_pctl_perform_idle_server_maintenance(struct timeval *now) +{ + for (wp = fpm_worker_all_pools; wp; wp = wp->next) { + struct fpm_child_s *last_idle_child = NULL; //空闲时间最久的worker + int idle = 0; //空闲worker数 + int active = 0; //忙碌worker数 + + for (child = wp->children; child; child = child->next) { + //根据worker进程的fpm_scoreboard_proc_s->request_stage判断 + if (fpm_request_is_idle(child)) { + //找空闲时间最久的worker + ... + idle++; + }else{ + active++; + } + } + ... + //ondemand模式 + if (wp->config->pm == PM_STYLE_ONDEMAND) { + if (!last_idle_child) continue; + + fpm_request_last_activity(last_idle_child, &last); + fpm_clock_get(&now); + if (last.tv_sec < now.tv_sec - wp->config->pm_process_idle_timeout) { + //如果空闲时间最长的worker空闲时间超过了process_idle_timeout则杀掉该worker + last_idle_child->idle_kill = 1; + fpm_pctl_kill(last_idle_child->pid, FPM_PCTL_QUIT); + } + continue; + } + //dynamic + if (wp->config->pm != PM_STYLE_DYNAMIC) continue; + if (idle > wp->config->pm_max_spare_servers && last_idle_child) { + //空闲worker太多了,杀掉 + last_idle_child->idle_kill = 1; + fpm_pctl_kill(last_idle_child->pid, FPM_PCTL_QUIT); + wp->idle_spawn_rate = 1; + continue; + } + if (idle < wp->config->pm_min_spare_servers) { + //空闲worker太少了,如果总worker数未达到max数则fork + ... + } + } +} +``` +__(3)fpm_pctl_heartbeat():__ + +这个事件是用于限制worker处理单个请求最大耗时的,php-fpm.conf中有一个`request_terminate_timeout`的配置项,如果worker处理一个请求的总时长超过了这个值那么master将会向此worker进程发送`kill -TERM`信号杀掉worker进程,此配置单位为秒,默认值为0表示关闭此机制,另外fpm打印的slow log也是在这里完成的。 +```c +static void fpm_pctl_check_request_timeout(struct timeval *now) +{ + struct fpm_worker_pool_s *wp; + + for (wp = fpm_worker_all_pools; wp; wp = wp->next) { + int terminate_timeout = wp->config->request_terminate_timeout; + int slowlog_timeout = wp->config->request_slowlog_timeout; + struct fpm_child_s *child; + + if (terminate_timeout || slowlog_timeout) { + for (child = wp->children; child; child = child->next) { + //检查当前当前worker处理的请求是否超时 + fpm_request_check_timed_out(child, now, terminate_timeout, slowlog_timeout); + } + } + } +} +``` +除了上面这几个事件外还有一个没有提到,那就是ondemand模式下master监听的新请求到达的事件,因为ondemand模式下fpm启动时是不会预创建worker的,有请求时才会生成子进程,所以请求到达时需要通知master进程,这个事件是在`fpm_children_create_initial()`时注册的,事件处理函数为`fpm_pctl_on_socket_accept()`,具体逻辑这里不再展开,比较容易理解。 + +到目前为止我们已经把fpm的核心实现介绍完了,事实上fpm的实现还是比较简单的。 diff --git a/img/fastcgi.png b/img/fastcgi.png new file mode 100644 index 0000000000000000000000000000000000000000..624015674b4aa2f24b9116ed1401be1ac47f68f7 GIT binary patch literal 9472 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ðutG0k)$* ze|7?R5{|VtF`=TO>aB58scODu@)Oe9$-wjVYp$hDEcX;p(XlFDwnlAxop?=ZQs3&e z=8LkT>AXfY4BLrbVxat>p%oPsWoPpc`6Q;MK6-d|^?06B7>J9DBfEGJS5i}R5vl;2PDIgz z)Wzb}e33m;1TUbNTwGiZch`-+o3;Wo!d<-vDINc%tA-PTW@0ikIH{=}hhC2EEQDI6Og9i0Ju3Y3*&MS1z} z1W9_N>5CWkJ1bB4`SbY3J+-x|Je5zB{ro>bN-+yt=^5otga1&a$!P`B)66p8%CTimD{zP=xNMT&W^~0(Hvtd;m8f)_S7&2mbEgk(@W1rNo+M!s>h0%d z9}o31tYpuRthKfE;NYOp?03u^%YL`48s}x|0yX)Eqw8P0Um2eYf;Jri9$w=i?)i3W zp?hKBRiY**1qmRV>rsh#y>UTOa&q&BYXGx8GmAro=Jt9rBv5mchU~GwZ`=+D3=KV* z{iMOb$QXF-59pS)b^}sEeB;=3&fB+pe*FsCBV7#LNj{8=V=z8eHiyqLF*cTh4kR4Q z$jCSrAB2)%vY*C8y`YzJNBP&oa^5&NIGjb}mN9y8%O-4gc6Mu_--|-yur2PcBP%Ow z2UfZkP#8(|=&+-`o$M64Pl5Muvl(mSBPBzwTQ;Mj?x%#1c2-t#k&%xfTlDm3LF7?W z`*Gy8>V9|50T9g0BrOh385}Gy38ZJ)KuG{zf-;`(#8Qb&F$tQrb70-QDL~^`)W$V* zcT@787!+H42@3l4gcxu!w_O`|si20bfcUWQrKLdIcR@^exVr;j*qtXy1Q~BLm@fl@$H2gVg~HU#4DfGy z$_vCL#OdBWL^-Q)tOq0*kR@GjP&$L zZ5NV6C=AdkQ%=Ah{>5{X$R^rN+Vc6bBDxL2sWFS0 zwG?S7jd%XfwYs={1?6c631=LBrQujx!pih^G;jvNf(snE`sERNnW{|hr>zTO*_|Y> zTz^(^F!}WLYF(v-=-xCSAxCQ(bUX$UVaRm7eFLj z$<)*|B`wXr76JO*UO_RG!QR2)X%(sydI>XSnN-;xP>g zAb~USDAK!pj9BrYx&BnSnf3hLqk)RBE$2gMMYp>(uflx+1c27fwwLF;Vu|o0RLy>vMN_V+WGV6 ztHt9F-Y=UO6_=Dy8#T%6O9%CWBnY7ZGa@TJJqj95&BsOP^r)ggC*M+y{bwR@MojxR zx%9pDj1Nsx4F*&UfoMV=^bF|^hqEc_K|UHXh-z{ep}|KpSYc#Ow}|!kS9EumNT^g& zQE_y3_ONXwBO<_}+2Yw}M!plm+<@6s8<%3VbWzb!lnlkPbFBd>wui!^M^~q3-~z zfhIRPYKAh3f6LAWpUZ{Z-$zg|x*edI4LvLkG7<2H&J+svMgnK|6bR$}KUum) zl`c6I6;F8*9_#8tN|79UFge%3(^r(0kqw4er^FN&-`Su2T23*GTmV2tmTD; zsDy+X` z&?wEZ9)7)`zo2yO{=zp+na3?GFVAFgfQjhpDi#_m+PAc@0I)etH&MCtk~8{_<>N!Q z7Vmo7gRRBdlLPL%bFH5^0DAWv^tcwV-fMLj4wqVu;d9fAH%x#3{(XU(heD-sfG61{ zF&{)zK|wewpIi3T&kxr~62Y(9*w}z3ClK9US9cF&B-nnDk<=2iyExn}0f7bQ!qhhJ za~A+ARB9y7EBOK)0hAi8^}?22()aX~GW5FxLVp2EPFZR*wxoqEx*)n!yt}oi{jUvZ z`DGQ%$fZBgs(s?^jj;(Q5H z0w9_8hyKCC>=~K86HgxP$kQ+XPQ!~a6r!^RqoAp& z$zW85oJ<{r2oN4rZ0EelojX(70m=76=q77fY1el#3HKj%OLO!MWIvIM3qIZI)lf)L zU`I97*H6JW0H`#+b$6#xL3dR+FNZQox~>l2iDP1BUZ0$_oB4Us!3>NMFx~Yps6Q#S ziC1DLy>zMheQ`m7mWGCgPypso)28109AxdD7$=JYC=y`ASy@?Ws?iTMHSdw_AQSM> z6i@S?zt728g4KXc_Vfsr3FVRor*mi5id{MxOgGyOR`VuVyggLpnmE zJF?|kEP0mzjY7=hps2Ri%f&^w=Ap}MOE^JQ6tj#3V-X-UaFJFnD7aOEQ5Z+GYA~%& z+o3=D`T6Oc-$Qa54{Z?CxDMHH&9AJuL$QIYsVqXc)n4^>6MWI|n3yx7>TXsWRw}v5 z7$wcKLSX=x2$)WecM z&Iqk=0A>SV|3XylgFbxt0E_kZ{sCBn(~d$Qj)|u;`rLqe0L-nARVpTTe+UTy+81y= z6(kPuU8qIkOH2^Dcxf*wPfbC@SLu5aUtnTl4Gsnac{9kDh6dE!UPWZqp^Sd@0qB8~cJACZj_D6-5BvG^7KrQ2 zVWK)>^63nr*RNl<0?{NRgNAK7vHl|~Hx~>TKu`9?(sOkbcsQs01$9CRsN3RC366i; zySuwvVFISUs`H4nPV*d2#{$0KWPctDcCyFvmmo(wJ5C-Rbnh`@i?LBV!yX*3?d1V& z!xf;TfSkETwd!wM5$>;85+3-&35_5CaH8d_E z*{_iL$|7qVY7-Ojkmyp-&@dL-&~Cx;J$m%#`}f=KI!~Sq0n!4bKH;J6$jixz$6_^d zi!w46)3Bbb6{!&2eRxTpmh9(y0%8hTAh6(|K%o^CLGq@ZoSXm$0LMv!3C3xB zU_S^5P#`~JFwOIu*T{ZC2Oq}t_w@Xj!GTM#F+&F-1lk*DtI3CXrlYg9S~^i8y#cOF znFabI7#MkZ{0SGn7Z(E=_@OWr2e|+?edqkZz(7_;Mz|#p7uSBL*GVt*VH%nNX6&D@ zu-~LdCx`2eatA;mVJ4OcY?OioQtqL?e%$BJ=*mcNx@Ufdh=aid=B2C>3x#T|@M?Rs zASET`tim^-+K%$_@{rSzFV4=}(Sqg_vLN=sloj>SV{e+gor!l3ebYN61oWg^K)`ET zTQA(S!YGxhx;k|ARe`9>-(XPkIWX*ZTN@ag!66|p3-k=aP>poS02b;~4&@R|>kHk< z%l$c(c2nNqM3&$8@HieRwf#hVkC`MO%}0U8F&Q)kur_30SJ%fvc07Irg1GJMEI@d8 zf#m=n&^55npm#z!TaA?PUccTnI;zh?k!?^ZEF^RV>9oCcwx1wNnZo=jpz_5$kIEt= z`@zw@OhwfhcQ-jJYx(crl9z4N`o2|FN3kNdhP9psj~~0hN(zWtT3Vpi2$4l5&E#l` zko(J+ut~XMr^Sb83T$Vy$^70PD$Wqh^G~0&b#&z0OI72=zBC!Hj#rEG@#TW&#?C(L z&+NI7WNL11j{XSc3c^R`7(vWcN|f*47UDCnxa*e|@~V0htXtEHm>a%h`oM z3Rw>eQ3p4f-VRKxfPs&d)e4k0J6%0v1rvBCj(1lYuL!hNGS-(@i-V`Fxg;5 zgYZlDbVPtgzhKMrtb`2NXjX`8%g+}e@+kn<0_coHSRe%?q8ixj>gxANV9w>js39jS zd$!r55A=0)MR<9wA+PoZ`N)NYgdj6zQVeh28gJfs&fJ*_$T-EKa$mx+5{!GO`SpDg zqFZz!{l}J-$b<)Y(6SRXm7Ja@CnW`R_$skOoM8BFWnpoqkKRIe0LCxN;JN?rYDqc&Tt@d*h2Gk*W~k~Oo&^O%m`<4tzEPXJx6xoxq^JuDiFjbrCEX9_nDdLMvnAh{#C48Lr%L3Ei)m znZr}@9sVhlsEUh9kByC|Bd)86jX;$FiYiFlE6mSFZ7*Gg3GeNfzW@mzr1dU3iG|!3 zgmLW7&V3R!tdxPa_GY~gF*tHyV+sif?7?t!(dhtqB89B%nY*khCnu+?i&0O5aM04y zvY=ti-!kX0y|uOB;{rtUOkacZ4W_I+!A&r&p(Odhg+mgCB_-*rs072v38=Iuv@tIb z?!WviQ6@L0{(0Bp78pulbazNK#=h(E00>dC-OmP(;nnJAF6{-UisWQAEs%O@ zP)EQ4GEU-%Dqq-PgX`;HUI7_oU<%o02-A)a*8~qT@Ic;z*#SeK2EV{l<;j{%@PF*> zaT(fa6k8g^Sb!@GzfpvCf1c6lxK^enr-ai2#of8&FewW!v-3{OA9hn4ieC3ZJ{<5T z{GFe7L!rKgMqYyyGw+DIdp1UDYC6^tUq}X|ltyj5i~H`ny|nwY7fy5-<6jXJ5=yDD zXTBVe)*}P8C?(~&I$V6LwFg~VF@)~VHmP>ia|D@s^)um4v%;yGi+$eU{|4u-XQrj3 z2-%F5c`hL#S)lXPmR>y8x`U8A58U8|tt~S>J&YbkYR1-eM#12N!G`@V74`!@Vv8K! zkofhhfb}pKq(T>(}q!BlLDjQ?=k9i^5+0qg-O-Y^0Ee2Dn2Tz z%x((C7jjpxejyhe=<1SNKu=oA*5T`;-_ z+NqebN#!fC4ieKP8Q&PQ#g`J8J<{om)Ua3^2kAW1E>!?Uw$pq<&r z2oXegaQ-<2%2S*BFxbVwQ8iE4e{%s^I9G-6p={KKV{%08|Mlsx|MLXd2{X_76Xh!& T$z*Wu5237}E}tv=-1~n4*0(@d literal 0 HcmV?d00001 diff --git a/img/worker_pool.png b/img/worker_pool.png new file mode 100644 index 0000000000000000000000000000000000000000..8f4551c949ce93e08795eac4f403fb1878421b47 GIT binary patch literal 11814 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 literal 0 HcmV?d00001 diff --git a/img/worker_pool_struct.png b/img/worker_pool_struct.png new file mode 100644 index 0000000000000000000000000000000000000000..23068cc0a7d2f61e7e2ac6f21424c54f0cf2a410 GIT binary patch literal 43232 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 literal 0 HcmV?d00001 From 5dc1e91bf0be7ba787ff6042c3a975c8939f92d7 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Sat, 3 Jun 2017 20:11:36 +0800 Subject: [PATCH 304/379] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E7=9B=AE=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 1/fpm.md | 4 ++-- README.md | 7 ++++++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/1/fpm.md b/1/fpm.md index 8d73f36..b155964 100644 --- a/1/fpm.md +++ b/1/fpm.md @@ -90,7 +90,7 @@ __(1)fpm_conf_init_main():__ __(2)fpm_scoreboard_init_main():__ 分配用于记录worker进程运行信息的共享内存,按照worker pool的最大worker进程数分配,每个worker pool分配一个`fpm_scoreboard_s`结构,pool下对应的每个worker进程分配一个`fpm_scoreboard_proc_s`结构,各结构的对应关系如下图。 -![](../worker_pool_struct.png) +![](../img/worker_pool_struct.png) __(3)fpm_signals_init_main():__ ```c @@ -170,7 +170,7 @@ run_child: //只有worker进程会到这里 ``` 在fork后worker进程返回了监听的套接字继续main()后面的处理,而master将永远阻塞在`fpm_event_loop()`,接下来分别介绍master、worker进程的后续操作。 -### 1.3.4 处理请求 +### 1.3.4 请求处理 `fpm_run()`执行后将fork出worker进程,worker进程返回`main()`中继续向下执行,后面的流程就是worker进程不断accept请求,然后执行PHP脚本并返回。整体流程如下: * __(1)等待请求:__ worker进程阻塞在fcgi_accept_request()等待请求; diff --git a/README.md b/README.md index 60435e4..fcd7372 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,12 @@ * 第1章 PHP基本架构 * 1.1 PHP简介 * 1.2 PHP7的改进 - * 1.3 PHP内核的组成 + * [1.3 FPM](1/fpm.md) + * [1.3.1 概述](1/fpm.md) + * [1.3.2 基本实现](1/fpm.md) + * [1.3.3 FPM的初始化](1/fpm.md) + * [1.3.4 请求处理](1/fpm.md) + * [1.3.5 进程管理](1/fpm.md) * [1.4 PHP执行的几个阶段](1/base_process.md) * 第2章 变量 * [2.1 变量的内部实现](2/zval.md) From c92ad39efcfb3db65cebb6c655627f3aa7a69de8 Mon Sep 17 00:00:00 2001 From: iam2c <1584684300@qq.com> Date: Sat, 3 Jun 2017 23:48:20 +0800 Subject: [PATCH 305/379] Update fpm.md --- 1/fpm.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/1/fpm.md b/1/fpm.md index b155964..49f961f 100644 --- a/1/fpm.md +++ b/1/fpm.md @@ -263,7 +263,7 @@ void fpm_event_loop(int err) __(1)sp[1]管道可读事件:__ -在`fpm_init()`阶段master曾创建了一个全双工的管道:sp,然后在这里创建了一个sp[1]可读的事件,当sp[1]可读时将交由`fpm_got_signal()`处理,向sp[0]写数据时sp[1]才会可读,那么什么时机会向sp[0]写数据呢?前面已经提到了:当master收到注册的那几种信号时会写入sp[0]端,这个时候将触发sp[1]可读事件。 +在`fpm_init()`阶段master曾创建了一个全双工的管道:sp,然后在这里创建了一个sp[0]可读的事件,当sp[0]可读时将交由`fpm_got_signal()`处理,向sp[1]写数据时sp[0]才会可读,那么什么时机会向sp[1]写数据呢?前面已经提到了:当master收到注册的那几种信号时会写入sp[1]端,这个时候将触发sp[0]可读事件。 ![](../img/master_event_1.png) @@ -278,7 +278,7 @@ __(1)sp[1]管道可读事件:__ __(2)fpm_pctl_perform_idle_server_maintenance_heartbeat():__ -这是进程管理实现的主要事件,master启动了一个定时器,每割1s触发一次,主要用于dynamic、ondemand模式下的worker管理,master会定时检查各work pool的worker进程数,通过此定时器实现worker数量的控制,处理逻辑如下: +这是进程管理实现的主要事件,master启动了一个定时器,每隔1s触发一次,主要用于dynamic、ondemand模式下的worker管理,master会定时检查各worker pool的worker进程数,通过此定时器实现worker数量的控制,处理逻辑如下: ```c static void fpm_pctl_perform_idle_server_maintenance(struct timeval *now) { From 11d633b02d5c28d7210b014e3b4e8b0b7e47dad9 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Wed, 7 Jun 2017 19:10:10 +0800 Subject: [PATCH 306/379] add weixin --- README.md | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index fcd7372..a7d0681 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,11 @@ 代码版本:php-7.0.12 ```` +## 反馈 +[交流&吐槽](https://github.com/pangudashu/php7-internal/issues/3) [错误反馈](https://github.com/pangudashu/php7-internal/issues/2) + +![weixin](img/talk.png) + ## 目录: * 第1章 PHP基本架构 * 1.1 PHP简介 @@ -79,15 +84,14 @@ * [7.7.5 数组操作](7/var.md) * [7.8 常量](7/constant.md) * 7.9 面向对象 - * 7.6.1 扩展中创建对象 - * 7.6.2 创建内部类 + 7.9.1 内部类注册 + 7.9.2 定义成员属性 + 7.9.3 定义成员方法 + 7.9.4 定义常量 + 7.9.5 类的实例化 * 7.10 资源类型 * 7.11 经典扩展解析 * 7.8.1 Yaf * 7.8.2 Redis - * 7.8.3 Memcached - -## 反馈 -[交流&吐槽](https://github.com/pangudashu/php7-internal/issues/3) [错误反馈](https://github.com/pangudashu/php7-internal/issues/2) From dcfacae1fc3742f1ee2aa1f0c34d3fceba98e903 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Wed, 7 Jun 2017 19:10:53 +0800 Subject: [PATCH 307/379] add img --- img/talk.png | Bin 0 -> 22316 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 img/talk.png diff --git a/img/talk.png b/img/talk.png new file mode 100644 index 0000000000000000000000000000000000000000..f6e884a15a2f36e080d18f82f9c804ae959a9821 GIT binary patch literal 22316 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 fMYZwnlqMqRV Date: Fri, 9 Jun 2017 17:29:53 +0800 Subject: [PATCH 308/379] =?UTF-8?q?=E4=BF=AE=E6=94=B9break=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 4/break.md | 2 + img/ast_break_div.png | Bin 0 -> 9617 bytes try/break.md | 260 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 262 insertions(+) create mode 100644 img/ast_break_div.png create mode 100644 try/break.md diff --git a/4/break.md b/4/break.md index e6d8b7b..5bfc256 100644 --- a/4/break.md +++ b/4/break.md @@ -121,8 +121,10 @@ static uint32_t zend_get_brk_cont_target(const zend_op_array *op_array, const ze int array_offset = opline->op1.num;//break、continue所属循环zend_brk_cont_element的存储下标 zend_brk_cont_element *jmp_to; do { + //从break/continue所在循环层开始 jmp_to = &op_array->brk_cont_array[array_offset]; if (nest_levels > 1) { + //如果还没到要跳出的层数则接着跳到上层 array_offset = jmp_to->parent; } } while (--nest_levels > 0); diff --git a/img/ast_break_div.png b/img/ast_break_div.png new file mode 100644 index 0000000000000000000000000000000000000000..60f1c24e1c8bce0304c601e1edda98f28bd55593 GIT binary patch literal 9617 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 Ob4O8Kp%7^n{J#JvSK%fA literal 0 HcmV?d00001 diff --git a/try/break.md b/try/break.md new file mode 100644 index 0000000..148fcc5 --- /dev/null +++ b/try/break.md @@ -0,0 +1,260 @@ +# 附录1:PHP语法实现:break/continue按标签中断 + +## 1.1 背景 +首先看下目前PHP中break/continue多层循环的情况: +```php +//loop1 +while(...){ + //loop2 + for(...){ + //loop3 + foreach(...){ + ... + break 2; + } + + } + //loop2 end + ... + +} +``` +`break 2`表示要中断往上数两层也就是loop2这层循环,`break 2`之后将从loop2 end开始继续执行。PHP的break、continue只能根据数值中断对应的循环,当嵌套循环比较多的时候这种方式维护起来就变得很不方便,需要一层层的去数要中断的循环。 + +了解Go语言的读者应该知道在Go中可以按照标签中断,举个例子来看: +```go +//test.go +func main() { +loop1: + for i := 0; i < 2; i++ { + fmt.Println("loop1") + + for j := 0; j < 5; j++ { + fmt.Println(" loop2") + if j == 2 { + break loop1 + } + } + } +} +``` +`go run test.go`将输出: +``` +loop1 + loop2 + loop2 + loop2 +``` +`break loop1`这种语法在PHP中是不支持的,接下来我们就对PHP进行改造,让PHP实现同样的功能。 + +## 1.2 实现 +想让PHP支持类似Go语言那样的语法首先需要明确PHP中循环及中断语句的实现,关于这两部分内容前面《PHP基础语法实现》一章已经详细介绍过了,这里再简单概括下实现的关键点: +* 不管是哪种循环结构,其编译时都生成了一个`zend_brk_cont_element`结构,此结构记录着这个循环break、continue要跳转的位置,以及嵌套的父层循环 +* break/continue编译时分为两个步骤:首先初步编译为临时opcode,此opcode记录着break/continue所在循环层以及要中断的层级(即:`break n`,默认n=1);然后在脚本全部编译完之后的pass_two()中,根据当前循环层及中断的层级n向上查找对应的循环层,最后根据查找到的要中断的循环`zend_brk_cont_element`结构得到对应的跳转位置,生成一条ZEND_JMP指令 + +仔细研究循环、中断的实现可以发现,这里面的关键就在于找到break/continue要中断的那层循环,嵌套循环之间是链表的结构,所以目前的查找就变得很容易了,直接从break/continue当前循环层向前移动n即可。 + +标签在内核中通过HashTable的结构保存(即:CG(context).labels),key就是标签名,标签会记录当前opcode的位置,我们要实现`break 标签`的语法需要根据标签取到循环,因此我们为标签赋予一种新的含义:循环标签,只有标签紧挨着循环的才认为是这种含义,比如: +```php +loop1: +for(...){ + ... +} +``` +标签与循环之间有其它表达式的则只能认为是普通标签: +```php +loop1: +$a = 123; +for(...){ +} +``` +既然要按照标签进行break、continue,那么很容易想到把中断的循环层级id保存到标签中,编译break/continue时先查找标签,再查找循环的`zend_brk_cont_element`即可,这样实现的话需要循环编译时将自己`zend_brk_cont_element`的存储位置保存到标签中,标签的结构需要修改,另外一个问题是标签编译不会生成任何opcode,循环结构无法直接根据上一条opcode判断它是不是 ***循环标签*** ,所以我们换一种方式实现,具体思路如下: + +* __(1)__ 循环结构开始编译前先编译一条空opcode(ZEND_NOP),用于标识这是一个循环,并把这个循环`zend_brk_cont_element`的存储位置记录在此opcode中 +* __(2)__ break编译时如果发现是一个标签,则从CG(context).labels)中取出标签结构,然后判断此标签的下一条opcode是否为ZEND_NOP,如果不是则说明这不是一个 ***>循环标签*** ,无法break/continue,如果是则取出循环结构 +* __(3)__ 得到循环结构之后的处理就比较简单了,但是此时还不能直接编译为ZEND_JMP,因为循环可能还未编译完成,break只能编译为临时opcode,这里可以把标签标记的循环存储位置记录在临时opcode中,然后在pass_two()中再重新获取,需要对pass_two()中的逻辑进行改动,为减少改动,这个地方转化一下实现方式:计算label标记的循环相对break所在循环的位置,也就是转为现有的`break n`,这样以来就无需对pass_two()进行改动了 + +接下来看下具体的实现,以for为例。 + +__(1) 编译循环语句__ + +```c +void zend_compile_for(zend_ast *ast) /* {{{ */ +{ + zend_ast *init_ast = ast->child[0]; + zend_ast *cond_ast = ast->child[1]; + zend_ast *loop_ast = ast->child[2]; + zend_ast *stmt_ast = ast->child[3]; + + znode result; + uint32_t opnum_start, opnum_jmp, opnum_loop; + zend_op *mark_look_opline; + + //新增:创建一条空opcode,用于标识接下来是一个循环结构 + mark_look_opline = zend_emit_op(NULL, ZEND_NOP, NULL, NULL); + + zend_compile_expr_list(&result, init_ast); + zend_do_free(&result); + + opnum_jmp = zend_emit_jump(0); + + zend_begin_loop(ZEND_NOP, NULL); + + //新增:保存当前循环的brk,同时为了防止与其它ZEND_NOP混淆,把op1标为-1 + mark_look_opline->op1.var = -1; + mark_look_opline->extended_value = CG(context).current_brk_cont; + ... +} +``` + +__(2) 编译中断语句__ + +首先明确一点:`break label`将被编译为以下语法结构: + +![](../img/ast_break_div.png) + +`ZEND_AST_BREAK`只有一个子节点,如果是数值那么这个子节点类型为`ZEND_AST_ZVAL`,如果是标签则类型是`ZEND_AST_CONST`,`ZEND_AST_CONST`也有一个类型为`ZEND_AST_ZVAL`子节点。下面看下break/continue修改后的编译逻辑: +```c +void zend_compile_break_continue(zend_ast *ast) +{ + zend_ast *depth_ast = ast->child[0]; + + zend_op *opline; + int depth; + + ZEND_ASSERT(ast->kind == ZEND_AST_BREAK || ast->kind == ZEND_AST_CONTINUE); + + if (CG(context).current_brk_cont == -1) { + zend_error_noreturn(E_COMPILE_ERROR, "'%s' not in the 'loop' or 'switch' context", + ast->kind == ZEND_AST_BREAK ? "break" : "continue"); + } + + if (depth_ast) { + + switch(depth_ast->kind){ + case ZEND_AST_ZVAL: //break 数值; + { + zval *depth_zv; + + depth_zv = zend_ast_get_zval(depth_ast); + if (Z_TYPE_P(depth_zv) != IS_LONG || Z_LVAL_P(depth_zv) < 1) { + zend_error_noreturn(E_COMPILE_ERROR, "'%s' operator accepts only positive numbers", + ast->kind == ZEND_AST_BREAK ? "break" : "continue"); + } + + depth = Z_LVAL_P(depth_zv); + break; + } + case ZEND_AST_CONST://break 标签; + { + //获取label名称 + zend_string *label = zend_ast_get_str(depth_ast->child[0]); + //根据label获取标记的循环,以及相对break所在循环的位置 + depth = zend_loop_get_depth_by_label(label); + if(depth > 0){ + goto SET_OP; + } + break; + } + default: + zend_error_noreturn(E_COMPILE_ERROR, "'%s' operator with non-constant operand " + "is no longer supported", ast->kind == ZEND_AST_BREAK ? "break" : "continue"); + } + } else { + depth = 1; + } + + if (!zend_handle_loops_and_finally_ex(depth)) { + zend_error_noreturn(E_COMPILE_ERROR, "Cannot '%s' %d level%s", + ast->kind == ZEND_AST_BREAK ? "break" : "continue", + depth, depth == 1 ? "" : "s"); + } + +SET_OP: + opline = zend_emit_op(NULL, ast->kind == ZEND_AST_BREAK ? ZEND_BRK : ZEND_CONT, NULL, NULL); + opline->op1.num = CG(context).current_brk_cont; + opline->op2.num = depth; +} +``` +`zend_loop_get_depth_by_label()`这个函数用来计算标签标记的循环相对break/continue所在循环的层级: +```c +int zend_loop_get_depth_by_label(zend_string *label_name) +{ + zval *label_zv; + zend_label *label; + zend_op *next_opline; + + if(UNEXPECTED(CG(context).labels == NULL)){ + zend_error_noreturn(E_COMPILE_ERROR, "can't find label:'%s' or it not mark a loop", ZSTR_VAL(label_name)); + } + + // 1) 查找label + label_zv = zend_hash_find(CG(context).labels, label_name); + if(UNEXPECTED(label_zv == NULL)){ + zend_error_noreturn(E_COMPILE_ERROR, "can't find label:'%s' or it not mark a loop", ZSTR_VAL(label_name)); + } + + label = (zend_label *)Z_PTR_P(label_zv); + + // 2) 获取label下一条opcode + next_opline = &(CG(active_op_array)->opcodes[label->opline_num]); + if(UNEXPECTED(next_opline == NULL)){ + zend_error_noreturn(E_COMPILE_ERROR, "can't find label:'%s' or it not mark a loop", ZSTR_VAL(label_name)); + } + + int label_brk_offset, curr_brk_offset; //标签标识的循环、break当前所在循环 + int depth = 0; //break当前循环至标签循环的层级 + zend_brk_cont_element *brk_cont_element; + + if(next_opline->opcode == ZEND_NOP && next_opline->op1.var == -1){ + label_brk_offset = next_opline->extended_value; + curr_brk_offset = CG(context).current_brk_cont; + + brk_cont_element = &(CG(active_op_array)->brk_cont_array[curr_brk_offset]); + //计算标签标记的循环相对位置 + while(1){ + depth++; + + if(label_brk_offset == curr_brk_offset){ + return depth; + } + + curr_brk_offset = brk_cont_element->parent; + if(curr_brk_offset < 0){ + //label标识的不是break所在循环 + zend_error_noreturn(E_COMPILE_ERROR, "can't break/conitnue label:'%s' because it not mark a loop", ZSTR_VAL(label_name)); + } + } + }else{ + //label没有标识一个循环 + zend_error_noreturn(E_COMPILE_ERROR, "can't break/conitnue label:'%s' because it not mark a loop", ZSTR_VAL(label_name)); + } + + return -1; +} +``` +改动后重新编译PHP,然后测试新的语法是否生效: +```php +//test.php + +loop1: +for($i = 0; $i < 2; $i++){ + echo "loop1\n"; + + for($j = 0; $j < 5; $j++){ + echo " loop2\n"; + if($j == 2){ + break loop1; + } + } +} +``` +`php test.php`输出: +``` +loop1 + loop2 + loop2 + loop2 +``` +其它几个循环结构的改动与for相同,有兴趣的可以自己去尝试下。 + From 7c34ab1a97d8e38846be8aa83e5e4fd90082c92b Mon Sep 17 00:00:00 2001 From: qinpeng Date: Fri, 9 Jun 2017 17:39:38 +0800 Subject: [PATCH 309/379] update --- README.md | 2 ++ try/break.md | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index a7d0681..0b01e69 100644 --- a/README.md +++ b/README.md @@ -94,4 +94,6 @@ * 7.8.1 Yaf * 7.8.2 Redis +## 附录 + * [附录1:break/continue按标签中断语法实现](try/break.md) diff --git a/try/break.md b/try/break.md index 148fcc5..4e27d2b 100644 --- a/try/break.md +++ b/try/break.md @@ -1,4 +1,4 @@ -# 附录1:PHP语法实现:break/continue按标签中断 +# 附录1:break/continue按标签中断语法实现 ## 1.1 背景 首先看下目前PHP中break/continue多层循环的情况: From 215ab14cbcc562d4a390a4873dac885fd85e2e91 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Fri, 9 Jun 2017 17:44:27 +0800 Subject: [PATCH 310/379] update --- README.md | 2 +- img/my_wx.png | Bin 0 -> 293929 bytes 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 img/my_wx.png diff --git a/README.md b/README.md index 0b01e69..6ab9d2f 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ ## 反馈 [交流&吐槽](https://github.com/pangudashu/php7-internal/issues/3) [错误反馈](https://github.com/pangudashu/php7-internal/issues/2) -![weixin](img/talk.png) +![](img/my_wx.png) ## 目录: * 第1章 PHP基本架构 diff --git a/img/my_wx.png b/img/my_wx.png new file mode 100644 index 0000000000000000000000000000000000000000..6d6e6ca3a35a8be10285070a8d76fd20ae458b83 GIT binary patch literal 293929 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%0A(338hl~3}gM7o}M&Xye9h-+uj$vGn!u~3jx7SeS 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 literal 0 HcmV?d00001 From 72b51596ad660905d47d534f63e3bd09ad75f112 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Fri, 9 Jun 2017 17:45:18 +0800 Subject: [PATCH 311/379] update --- img/my_wx.png | Bin 293929 -> 102921 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/img/my_wx.png b/img/my_wx.png index 6d6e6ca3a35a8be10285070a8d76fd20ae458b83..bd1a48f1b4730ae910967b54c09b8d5584bed8fd 100644 GIT binary patch literal 102921 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

VVEqd5ncc5ANu&@venS$ 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%0AeW4MAz*I=WvVX!SZ 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 literal 293929 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%0A(338hl~3}gM7o}M&Xye9h-+uj$vGn!u~3jx7SeS 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 From f167bb6dd44ead169610501c4d4afcd0928fd5ae Mon Sep 17 00:00:00 2001 From: qinpeng Date: Fri, 9 Jun 2017 17:48:41 +0800 Subject: [PATCH 312/379] update --- README.md | 2 +- img/{my_wx.png => my_wx2.png} | Bin 2 files changed, 1 insertion(+), 1 deletion(-) rename img/{my_wx.png => my_wx2.png} (100%) diff --git a/README.md b/README.md index 6ab9d2f..e213e9c 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ ## 反馈 [交流&吐槽](https://github.com/pangudashu/php7-internal/issues/3) [错误反馈](https://github.com/pangudashu/php7-internal/issues/2) -![](img/my_wx.png) +![](img/my_wx2.png) ## 目录: * 第1章 PHP基本架构 diff --git a/img/my_wx.png b/img/my_wx2.png similarity index 100% rename from img/my_wx.png rename to img/my_wx2.png From fc4943d67dc47cecf7f66294119f13b53dc8a5d9 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Mon, 12 Jun 2017 19:06:11 +0800 Subject: [PATCH 313/379] add class register --- 7/class.md | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 7/class.md diff --git a/7/class.md b/7/class.md new file mode 100644 index 0000000..3047459 --- /dev/null +++ b/7/class.md @@ -0,0 +1,54 @@ +## 7.9 面向对象 +### 7.9.1 定义内部类 +在扩展中定义一个内部类的方式与函数类似,函数最终注册到EG(function_table),而类则最终注册到EG(class_table)符号表中,注册的过程首先是为类创建一个zend_class_entry结构,然后把这个结构插入EG(class_table),当然这个过程不需要我们手动操作,PHP提供了现成的方法和宏帮我们对zend_class_entry进行初始化以及注册。通常情况下会把内部类的注册放到module startup阶段,也就是定义在扩展的`PHP_MINIT_FUNCTION()`中,一个简单的类的注册只需要以下几行: +```c +PHP_MINIT_FUNCTION(mytest) +{ + //分配一个zend_class_entry,这个结构只在注册时使用,所以分配在栈上即可 + zend_class_entry ce; + //对zend_class_entry进行初始化 + INIT_CLASS_ENTRY(ce, "MyClass", NULL); + //注册 + zend_register_internal_class(&ce); +} +``` +这样就成功定义了一个内部类,类名为"MyClass",只是这个类还没有任何的成员属性、成员方法,定义完成后重新编译、安装扩展,然后在PHP脚本中实例化这个类: +```php +$obj = new MyClass(); + +var_dump($obj); +``` +结果将输出: +``` +object(MyClass)#1 (0) { +} +``` +注册时传入的zend_class_entry并不是最终插入class_table符号表的结构,zend_register_internal_class()中会重新分配,所以注册时的这个结构分配在栈上即可,此结构的成员不需要手动定义,PHP提供了宏供扩展使用,扩展只需要提供类的主要信息即可,常用的两个宏: +```c +/** + * 初始化zend_class_entry + * class_container:zend_class_entry地址 + * class_name:类名 + * functions:成员方法数组 + */ +#define INIT_CLASS_ENTRY(class_container, class_name, functions) \ + INIT_OVERLOADED_CLASS_ENTRY(class_container, class_name, functions, NULL, NULL, NULL) + +/** + * 初始化zend_class_entry,带namespace + * class_container:zend_class_entry地址 + * ns:命名空间 + * class_name:类名 + * functions:成员方法数组 + */ +#define INIT_NS_CLASS_ENTRY(class_container, ns, class_name, functions) \ + INIT_CLASS_ENTRY(class_container, ZEND_NS_NAME(ns, class_name), functions) +``` + +### 7.9.2 定义成员属性 + +### 7.9.3 定义成员方法 + +### 7.9.4 定义常量 + +### 7.9.5 类的实例化 From b2bb49b0c62f2f262c1014c56c19d18ab4bf31d5 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Tue, 13 Jun 2017 10:29:27 +0800 Subject: [PATCH 314/379] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=8F=98=E9=87=8F?= =?UTF-8?q?=E3=80=81=E5=BC=95=E7=94=A8=E8=AE=A1=E6=95=B0=E6=93=8D=E4=BD=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 7/var.md | 96 +++++++++++++++++++++++++++++++++++++++++++++++++------ README.md | 7 ++-- 2 files changed, 90 insertions(+), 13 deletions(-) diff --git a/7/var.md b/7/var.md index 9869898..e615727 100644 --- a/7/var.md +++ b/7/var.md @@ -64,7 +64,66 @@ zval的类型通过`Z_TYPE(zval)`、`Z_TYPE_P(zval*)`两个宏获取,这个值 #define Z_PTR(zval) (zval).value.ptr #define Z_PTR_P(zval_p) Z_PTR(*(zval_p)) ``` -### 7.7.3 引用计数 +### 7.7.3 类型转换 +```c +//将原类型转为特定类型,会更改原来的值 +ZEND_API void ZEND_FASTCALL convert_to_long(zval *op); +ZEND_API void ZEND_FASTCALL convert_to_double(zval *op); +ZEND_API void ZEND_FASTCALL convert_to_long_base(zval *op, int base); +ZEND_API void ZEND_FASTCALL convert_to_null(zval *op); +ZEND_API void ZEND_FASTCALL convert_to_boolean(zval *op); +ZEND_API void ZEND_FASTCALL convert_to_array(zval *op); +ZEND_API void ZEND_FASTCALL convert_to_object(zval *op); + +#define convert_to_cstring(op) if (Z_TYPE_P(op) != IS_STRING) { _convert_to_cstring((op) ZEND_FILE_LINE_CC); } +#define convert_to_string(op) if (Z_TYPE_P(op) != IS_STRING) { _convert_to_string((op) ZEND_FILE_LINE_CC); } + +//获取格式化为long的值,不会更改原来的值,op类型为zval*,返回值为zend_long +#define zval_get_long(op) _zval_get_long((op)) +//获取格式化为double的值,返回值double +#define zval_get_double(op) _zval_get_double((op)) +//获取格式化为string的值,返回值zend_string * +#define zval_get_string(op) _zval_get_string((op)) + +//字符串转整形 +ZEND_API int ZEND_FASTCALL zend_atoi(const char *str, int str_len); +ZEND_API zend_long ZEND_FASTCALL zend_atol(const char *str, int str_len); + +//判断是否为true +#define zval_is_true(op) \ + zend_is_true(op) +``` +### 7.7.4 引用计数 +在扩展中操作与PHP用户空间相关的变量时需要考虑是否需要对其引用计数进行加减,比如下面这个例子: +```php +function test($arr){ + return $arr; +} + +$a = array(1,2); +$b = test($a); +``` +如果把函数test()用内部函数实现,这个函数接受了一个PHP用户空间传入的数组参数,然后又返回并赋值给了PHP用户空间的另外一个变量,这个时候就需要增加传入数组的refcount,因为这个数组由PHP用户空间分配,函数调用前refcount=1,传到内部函数时相当于赋值给了函数的参数,因此refcount增加了1变为2,这次增加在函数执行完释放参数时会减掉,等返回并赋值给$b后此时共有两个变量指向这个数组,所以内部函数需要增加refcount,增加的引用是给返回值的。test()翻译成内部函数: +```c +PHP_FUNCTION(test) +{ + zval *arr; + + if(zend_parse_parameters(ZEND_NUM_ARGS(), "a", &arr) == FAILURE){ + RETURN_FALSE; + } + //如果注释掉下面这句将导致core dumped + Z_TRY_ADDREF_P(arr); + RETURN_ARR(Z_ARR_P(arr)); +} +``` +那么在哪些情况下需要考虑设置引用计数呢?一个关键条件是:操作的是与PHP用户空间相关的变量,包括对用户空间变量的修改、赋值,要明确的一点是引用计数是用来解决多个变量指向同一个value问题的,所以在PHP中来回传递zval的时候就需要考虑下是不是要修改引用计数,下面总结下PHP中常见的会对引用计数进行操作的情况: +* __(1)变量赋值:__ 变量赋值是最常见的情况,一个用到引用计数的变量类型在初始赋值时其refcount=1,如果后面把此变量又赋值给了其他变量那么就会相应的增加其引用计数 +* __(2)数组操作:__ 如果把一个变量插入数组中那么就需要增加这个变量的引用计数,如果要删除一个数组元素则要相应的减少其引用 +* __(3)函数调用:__ 传参实际可以当做普通的变量赋值,将调用空间的变量赋值给被调函数空间的变量,函数返回时会销毁函数空间的变量,这时又会减掉传参的引用,这两个过程由内核完成,不需要扩展自己处理 +* __(4)成员属性:__ 当把一个变量赋值给对象的成员属性时需要增加引用计数 + +PHP中定义了以下宏用于引用计数的操作: ```c //获取引用数:pz类型为zval* #define Z_REFCOUNT_P(pz) zval_refcount_p(pz) @@ -96,7 +155,22 @@ zval的类型通过`Z_TYPE(zval)`、`Z_TYPE_P(zval*)`两个宏获取,这个值 #define Z_TRY_ADDREF(z) Z_TRY_ADDREF_P(&(z)) #define Z_TRY_DELREF(z) Z_TRY_DELREF_P(&(z)) ``` -### 7.7.4 字符串操作 +这些宏操作类型都是zval或zval*,如果需要操作具体value的引用计数可以使用以下宏: +```c +//直接获取zend_value的引用,可以直接通过这个宏修改value的refcount +#define GC_REFCOUNT(p) (p)->gc.refcount +``` +另外还有几个常用的宏: +```c +//判断zval是否用到引用计数机制 +#define Z_REFCOUNTED(zval) ((Z_TYPE_FLAGS(zval) & IS_TYPE_REFCOUNTED) != 0) +#define Z_REFCOUNTED_P(zval_p) Z_REFCOUNTED(*(zval_p)) + +//根据zval获取value的zend_refcounted头部 +#define Z_COUNTED(zval) (zval).value.counted +#define Z_COUNTED_P(zval_p) Z_COUNTED(*(zval_p)) +``` +### 7.7.5 字符串操作 PHP中字符串(即:zend_string)操作相关的宏及函数: ```c //创建zend_string @@ -145,8 +219,10 @@ zend_bool zend_string_equals(zend_string *s1, zend_string *s2); #define ZSTR_H(zstr) (zstr)->h //获取字符串哈希值 #define ZSTR_HASH(zstr) zend_string_hash_val(zstr) //计算字符串哈希值 ``` -### 7.7.5 数组操作 -#### 7.7.5.1 创建数组 +除了上面这些,还有很多字符串大小转换、字符串比较的API定义在zend_operators.h中,这里不再列举。 + +### 7.7.6 数组操作 +#### 7.7.6.1 创建数组 创建一个新的HashTable分为两步:首先是分配zend_array内存,这个可以通过`ZVAL_NEW_ARR()`宏分配,也可以自己直接分配;然后初始化数组,通过`zend_hash_init()`宏完成,如果不进行初始化数组将无法使用。 ```c #define zend_hash_init(ht, nSize, pHashFunction, pDestructor, persistent) \ @@ -166,7 +242,7 @@ uint32_t size; ZVAL_NEW_ARR(&array); zend_hash_init(Z_ARRVAL(array), size, NULL, ZVAL_PTR_DTOR, 0); ``` -#### 7.7.5.2 插入、更新元素 +#### 7.7.6.2 插入、更新元素 数组元素的插入、更新主要有三种情况:key为zend_string、key为普通字符串、key为数值索引,相关的宏及函数: ```c // 1) key为zend_string @@ -220,7 +296,7 @@ zend_hash_init(Z_ARRVAL(array), size, NULL, ZVAL_PTR_DTOR, 0); #define zend_hash_next_index_insert_new(ht, pData) \ _zend_hash_next_index_insert_new(ht, pData ZEND_FILE_LINE_CC) ``` -#### 7.7.5.3 查找元素 +#### 7.7.6.3 查找元素 ```c //根据zend_string key查找数组元素 ZEND_API zval* ZEND_FASTCALL zend_hash_find(const HashTable *ht, zend_string *key); @@ -242,7 +318,7 @@ ZEND_API zend_bool ZEND_FASTCALL zend_hash_index_exists(const HashTable *ht, zen //与zend_hash_num_elements()类似,会有一些特殊处理 ZEND_API uint32_t zend_array_count(HashTable *ht); ``` -#### 7.7.5.4 删除元素 +#### 7.7.6.4 删除元素 ```c //删除key ZEND_API int ZEND_FASTCALL zend_hash_del(HashTable *ht, zend_string *key); @@ -254,7 +330,7 @@ ZEND_API int ZEND_FASTCALL zend_hash_str_del_ind(HashTable *ht, const char *key, ZEND_API int ZEND_FASTCALL zend_hash_index_del(HashTable *ht, zend_ulong h); ZEND_API void ZEND_FASTCALL zend_hash_del_bucket(HashTable *ht, Bucket *p); ``` -#### 7.7.5.5 遍历 +#### 7.7.6.5 遍历 数组遍历类似foreach的用法,在扩展中可以通过如下的方式遍历: ```c zval *val; @@ -298,7 +374,7 @@ ZEND_HASH_FOREACH_VAL(ht, val) { _key = _p->key; \ _val = _z; ``` -#### 7.7.5.6 其它操作 +#### 7.7.6.6 其它操作 ```c //合并两个数组,将source合并到target,overwrite为元素冲突时是否覆盖 #define zend_hash_merge(target, source, pCopyConstructor, overwrite) \ @@ -313,7 +389,7 @@ ZEND_API HashTable* ZEND_FASTCALL zend_array_dup(HashTable *source); ``` 数组排序,compare_func为typedef int (*compare_func_t)(const void *, const void *),需要自己定义比较函数,参数类型为Bucket*,renumber表示是否更改键值,如果为1则会在排序后重新生成各元素的h。PHP中的sort()、rsort()、ksort()等都是基于这个函数实现的。 -#### 7.7.5.7 销毁数组 +#### 7.7.6.7 销毁数组 ```c ZEND_API void ZEND_FASTCALL zend_array_destroy(HashTable *ht); ``` diff --git a/README.md b/README.md index e213e9c..36dd98c 100644 --- a/README.md +++ b/README.md @@ -79,9 +79,10 @@ * [7.7 zval的操作](7/var.md) * [7.7.1 新生成各类型zval](7/var.md) * [7.7.2 获取zval的值及类型](7/var.md) - * [7.7.3 引用计数](7/var.md) - * [7.7.4 字符串操作](7/var.md) - * [7.7.5 数组操作](7/var.md) + * [7.7.3 类型转换](7/var.md) + * [7.7.4 引用计数](7/var.md) + * [7.7.5 字符串操作](7/var.md) + * [7.7.6 数组操作](7/var.md) * [7.8 常量](7/constant.md) * 7.9 面向对象 7.9.1 内部类注册 From 75fad3f0ab266dfc4d5100123f269023bc23ff59 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Tue, 13 Jun 2017 20:57:28 +0800 Subject: [PATCH 315/379] =?UTF-8?q?=E5=91=BD=E5=90=8D=E7=A9=BA=E9=97=B4?= =?UTF-8?q?=E7=9A=84=E5=AE=9A=E4=B9=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 8/namespace.md | 171 ++++++++++++++++++++++++++++++++++++++++++ img/ast_namespace.png | Bin 0 -> 15279 bytes 2 files changed, 171 insertions(+) create mode 100644 8/namespace.md create mode 100644 img/ast_namespace.png diff --git a/8/namespace.md b/8/namespace.md new file mode 100644 index 0000000..f1cb7ab --- /dev/null +++ b/8/namespace.md @@ -0,0 +1,171 @@ +## 8.1 概述 +什么是命名空间?从广义上来说,命名空间是一种封装事物的方法。在很多地方都可以见到这种抽象概念。例如,在操作系统中目录用来将相关文件分组,对于目录中的文件来说,它就扮演了命名空间的角色。具体举个例子,文件 foo.txt 可以同时在目录/home/greg 和 /home/other 中存在,但在同一个目录中不能存在两个 foo.txt 文件。另外,在目录 /home/greg 外访问 foo.txt 文件时,我们必须将目录名以及目录分隔符放在文件名之前得到 /home/greg/foo.txt。这个原理应用到程序设计领域就是命名空间的概念。(引用自php.net) + +命名空间主要用来解决两类问题: +* 用户编写的代码与PHP内部的或第三方的类、函数、常量、接口名字冲突 +* 为很长的标识符名称创建一个别名的名称,提高源代码的可读性 + +PHP命名空间提供了一种将相关的类、函数、常量和接口组合到一起的途径,不同命名空间的类、函数、常量、接口相互隔离不会冲突,注意:PHP命名空间只能隔离类、函数、常量和接口,不包括全局变量。 + +接下来的两节将介绍下PHP命名空间的内部实现,主要从命名空间的定义及使用两个方面分析。 + +## 8.2 命名空间的定义 +### 8.2.1 定义语法 +命名空间通过关键字namespace 来声明,如果一个文件中包含命名空间,它必须在其它所有代码之前声明命名空间,除了declare关键字以外,也就是说除declare之外任何代码都不能在namespace之前声明。另外,命名空间并没有文件限制,可以在多个文件中声明同一个命名空间,也可以在同一文件中声明多个命名空间。 +```php +namespace com\aa; + +const MY_CONST = 1234; +function my_func(){ /* ... */ } +class my_class { /* ... */ } +``` +另外也可以通过{}将类、函数、常量封装在一个命名空间下: +```php +namespace com\aa{ + const MY_CONST = 1234; + function my_func(){ /* ... */ } + class my_class { /* ... */ } +} +``` +但是同一个文件中这两种定义方式不能混用,下面这样的定义将是非法的: +```php +namespace com\aa{ + /* ... */ +} + +namespace com\bb; +/* ... */ +``` +### 8.2.2 内部实现 +命名空间的实现实际比较简单,当声明了一个命名空间后,接下来编译类、函数和常量时会把类名、函数名和常量名统一加上命名空间的名称作为前缀存储,也就是说声明在命名空间中的类、函数和常量的实际名称是被修改过的,这样来看他们与普通的定义方式是没有区别的,只是这个前缀是内核帮我们自动添加的,例如: +```php +namespace com\aa; + +const MY_CONST = 1234; +function my_func(){ /* ... */ } +class my_class { /* ... */ } +``` +最终MY_CONST、my_func、my_class在EG(zend_constants)、EG(function_table)、EG(class_table)中的实际存储名称被修改为:com\aa\MY_CONST、com\aa\my_func、com\aa\my_class。 + +下面具体看下编译过程,namespace语法被编译为ZEND_AST_NAMESPACE类型的语法树节点,它有两个子节点:child[0]为命名空间的名称、child[1]为通过{}方式定义时包裹的语句。 + +![](../img/ast_namespace.png) + +此节点的编译函数为zend_compile_namespace(): +```c +void zend_compile_namespace(zend_ast *ast) +{ + zend_ast *name_ast = ast->child[0]; + zend_ast *stmt_ast = ast->child[1]; + zend_string *name; + zend_bool with_bracket = stmt_ast != NULL; + + //检查声明方式,不允许{}与非{}混用 + ... + + if (FC(current_namespace)) { + zend_string_release(FC(current_namespace)); + } + + if (name_ast) { + name = zend_ast_get_str(name_ast); + + if (ZEND_FETCH_CLASS_DEFAULT != zend_get_class_fetch_type(name)) { + zend_error_noreturn(E_COMPILE_ERROR, "Cannot use '%s' as namespace name", ZSTR_VAL(name)); + } + //将命名空间名称保存到FC(current_namespace) + FC(current_namespace) = zend_string_copy(name); + } else { + FC(current_namespace) = NULL; + } + + //重置use导入的命名空间符号表 + zend_reset_import_tables(); + ... + if (stmt_ast) { + //如果是通过namespace xxx { ... }这种方式声明的则直接编译{}中的语句 + zend_compile_top_stmt(stmt_ast); + zend_end_namespace(); + } +} +``` +从上面的编译过程可以看出,命名空间定义的编译过程非常简单,最主要的操作是把FC(current_namespace)设置为当前定义的命名空间名称,FC()这个宏为:CG(file_context),前面曾介绍过,file_context是在编译过程中使用的一个结构: +```c +typedef struct _zend_file_context { + zend_declarables declarables; + znode implementing_class; + + //当前所属namespace + zend_string *current_namespace; + //是否在namespace中 + zend_bool in_namespace; + //当前namespace是否为{}定义 + zend_bool has_bracketed_namespaces; + + //下面这三个值在后面介绍use时再说明,这里忽略即可 + HashTable *imports; + HashTable *imports_function; + HashTable *imports_const; +} zend_file_context; +``` +编译完namespace声明语句后接着编译下面的语句,此后定义的类、函数、常量均属于此命名空间,直到遇到下一个namespace的定义,接下来继续分析下这三种类型编译过程中有何不同之处。 + +__(1)编译类、函数__ + +前面章节曾详细介绍过函数、类的编译过程,总结下主要分为两步:第1步是编译函数、类,这个过程将分别生成一条ZEND_DECLARE_FUNCTION、ZEND_DECLARE_CLASS的opcode;第2步是在整个脚本编译的最后执行zend_do_early_binding(),这一步相当于执行ZEND_DECLARE_FUNCTION、ZEND_DECLARE_CLASS,函数、类正是在这一步注册到EG(function_table)、EG(class_table)中去的。 + +在生成ZEND_DECLARE_FUNCTION、ZEND_DECLARE_CLASS两条opcode时会把函数名、类名的存储位置通过操作数记录下来,然后在zend_do_early_binding()阶段直接获取函数名、类名作为key注册到EG(function_table)、EG(class_table)中,定义在命名空间中的函数、类的名称修改正是在生成ZEND_DECLARE_FUNCTION、ZEND_DECLARE_CLASS时完成的,下面以函数为例看下具体的处理: +```c +//函数的编译方法 +void zend_compile_func_decl(znode *result, zend_ast *ast) +{ + ... + //生成函数声明的opcode:ZEND_DECLARE_FUNCTION + zend_begin_func_decl(result, op_array, decl); + + //编译参数、函数体 + ... +} +``` +```c +static void zend_begin_func_decl(znode *result, zend_op_array *op_array, zend_ast_decl *decl) +{ + ... + //获取函数名称 + op_array->function_name = name = zend_prefix_with_ns(unqualified_name); + lcname = zend_string_tolower(name); + + if (FC(imports_function)) { + //如果通过use导入了其他命名空间则检查函数名称是否已存在 + } + .... + //生成一条opcode:ZEND_DECLARE_FUNCTION + opline = get_next_op(CG(active_op_array)); + opline->opcode = ZEND_DECLARE_FUNCTION; + //函数名的存储位置记录在op2中 + opline->op2_type = IS_CONST; + LITERAL_STR(opline->op2, zend_string_copy(lcname)); + ... +} +``` +函数名称通过zend_prefix_with_ns()方法获取: +```c +zend_string *zend_prefix_with_ns(zend_string *name) { + if (FC(current_namespace)) { + //如果当前是在namespace下则拼上namespace名称作为前缀 + zend_string *ns = FC(current_namespace); + return zend_concat_names(ZSTR_VAL(ns), ZSTR_LEN(ns), ZSTR_VAL(name), ZSTR_LEN(name)); + } else { + return zend_string_copy(name); + } +} +``` +在zend_prefix_with_ns()方法中如果发现FC(current_namespace)不为空则将函数名加上FC(current_namespace)作为前缀,接下来向EG(function_table)注册时就使用修改后的函数名作为key,类的情况与函数的处理方式相同,不再赘述。 + +__(2)编译常量__ + +常量的编译过程与函数、类基本相同,也是在编译过程获取常量名时检查FC(current_namespace)是否为空,如果不为空表示常量声明在namespace下,则为常量名加上FC(current_namespace)前缀。 + +总结下命名空间的定义:编译时如果发现定义了一个namespace,则将命名空间名称保存到FC(current_namespace),编译类、函数、常量时先判断FC(current_namespace)是否为空,如果为空则按正常名称编译,如果不为空则将类名、函数名、常量名加上FC(current_namespace)作为前缀,然后再以修改后的名称注册。整个过程相当于PHP帮我们补全了类名、函数名、常量名。 + +## 8.3 使用命名空间 diff --git a/img/ast_namespace.png b/img/ast_namespace.png new file mode 100644 index 0000000000000000000000000000000000000000..3396f8fdf86ab9484b5c448eaaaa1dacfc4515fb GIT binary patch literal 15279 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 bDRmsAuX6j{Fl@<1K~a3DD*F*>67+unOy=ZM literal 0 HcmV?d00001 From 4e454cc8cb5bdb5d0328b22b87d7ed2058d6c566 Mon Sep 17 00:00:00 2001 From: ZiMuyang Date: Tue, 13 Jun 2017 23:25:54 +0800 Subject: [PATCH 316/379] Create zval.md --- 2/zval.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/2/zval.md b/2/zval.md index a0e2b22..6f96b7e 100644 --- a/2/zval.md +++ b/2/zval.md @@ -13,7 +13,7 @@ $b = 1; ### 2.1.1 变量的基础结构 ```c -//zend_type.h +//zend_types.h typedef struct _zval_struct zval; typedef union _zend_value { @@ -259,7 +259,7 @@ $a,$b -> zend_string_1(refcount=0,val="hi~") |reference | Y | ``` simple types很显然用不到,不再解释,string、array、object、resource、reference有引用计数机制也很容易理解,下面具体解释下另外两个特殊的类型: -* __interned string:__ 内部字符串,这是种什么类型?我们在PHP中写的所有字符都可以认为是这种类型,比如function name、class name、variable name、静态字符串等等,我们这样定义:`$a = "hi~;"`后面的字符串内容是唯一不变的,这些字符串等同于C语言中定义在静态变量区的字符串:`char *a = "hi~";`,这些字符串的生命周期为request期间,request完成后会统一销毁释放,自然也就无需在运行期间通过引用计数管理内存。 +* __interned string:__ 内部字符串,这是种什么类型?我们在PHP中写的所有字符都可以认为是这种类型,比如function name、class name、variable name、静态字符串等等,我们这样定义:`$a = "hi~";`后面的字符串内容是唯一不变的,这些字符串等同于C语言中定义在静态变量区的字符串:`char *a = "hi~";`,这些字符串的生命周期为request期间,request完成后会统一销毁释放,自然也就无需在运行期间通过引用计数管理内存。 * __immutable array:__ 只有在用opcache的时候才会用到这种类型,不清楚具体实现,暂时忽略。 From 31f60c1be7410632383cb0d4a6effabf695dbc00 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Wed, 14 Jun 2017 14:13:22 +0800 Subject: [PATCH 317/379] add namespace --- 8/namespace.md | 102 ++++++++++++++++++++++++++++++++++++++++++ img/namespace_com.png | Bin 0 -> 12143 bytes 2 files changed, 102 insertions(+) create mode 100644 img/namespace_com.png diff --git a/8/namespace.md b/8/namespace.md index f1cb7ab..62ee4c8 100644 --- a/8/namespace.md +++ b/8/namespace.md @@ -36,9 +36,12 @@ namespace com\aa{ namespace com\bb; /* ... */ ``` +如果没有定义任何命名空间,所有的类、函数和常量的定义都是在全局空间,与 PHP 引入命名空间概念前一样。 + ### 8.2.2 内部实现 命名空间的实现实际比较简单,当声明了一个命名空间后,接下来编译类、函数和常量时会把类名、函数名和常量名统一加上命名空间的名称作为前缀存储,也就是说声明在命名空间中的类、函数和常量的实际名称是被修改过的,这样来看他们与普通的定义方式是没有区别的,只是这个前缀是内核帮我们自动添加的,例如: ```php +//ns_define.php namespace com\aa; const MY_CONST = 1234; @@ -169,3 +172,102 @@ __(2)编译常量__ 总结下命名空间的定义:编译时如果发现定义了一个namespace,则将命名空间名称保存到FC(current_namespace),编译类、函数、常量时先判断FC(current_namespace)是否为空,如果为空则按正常名称编译,如果不为空则将类名、函数名、常量名加上FC(current_namespace)作为前缀,然后再以修改后的名称注册。整个过程相当于PHP帮我们补全了类名、函数名、常量名。 ## 8.3 使用命名空间 +### 8.3.1 基本使用 +上一节我们知道了定义在命名空间中的类、函数和常量只是加上了namespace名称作为前缀,既然是这样那么在使用时加上同样的前缀是否就可以了呢?答案是肯定的,比如上面那个例子:在com\aa命名空间下定义了一个常量MY_CONST,那么就可以这么使用: +```php +include 'ns_define.php'; + +echo \com\aa\MY_CONST; +``` +这种按照实际类名、函数名、常量名使用的方式很容易理解,与普通的类型没有差别,这种以"\"开头使用的名称称之为:完全限定名称,类似于绝对目录的概念,使用这种名称PHP会直接根据"\"之后的名称去对应的符号表中查找(namespace定义时前面是没有加"\"的,所以查找时也会去掉这个字符)。 + +除了这种形式的名称之外,还有两种形式的名称: +* __非限定名称:__ 即没有加任何namespace前缀的普通名称,比如my_func(),使用这种名称时如果当前有命名空间则会被解析为:currentnamespace\my_func,如果当前没有命名空间则按照原始名称my_func解析 +* __部分限定名称:__ 即包含namespace前缀,但不是以"\"开始的,比如:aa\my_func(),类似相对路径的概念,这种名称解析规则比较复杂,如果当前空间没有使用use导入任何namespace那么与非限定名称的解析规则相同,即如果当前有命名空间则会把解析为:currentnamespace\aa\my_func,否则解析为aa\my_func,使用use的情况后面再作说明 + +### 8.3.2 use导入 +使用一个命名空间中的类、函数、常量虽然可以通过完全限定名称的形式访问,但是这种方式需要在每一处使用的地方都加上完整的namespace名称,如果将来namespace名称变更了就需要所有使用的地方都改一遍,这将是很痛苦的一件事,为此,PHP提供了一种命名空间导入/别名的机制,可以通过use关键字将一个命名空间导入或者定义一个别名,然后在使用时就可以通过导入的namespace名称最后一个域或者别名访问,不需要使用完整的名称,比如: +```php +//ns_define.php +namespace aa\bb\cc\dd; + +const MY_CONST = 1234; +``` +可以采用如下几种方式使用: +```php +//方式1: +include 'ns_define.php'; + +use aa\bb\cc\dd; + +echo dd\MY_CONST; +``` +```php +//方式2: +include 'ns_define.php'; + +use aa\bb\cc; + +echo cc\dd\MY_CONST; +``` +```php +//方式3: +include 'ns_define.php'; + +use aa\bb\cc\dd as DD; + +echo DD\MY_CONST; +``` +```php +//方式4: +include 'ns_define.php'; + +use aa\bb\cc as CC; + +echo CC\dd\MY_CONST; +``` +这种机制的实现原理也比较简单:编译期间如果发现use语句 ,那么就将把这个use后的命名空间名称插入一个哈希表:FC(imports),而哈希表的key就是定义的别名,如果没有定义别名则key使用按"\"分割的最后一节,比如方式2的情况将以cc作为key,即:FC(imports)["cc"] = "aa\bb\cc\dd";接下来在使用类、函数和常量时会把名称按"\"分割,然后以第一节为key查找FC(imports),如果找到了则将FC(imports)中保存的名称与使用时的名称拼接在一起,组成完整的名称。实际上这种机制是把完整的名称切割缩短然后缓存下来,使用时再拼接成完整的名称,也就是内核帮我们组装了名称,对内核而言,最终使用的都是包括完整namespace的名称。 + +![](../img/namespace_com.png) + +use除了上面介绍的用法外还可以导入一个类,导入后再使用类就不需要加namespace了,例如: +```php +//ns_define.php +namespace aa\bb\cc\dd; + +class my_class { /* ... */ } +``` +```php +include 'ns_define.php'; +//导入一个类 +use aa\bb\cc\dd\my_class; +//直接使用 +$obj = new my_class(); +var_dump($obj); +``` +use的这两种用法实现原理是一样的,都是在编译时通过查找FC(imports)实现的名称补全。从PHP 5.6起,use又提供了两种针对函数、常量的导入,可以通过`use function xxx`及`use const xxx`导入一个函数、常量,这种用法的实现原理与上面介绍的实际是相同,只是在编译时没有保存到FC(imports),zend_file_context结构中的另外两个哈希表就是在这种情况下使用的: +```c +typedef struct _zend_file_context { + ... + //用于保存导入的类或命名空间 + HashTable *imports; + //用于保存导入的函数 + HashTable *imports_function; + //用于保存导入的常量 + HashTable *imports_const; +} zend_file_context; +``` +简单总结下use的几种不同用法: +* __a.导入命名空间:__ 导入的名称保存在FC(imports)中,编译使用的语句时搜索此符号表进行补全 +* __b.导入类:__ 导入的名称保存在FC(imports)中,与a不同的时如果不会根据"\"切割后的最后一节检索,而是直接使用类名查找 +* __c.导入函数:__ 通过`use function`导入到FC(imports_function),补全时先查找FC(imports_function),如果没有找到则继续按照a的情况处理 +* __d.导入常量:__ 通过`use const`导入到FC(imports_const),不全是先查找FC(imports_const),如果没有找到则继续按照a的情况处理 + +比如: +```php +use aa\bb; //导入namespace +use aa\bb\MY_CLASS; //导入类 +use function aa\bb\my_func; //导入函数 +use const aa\bb\MY_CONST; //导入常量 +``` + diff --git a/img/namespace_com.png b/img/namespace_com.png new file mode 100644 index 0000000000000000000000000000000000000000..7c83a7afbed87d4439b016f807044458f4e17a1c GIT binary patch literal 12143 zcmbVybySpH+wTwplB1N;2!aCAf;5f@hzLrFL#H6!9TFlUEhQx)APv$D0uK!$N_XRs z(*0dL-+R_NXMOAZan87OaG1I0-g{s1i!1o4k{k&k4Iu)7AbBJ&qk=$Sm%`6w1laH| zbLue`JmDEWmXkr8U;O!0mlX}KT(*^e;ebGpwp{$his2-sMIe|Ek7VwvxhAbm_$Usz zrATd7>`&MR`^(8pplwV_1WJt~lDa8${H$)rUzbK=&s}The@?(;7ynQcYm4{2gWy%9 z?2i&7O@lkdoTlju%ioAnLL9%$*~=?;V=>%OqN^^9WQ^@-3vIor~edOoJ2aJ<5E z9U3`7kEY>H6!TYsgd^o@^tXR!J%Xu zN0278N&i!!I!DYH{dHozK-7IbP71<&4UDrY0#Q_d+CGI9P#PQ@e0b=_j{jASBVQvi zIr#~}m0+2Lg$3(4O`*?VG!h?fftf!qvGP?Qd9LbHJ6=<$I7i(0=T%j*GJ1j+U7(=R0@Z-^@ujfi4cg%>7{w;w5OX> zEyP~rD22z54?VpV6&3C6`J+jYs1FJ^nFG94%S%g>#NGZL?PAUdQjw?~_tTuIPltzx zvguoY7rJ)VwwL-sW#`_I&n5&i zVv-?qqobqaN=Pdw32jSD3k4EveP3YqjaULxh+=-2?^}izDUDj&9hy- z^O#!Q4;4P=-tNYBc6MkqO=@43&91wIgl>k)={&nsq&#Z?GP>i7My|`+=)QCZ5V zgt*wp9E-kbX=xc587(a`qo16P@%(27^R*}`DZ4AmbPK0S&B;mp4_EOSJ*6Kn->vR9 z`$A5*!$K=$Ib7#a5j_wU9W5X#idIwm03j7blE;!(ieCHmi(;T(A&@3i_D1B7;#iBJ zg3$Nx@2yZH5U2^x22rmgLFW0Ll>wmzN0r*@>d`Zn(pR3IN%fS3fr><>WqGF8&K zMWI`1``RrrF|o_@UEAD?=a&OfnM4?>yxjOb^TUIK%H4$dE!RTbx<439daBd4r5MiV zx^?akrQ(y4PEPlyYP|mZ)7F;nUu!$_T_JEi4NG7P2O+&o@b*%0Uy8&)gQ-qRLc+?X zD?@mNQCnCH+QQ0;GNcvuWO2(?GAZT4`AbGd ztC`^5?(TKsH=NH4crhdb{QLyW4h{}GR+^f_5U`&=e;yYz3W&(b;Yjb-R8irVl+;yG z`Bqw5s=^EV=tn{;tit+uu9ZnNL!(-U%}}KX1IRG@3hPL?#q@kIRu(mK4rK zLpo2Sy{G4iy!@xa{H)&++8n775kJPpYTULLV@UOLCcTfXQ0?EpV>7o{3X!9(l9QXq z$lNHd+Uh%0sQdVlretJ%baWJ!PZeS{c-qfRz)UM_?YYp@{7p_yZjHrG6DmoO238~; zD=X_Tm;4tsj+h?N`%?nfh#@r(|3M6XD=FDu9dX!O9jULEbgu|>@@|}`GcYhnk)gbD zWybJg573udKH_-nNFEmyaGQ?dvs8OC@a+RqMKS zL*mW)r^a!Ss;i@<%q_9pjGttrXvl??{RY!ojBfTP^Mkl za&2vG4T$LM?3|pOgqu66D;QWYON(}fY69=*o3WLZm4!?Zp;Iz6yg@&obs66+`6lbl zoBb7CU0sk%wqo{@si}#HV`F1lPoFl<*mj#bXlrX57^F3$Dm<_dzCY%dBK_aKB}jX^ zY%A_*YG*i+JSDcRrG+36 z0p3qrQ5`hj*bYJ zA$CnOA9tGygtr-)K8lTtlMt~9K$fAO3_bhF`YAixJOhP5_}(3v?wBsug9dSQccVi| z@TihNic7J=ySH@Q@=myp_J0O%+u{3_com* z5euO|K~!%Z=wxJRx%y8iZBI|n87cJKX_6-4{37dsz(77>Y4{r4uun-En)rD5_%`E} z&$P5K8`98-Ee+63L-1NnP0ifgTvuo34HlMDdPpDNJFNKi4##_I>+9>o!mBW|%5k%p{_LojC_9U8{n+K876OxhbyU4(AEd1wv??M1QFVuaA zhW|H_c3_DK(mYXCCi@9%(8Q0Rb5+P1(5ZF|<`!ug{m)C4HrCb!RaGMV{NM8Oh=p%q zBO0q;uSHK76l=P>yE}^NSXo(FTIMx01A@{gXQ(YTt+1IY`1;iqlV7o1FMCFc4~sB~ z*U-cXY5h4qPDe$h@$A{_g-dXjy0Aa$Mn*=2fuHm86mL-+iNVqkJSh93YCsz0<>inj z<>f-e*C3gzgXZ-qLqbA!cX#p07!;M2_g%Q)&Go+Xjn~~vJ}a_?goW+>`;w&Jye|?3 z@z?zQyCoqz8ymMywVIw@c-C!fgtUB9{`&x={qdevhKjikKObNJ#Kgq-`1@|S7K$Va z2SqSa@8#j*;^O6XdU7JpY;0}4{xjpTeHESZBUlGA!2A-5AnlQ_Qr5tV`2w#Wt_h=G;trA8@aJbd`jn(hJ73(LJGfBe0z8tO#7+4F(a zGh^Osd1UQSbvipg7asrnSfjN&j&C>}YoMp2E0uzMUJYEA#D{e?H#awpO^CidpKT4{ z5?UVbPnYv@tA^;J$)tpDpC(BY%SU)qe@oXuAg~~gqa^Ow(`4ZXc5r)Ch1qWkCdCx0LN zv`q_dZEfA3(0SU{P*l`7x20+Mql)qTpiL6fsOu(E zvIzpQiN}gR%~=TM(qD^aO~!2Wg3P_dM@KG*okPawaAv2_`67-u*g+ zA-{T+jtxsGXMDXk^Z*|ZkJo-WxV^o7d3m|Gn9m0v8-aPc%!ZE@*tbNE0b zd6Lk%3f$bB>`8$l{&K&{xU+fc(B-uZ2dN9Ug8kxrsCM z5EC#1Mu*HwPxsH)JVg}_VRny#$QWrt|AEHMzu@>Mpf{!HZs}tIVk(|`a&qz&BKH^P z2U|wZbH@L1KY=<|Kcy( zJl34|j5?$hPt3CQkI`U4&+_uEZFfM2ZawQgmjaNYSDOdR57pJxsX_vU%mitoqoTC4 z|Kiqc5#jm)f{NqOyNc4S_Z%4ep{3 zc#XK5o^Z-*KlzmJYVdqT!>N_M{ojcimz9d|5T3QrjEtwx=6Ycw0ztu-p0Rz6f2IQWod!+XjoiNosDrtp_?)b(;gqQWD-L zuHN2fv3Io2PL`wqc{jN4{%L%T1GJZfgrwBAEB4OKn>R7LrVkN_23v7^=|YyiB#{RM z#hP3|00*azLPJBlDYt+8i0C(a|L)z50N}*eLuD~z)FgN~n4v+-7rP_4ckbK~5D>V2 z{ko2h&a1NOtSmVuBoYNRv*BGz zE1XK4j?T_hR8*679>TY8Ke`dA$rTIBLjV5xQ$<6=88esuaOaR{)Atz zcHvj>P*fz2>)JgcD_)0tkaYXo0tLFS^?>h!OT;Hlbl!@TkI!D-+_V+_siUFDXgpYI>;;kon8X0j10Bmyz~ZB`N=q1(FZvr6l8GRHWy(2czZ zm$M<5h{Ped?OF~wi20AGgc269JvG33J)%?8c5ZXNXJg^D`i*^)_uOCd``j0xG{e%XbqrtewPWpW&{CZ5?S4Wg&PQ%G+9Yl zT)eij@)iXlkU~6Bi|-vH+7Q}J_m9M9Zxs;e+oNS_Bo1f(l3%^ zf)35e8B)K#aq+0IX<0L}Jv*iKLDD}kKx3U)T3d%L;zG3qiZ}s47=i+z)G7UQ+f8G1 zQ=975JeLa6*#@ASAta(MJIl|KdOV}hlVDnr2K2m2Mvn> z(8Hz}y1S1W7I*jd{#5h5eyvgQKGPXV;C^^1GWIjXmfLOczC#C(w$RCNJw0qj+O#16Lu~Tz~rqHdV;)>U%x)^ z)Qpu`#PQVle=;iB!jUB%q!j(zS6eoDj_HVI2a++r`xU_)plkgmD5zn(S1cd`D(}Du z*0|O+8ABtZJ5*i3V-_6|z7OR|Pb@(_10v+?9DDe;{2$NAnzvym0yeO#J++e+HjJl( zS?Sm*4@t1TkysDkM#?j?^^ml{ z%-R})#|2K{qohg6QgDUHMnPugA{@u7vXA+Amzmw`beWKOWu0~F<8RNq69n){=`>Y| zQ?4;G?r$Ad%*;pyZTR@0=%R3>D!otLm6iM8azGM!X^2yRU;;w}NT@eZs4Be{YQuZ& z+qZA^hl{k_aa{`j?sbyP%m$vG<7ZlJk7C9qs;JKaMd*+bT_Oo)2baquJTn@7@s}X#h7XL!;U~HtOVvC<$AC{*3Y> z9*iuUx6zQm)-0{8)C3SFl*j|TPD?AK8=-lHii$0|1F-wr%S^vZr{r#Xt1o=;XW3dd z^ekJaAo$cc5?-RwVs^6uD%rIc7>bpRO*UH%B80yT@&gA4C)X73?%lh5e0(^CCMG6) zxxooJ5WWynZ{FZV%D0GDs1^>Tio5Z%vj=&fs>1PRZ2brq78FFHKsxpWsfT6^8oIfh zLWWAV8vp4>#Y}bOOHnve*Xig!bQr^~z(aEffAw8x=p9Z@5XT|o&ca%s09o_$@;VFq z?)7%6VfdXM7Zo`wufhK^GoHVJy?vC%6;!2mfhHHwyPb>O1XbD1t!g{=F3l4Q3rrvp zwX7~?V`Hkyft^_|T(`>J#Mt;tL4i`fhR=47uxZI*OE7tNo11vb(_7l+rP+mr z8=xC6udZ5}n*%_C6Ag&y?Nu6u+`bajY;fdsum1bVJ&GtCMgX;B4C0^!0be)^yEK>u z;zJC}sg7X@Z&UL&uMw($iUlg@>vyamRVA4i^Is#GG%;+q>D=6w0O-n~!+2Hiovo zg7P?M6G`Vf@%JzP>F@0P{MJ9H%^WBvi;JeDL8?!m{umsDfGN+c(XkX15}IuAX{fCQ zwA z1fnA&@9U;oU0`y<6F54dsZOZJ7eenuaO-SX7->lBY-bVHzXg$T#6TT|@_S-nX!yC` zED6Aq0_)XBP}Cnk4(W;9d1+&2roWX+*74fq1y?MHu^=4-N;wpxBA^7-=+F8(DG^a_ zVWE`k<|joqhr(oVGJ1P^zkf#s%lw?2v=&NSNqziU`jbX3CkF>E_WhSH*_n;a%-+Vd zgT%BkUe&Ci`m5NeO;k(_^XHHE@z~T=RGv$Sy~={n;M{qSjd%3Nk4Fn}dZwnP-iHfu z`T6;PpnFbshxCB#c%L0E0bVxE6{DKVT5{0W_dTPc7jy28;UFufY>>IZ9Kg#Si>FAG z-?3nS>)buiyEGuc47JjaOg^IxT=-tS;f zeJgWALj{)=Usq5{iYK}Qm_Yz4t-gP=EW?$MD7 zXmlo7EvYjY@|}T2U`l#6T4q6Nd>!_(SwsM4s$)t*Y(i`x2L+u2As4%G2Fgqv5KBLotE9JblwiaxG z$w}SkczD{+R8`XlR>0j%xC$li!5to+p%uqL2P}|Gb8{^+h~KOmwv1P2_nYOht7>#| z4B`$Day>9bc*CY@YiN{1nWY-*?&vVLvdS=TDz_Sozv2h<2qFS{nxWoci{Vz8#ZcbH zfj!y(B#UpXlK#qlB`a!`&PmfXJPCx|QC%e{l@2ytqRL{SclShwh z8jfq=MVdROmH=qb&CMm0wPw!F8fi~KEoH3nKCK?H)WzsMc)k~#bzJrHiEh4dBZv*J z%G`kxUkz^2=Y{%j^n1)vXR33uHQ!dpv)petd|Dx@1xr6AoxMtb@uii)M@OcU`UAhWWu{ln&c9A^1_0J94s zqoRVsw?0!k*>yl|E?`d`O9fsNKr{d~{a2JU%rCi&wQG5a)>Bf7oxSbM+q!~wCrNlV zYXG;NIl9C4Y{Hrs7c_Nxh&drGCKdsNPg+B$WxfCb66&jRiujfb#kvFEnQxsCQRH@? zXdtRde6?{D!eVfzrCl1Nbb3G~k&%(zx48LnHsheUzyrFz5B_(4j9lL(764Rd@ANog zzExWJhmUlZFo|fEfCL@V3LWMr;H>oYJ5)pyFYywv4kp*eDpXZfPw6jJ-qx2RZIl2? z!!XG*EqBppJFu)xv@bsS_bB)>+!(a(xDI321O9{7<{&a1?QlHAv?wdS#olxi&Jjqx zXUqNRAmH`)_n(nmMh$}dev}Bq3JnkJi-bUK38Q<;qg!icX<5pRwRtm0xL3MJ6T=;p zvbo@oA3t&BeLSA{fGYH2#%vhCep)bjC)m)kw&Vv}e+pYb3XHGn7nw;>C z>GGZcy8&Rp4SMgN&{4J9C-kb=g*ty{ZXvL41D(YfAY%e3)oeQpqy#Lh18 z)hDF3|5JF)<42D~92SW$*yzcD-GA698jDFLFeoVN%NNZ!SEqL4<~Jm(|4q_Uk@oO5 zOa+u`cBQ0Gg^3?OT2I!RPkmxFx#HI+ zTRLzNHjSV&crWrs;v+U$SiuxQY`*!S{mD+;o>x%NIGPR#aJNGtU+wwx^V6yGQ%LaTF|aOR z#3ag1jGrGx(9zqwC$3!%<}#>;2YEH%@5R(3zBf0|&CY^_9X(K!iMJN>;X}mGIbp%` zs^MhXt-@buNIDrAnTHPpy<$*lnrL(m7;R)^HkOv}LqbZzuEW4F&RF z8C|F?_hK|h>|ao52Y>~pY1GUGKSBqst`_5LM8QEhWqP?mqeS@!?}1QJ?oEE|%b{&-z1L#4yB6*v$;7cZ#Zy<>oy zKuLradNBtBZnc~oe$TrdcP}6TBbHPltuSr`B#d1-C9j~s)Vmp!YjDfK^hM{J(!joxGc@go@T2RXdmM-mCu3`Z&-W)=u4=h2^emxA>XzJcN{xA zJIq75YkGM}1U0`Xvk;a2%Xq%UxPwkb!a$R}o|?M)h#HtXAldUmX$hDj4u)n?CAa@4XQRzBdf zL3KDk znr43b12+hwLgGOtMCIn7(}JvlXI;M1k>r zKErs%43w#)WLxiSK@ZrSqGI=jvIj&0IAh;22N##P{ruYwWBa+>R^1CX=-O1Ro5SPB zL;|tvwVmXat>DcEpk@*TUdHPcb;a>G+@nkEvKDm(KZZfvb-J^t38Wb}@s#E*Pqc{? z1B^nzk>ouF$OhKTD!x3(%r({3fS(rZML5qr5eV;>iF9UVXiSVd3}xu*hlYm_P`lSn z&XBj{$64^H*BWrCw~8aIPmd8$_3=R-=%jJ#fF=Zkier?Z=4}^v;dP) z^xSP)oDl1Z2}8eszbMRiP+7Q4HP_eIC*`tEx2*w3S;+p$AKx*pIVYEdfEgm3b3vL@ z9SHjHxH@wrm?jD^6Sf-d4>LZ3f`Y8<>>!eUAwU$7*7D_ldU|VgY;3~pCO3CjhAVb! zzE%Y&XqI^5nORv&i;GcFQSnh=!F>B|1OhcZ$9_bUJ}*tEqR;~ZgZdMY`NQ%L%-!z? z?X39FlM=Tt*rVQZHsh@qCvfSD-c9V;>#&A#ktY3H92^&-g1!B>Q)4=WwC!QTe4{b{ zO*S@kU#*H`oL^wzr6WT}$6t$x=#J8&qUl}v7cnU*>s{;GBMX^%dEKVf6Lom0QaRU#rH zAYB4H_W{wOAS){fIcsYUPCXLt#J6ilH_D7;G7^I6DHEur%HM$=-OmG z=s#vis37I}e!?jsF>!bm^^tXi;-{S-HIHs(C28bLC)!amm4|{5q@sC+6D6AQVk7+U zHivlpd)dGb-e9&0N71kiN?EGeYEYcQkgm4`1P06m(LB7yFmD51Mq*h4NK2MNT4cq% z%kR6T&bOt+R^^$H!#rRO5{TxCYu#r;{h=qC>lBC@&d)rK0~1o(`}#I8nC+q~?vK3APTVe(uNB8?^<2#+ zg_8heu*~{#r+9?6I)Uen!KbL>Y@)CkTkd$FWF^Dj4i4^V|3Wq{h5zP8n zuG>}IF1Gox0X#7@yFM==v2jrCPLSUE37AO1b~iM{WH=@ymSO~2QtZn#xvtlx!zdN4PlWm z(&n0OhafP?WyQzye=T`y=3>SuCpWj%&<>(*_sI-Mr48rD4OSZOLu5WjM#60A&xwh; z(o#WQ-iXxHzRoA^mauu|78cttT=)|#U0sJ`SkyVxA3SKz={f>*r)?QQS>Upya3V?S zO%D?(z#)uHUf{u))yr_pOy!z1BLwzqCNZ%Z@Xr4=!jqDcRI`)-+bKVJGU9`Q2{0rI z;0Z`L6oi2zmZo-|@plTs_l{M-ydNJ=YBhW@aLI0Z)93^!4(Z0n%cU(J9)i9wR`N2u zAsylC)ZWyNb=tLV%=Js3x2Vi5tl`U-FF)>VdChJ2Nxj@hivaTXoT7P9I3&gebH0~1 z6}#$Qa&qzTfYgFFnkM) zluTROsC=$TM0KtRGi5L{Xci{~1+uE|z zbAGw)D2K4%o~*yP4V#8j7)cW1;ONAEh9!NAXu|xGZ({`vNJvPWf($uX?{<37nmC)kN>ZynRA>Uq$_A@VIdOuJmS$qC7A-0zTbZVTOZeN literal 0 HcmV?d00001 From 63ddbbe0e03cba31eb5270d064419a42e6fea607 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Wed, 14 Jun 2017 18:14:19 +0800 Subject: [PATCH 318/379] finish namespace --- 8/namespace.md | 168 ++++++++++++++++++++++++++++++++++++++++++++++++- README.md | 11 +++- 2 files changed, 177 insertions(+), 2 deletions(-) diff --git a/8/namespace.md b/8/namespace.md index 62ee4c8..38af53b 100644 --- a/8/namespace.md +++ b/8/namespace.md @@ -263,11 +263,177 @@ typedef struct _zend_file_context { * __c.导入函数:__ 通过`use function`导入到FC(imports_function),补全时先查找FC(imports_function),如果没有找到则继续按照a的情况处理 * __d.导入常量:__ 通过`use const`导入到FC(imports_const),不全是先查找FC(imports_const),如果没有找到则继续按照a的情况处理 -比如: ```php use aa\bb; //导入namespace use aa\bb\MY_CLASS; //导入类 use function aa\bb\my_func; //导入函数 use const aa\bb\MY_CONST; //导入常量 ``` +接下来看下内核的具体实现,首先看下use的编译: +```c +void zend_compile_use(zend_ast *ast) +{ + zend_string *current_ns = FC(current_namespace); + //use的类型 + uint32_t type = ast->attr; + //根据类型获取存储哈希表:FC(imports)、FC(imports_function)、FC(imports_const) + HashTable *current_import = zend_get_import_ht(type); + ... + //use可以同时导入多个 + for (i = 0; i < list->children; ++i) { + zend_ast *use_ast = list->child[i]; + zend_ast *old_name_ast = use_ast->child[0]; + zend_ast *new_name_ast = use_ast->child[1]; + //old_name为use后的namespace名称,new_name为as定义的别名 + zend_string *old_name = zend_ast_get_str(old_name_ast); + zend_string *new_name, *lookup_name; + + if (new_name_ast) { + //如果有as别名则直接使用 + new_name = zend_string_copy(zend_ast_get_str(new_name_ast)); + } else { + const char *unqualified_name; + size_t unqualified_name_len; + if (zend_get_unqualified_name(old_name, &unqualified_name, &unqualified_name_len)) { + //按"\"分割,取最后一节为new_name + new_name = zend_string_init(unqualified_name, unqualified_name_len, 0); + } else { + //名称中没有"\":use aa + new_name = zend_string_copy(old_name); + } + } + //如果是use const则大小写敏感,其它用法都转为小写 + if (case_sensitive) { + lookup_name = zend_string_copy(new_name); + } else { + lookup_name = zend_string_tolower(new_name); + } + ... + if (current_ns) { + //如果当前是在命名空间中则需要检查名称是否冲突 + ... + } + + //插入FC(imports/imports_function/imports_const),key为lookup_name,value为old_name + if (!zend_hash_add_ptr(current_import, lookup_name, old_name)) { + ... + } + } +} +``` +从use的编译过程可以看到,编译时的主要处理是把use导入的名称以别名或最后分节为key存储到对应的哈希表中,接下来我们看下在编译使用类、函数、常量的语句时是如何处理的。使用的语法类型比较多,比如类的使用就有new、访问静态属性、调用静态方法等,但是不管什么语句都会经历获取类名、函数名、常量名这一步,类名的补全就是在这一步完成的。 + +__(1)补全类名__ + +编译时通过zend_resolve_class_name()方法进行类名补全,如果没有任何namespace那么就返回原始的类名,比如编译`new my_class()`时,首先会把"my_class"传入该函数,如果查找FC(imports)后发现是一个use导入的类则把补全后的完整名称返回,然后再进行后续的处理。 +```c +zend_string *zend_resolve_class_name(zend_string *name, uint32_t type) +{ + char *compound; + //"namespace\xxx\类名"这种用法表示使用当前命名空间 + if (type == ZEND_NAME_RELATIVE) { + return zend_prefix_with_ns(name); + } + + //完全限定的形式:new \aa\bb\my_class() + if (type == ZEND_NAME_FQ || ZSTR_VAL(name)[0] == '\\') { + if (ZSTR_VAL(name)[0] == '\\') { + name = zend_string_init(ZSTR_VAL(name) + 1, ZSTR_LEN(name) - 1, 0); + } else { + zend_string_addref(name); + } + ... + return name; + } + + //如果当前脚本有通过use导入namespace + if (FC(imports)) { + compound = memchr(ZSTR_VAL(name), '\\', ZSTR_LEN(name)); + if (compound) { + // 1) 没有直接导入一个类的情况,用法a + //名称中包括"\",比如:new aa\bb\my_class() + size_t len = compound - ZSTR_VAL(name); + //根据按"\"分割后的最后一节为key查找FC(imports) + zend_string *import_name = + zend_hash_find_ptr_lc(FC(imports), ZSTR_VAL(name), len); + //如果找到了表示通过use导入了namespace + if (import_name) { + return zend_concat_names( + ZSTR_VAL(import_name), ZSTR_LEN(import_name), ZSTR_VAL(name) + len + 1, ZSTR_LEN(name) - len - 1); + } + } else { + // 2) 通过use导入一个类的情况,用法b + //直接根据原始类名查找 + zend_string *import_name + = zend_hash_find_ptr_lc(FC(imports), ZSTR_VAL(name), ZSTR_LEN(name)); + + if (import_name) { + return zend_string_copy(import_name); + } + } + } + //没有使用use或没命中任何use导入的namespace,按照基本用法处理:如果当前在一个namespace下则解释为currentnamespace\my_class + return zend_prefix_with_ns(name); +} +``` +此方法除了类的名称后还有一个type参数,这个参数是解析语法是根据使用方式确定的,共有三种类型: +* __ZEND_NAME_NOT_FQ:__ 非限定名称,也就是普通的类名,没有加namespace,比如:new my_class() +* __ZEND_NAME_RELATIVE:__ 相对名称,强制按照当前所属命名空间解析,使用时通过在类前加"namespace\xx",比如:new namespace\my_class(),如果当前是全局空间则等价于:new my_class,如果当前命名空间为currentnamespace,则解析为"currentnamespace\my_class" +* __ZEND_NAME_FQ:__ 完全限定名称,即以"\"开头的 + +__(2)补全函数名、常量名__ + +函数与常量名称的补全操作是相同的: +```c +//补全函数名称 +zend_string *zend_resolve_function_name(zend_string *name, uint32_t type, zend_bool *is_fully_qualified) +{ + return zend_resolve_non_class_name( + name, type, is_fully_qualified, 0, FC(imports_function)); +} +//补全常量名称 +zend_string *zend_resolve_const_name(zend_string *name, uint32_t type, zend_bool *is_fully_qualified) + return zend_resolve_non_class_name( + name, type, is_fully_qualified, 1, FC(imports_const)); +} +``` +可以看到函数与常量最终调用同一方法处理,不同点在于传入了各自的存储哈希表: +```c +zend_string *zend_resolve_non_class_name( + zend_string *name, uint32_t type, zend_bool *is_fully_qualified, + zend_bool case_sensitive, HashTable *current_import_sub +) { + char *compound; + *is_fully_qualified = 0; + //完整名称,直接返回,不需要补全 + if (ZSTR_VAL(name)[0] == '\\') { + *is_fully_qualified = 1; + return zend_string_init(ZSTR_VAL(name) + 1, ZSTR_LEN(name) - 1, 0); + } + //与类的用法相同 + if (type == ZEND_NAME_RELATIVE) { + *is_fully_qualified = 1; + return zend_prefix_with_ns(name); + } + //current_import_sub如果是函数则为FC(imports_function),否则为FC(imports_const) + if (current_import_sub) { + //查找FC(imports_function)或FC(imports_const) + ... + } + //查找FC(imports) + compound = memchr(ZSTR_VAL(name), '\\', ZSTR_LEN(name)); + ... + + return zend_prefix_with_ns(name); +} +``` +可以看到,函数与常量的的补全逻辑只是优先用原始名称去FC(imports_function)或FC(imports_const)查找,如果没有找到再去FC(imports)中匹配。如果我们这样导入了一个函数:`use aa\bb\my_func;`,编译`my_func()`会在FC(imports_function)中根据"my_func"找到"aa\bb\my_func",从而使用完整的这个名称。 + +### 8.3.3 动态使用 +前面介绍的这些命名空间的使用都是名称为CONST类型的情况,所有的处理都是在编译环节完成的,PHP是动态语言,能否动态使用命名空间呢?举个例子: +```php +$class_name = "\aa\bb\my_class"; +$obj = new $class_name; +``` +如果类似这样的用法只能只用完全限定名称,也就是按照实际存储的名称使用,无法进行自动名称补全。 diff --git a/README.md b/README.md index 36dd98c..0fcbe4d 100644 --- a/README.md +++ b/README.md @@ -94,7 +94,16 @@ * 7.11 经典扩展解析 * 7.8.1 Yaf * 7.8.2 Redis - +* 第8章 命名空间 + * [8.1 概述](8/namespace.md) + * [8.2 命名空间的定义](8/namespace.md) + * [8.2.1 定义语法](8/namespace.md) + * [8.2.2 内部实现](8/namespace.md) + * [8.3 命名空间的使用](8/namespace.md) + * [8.3.1 基本用法](8/namespace.md) + * [8.3.2 use导入](8/namespace.md) + * [8.3.3 动态用法](8/namespace.md) + ## 附录 * [附录1:break/continue按标签中断语法实现](try/break.md) From 336032b0b71c96f5ac2588632976e2d15895cb05 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Wed, 14 Jun 2017 18:16:59 +0800 Subject: [PATCH 319/379] update --- 8/namespace.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/8/namespace.md b/8/namespace.md index 38af53b..b9b7c6d 100644 --- a/8/namespace.md +++ b/8/namespace.md @@ -171,8 +171,8 @@ __(2)编译常量__ 总结下命名空间的定义:编译时如果发现定义了一个namespace,则将命名空间名称保存到FC(current_namespace),编译类、函数、常量时先判断FC(current_namespace)是否为空,如果为空则按正常名称编译,如果不为空则将类名、函数名、常量名加上FC(current_namespace)作为前缀,然后再以修改后的名称注册。整个过程相当于PHP帮我们补全了类名、函数名、常量名。 -## 8.3 使用命名空间 -### 8.3.1 基本使用 +## 8.3 命名空间的使用 +### 8.3.1 基本用法 上一节我们知道了定义在命名空间中的类、函数和常量只是加上了namespace名称作为前缀,既然是这样那么在使用时加上同样的前缀是否就可以了呢?答案是肯定的,比如上面那个例子:在com\aa命名空间下定义了一个常量MY_CONST,那么就可以这么使用: ```php include 'ns_define.php'; @@ -429,7 +429,7 @@ zend_string *zend_resolve_non_class_name( ``` 可以看到,函数与常量的的补全逻辑只是优先用原始名称去FC(imports_function)或FC(imports_const)查找,如果没有找到再去FC(imports)中匹配。如果我们这样导入了一个函数:`use aa\bb\my_func;`,编译`my_func()`会在FC(imports_function)中根据"my_func"找到"aa\bb\my_func",从而使用完整的这个名称。 -### 8.3.3 动态使用 +### 8.3.3 动态用法 前面介绍的这些命名空间的使用都是名称为CONST类型的情况,所有的处理都是在编译环节完成的,PHP是动态语言,能否动态使用命名空间呢?举个例子: ```php $class_name = "\aa\bb\my_class"; From c97fe96976814da415db1e5eb9e88e73929d2c9c Mon Sep 17 00:00:00 2001 From: ZiMuyang Date: Thu, 15 Jun 2017 21:53:50 +0800 Subject: [PATCH 320/379] Update zend_compile_opcode.md --- 3/zend_compile_opcode.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3/zend_compile_opcode.md b/3/zend_compile_opcode.md index a8fde50..6969c1a 100644 --- a/3/zend_compile_opcode.md +++ b/3/zend_compile_opcode.md @@ -516,7 +516,7 @@ void zend_compile_expr(znode *result, zend_ast *ast) ``` >> __第3步:__ 上面两步已经分别生成了变量赋值的op1、op2,下面就是根据这俩值生成opcode的过程。 ```c -tatic zend_op *zend_emit_op(znode *result, zend_uchar opcode, znode *op1, znode *op2) +static zend_op *zend_emit_op(znode *result, zend_uchar opcode, znode *op1, znode *op2) { zend_op *opline = get_next_op(CG(active_op_array)); //当前zend_op_array下生成一条新的指令 opline->opcode = opcode; From 83bd270acc27f43fb2b2d4230f16eaf3bfe10c4e Mon Sep 17 00:00:00 2001 From: ZiMuyang Date: Fri, 16 Jun 2017 18:36:07 +0800 Subject: [PATCH 321/379] Update function_implement.md --- 3/function_implement.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3/function_implement.md b/3/function_implement.md index 5373d41..d3c0fe6 100644 --- a/3/function_implement.md +++ b/3/function_implement.md @@ -8,7 +8,7 @@ function my_func(){ ... } ``` -汇编中函数对应的是一组独立的汇编指令,然后通过call指令实现函数的调用,前面已经说过PHP编译的结果是opcode数组,与汇编指令对应,PHP用户自定义函数的实现就是将函数编译为独立的opcode数组,调用时分配独立的执行栈依次执行opcode,所以自定义函数对于zend而言并没有什么特别之处,只是将opcode进行了打包封装,实际PHP脚本中函数之外的指令整个可以认为是一个函数(或者理解为main函数更直观)。 +汇编中函数对应的是一组独立的汇编指令,然后通过call指令实现函数的调用。前面已经说过PHP编译的结果是opcode数组,与汇编指令对应。PHP用户自定义函数的实现就是将函数编译为独立的opcode数组,调用时分配独立的执行栈依次执行opcode,所以自定义函数对于zend而言并没有什么特别之处,只是将opcode进行了打包封装。PHP脚本中函数之外的指令,整个可以认为是一个函数(或者理解为main函数更直观)。 ```php /* function main(){ */ From 8db476b8d37c0f44f7dd2ecfc68357134df671c0 Mon Sep 17 00:00:00 2001 From: ZiMuyang Date: Fri, 16 Jun 2017 21:48:32 +0800 Subject: [PATCH 322/379] Update zend_executor.md --- 3/zend_executor.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3/zend_executor.md b/3/zend_executor.md index d589492..b1ed95d 100644 --- a/3/zend_executor.md +++ b/3/zend_executor.md @@ -62,7 +62,7 @@ ZEND_API zend_executor_globals executor_globals; struct _zend_execute_data { const zend_op *opline; //指向当前执行的opcode,初始时指向zend_op_array起始位置 zend_execute_data *call; /* current call */ - zval *return_value; //返回值指针 */ + zval *return_value; //返回值指针 zend_function *func; //当前执行的函数(非函数调用时为空) zval This; //这个值并不仅仅是面向对象的this,还有另外两个值也通过这个记录:call_info + num_args,分别存在zval.u1.reserved、zval.u2.num_args zend_class_entry *called_scope; //当前call的类 From fdaf1f89600cf1b79714727fb104f804adc042de Mon Sep 17 00:00:00 2001 From: ZiMuyang Date: Sat, 17 Jun 2017 22:57:44 +0800 Subject: [PATCH 323/379] Update zend_object.md --- 3/zend_object.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3/zend_object.md b/3/zend_object.md index cf44ef7..756d2fa 100644 --- a/3/zend_object.md +++ b/3/zend_object.md @@ -437,7 +437,7 @@ static int zend_std_compare_objects(zval *o1, zval *o2) "==="的比较通过函数`zend_is_identical()`处理,比较简单,这里不再展开。 #### 3.4.2.6 对象的销毁 -object与string、array等类型不同,它是个符合类型,所以它的销毁过程更加复杂,赋值、函数调用结束或主动unset等操作中如果发现object引用计数为0则将触发销毁动作。 +object与string、array等类型不同,它是个复合类型,所以它的销毁过程更加复杂,赋值、函数调用结束或主动unset等操作中如果发现object引用计数为0则将触发销毁动作。 ```php //情况1 $obj1 = new my_function(); From fda9bae85f3252a554e9a747f257dba9bf67e238 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Thu, 22 Jun 2017 13:55:03 +0800 Subject: [PATCH 324/379] update zendmm --- 5/zend_alloc.md | 58 ++++++++++++++++++++++++++++++++++++++++++-- img/align.png | Bin 0 -> 6006 bytes img/chunk_alloc.png | Bin 0 -> 3805 bytes 3 files changed, 56 insertions(+), 2 deletions(-) create mode 100644 img/align.png create mode 100644 img/chunk_alloc.png diff --git a/5/zend_alloc.md b/5/zend_alloc.md index 5fe35aa..df3fa05 100644 --- a/5/zend_alloc.md +++ b/5/zend_alloc.md @@ -151,7 +151,56 @@ static void *zend_mm_alloc_huge(zend_mm_heap *heap, size_t size ZEND_FILE_LINE_D return ptr; } ``` -huge的分配过程还是比较简单的。 +huge的分配实际就是分配多个chunk,chunk的分配也是large、small内存分配的基础,它是ZendMM向系统申请内存的唯一粒度。在申请chunk内存时有一个关键操作,那就是将内存地址对齐到ZEND_MM_CHUNK_SIZE,也就是说申请的chunk地址都是ZEND_MM_CHUNK_SIZE的整数倍,注意:这里说的内存对齐值并不是系统的字节对齐值,所以需要在申请后自己调整下。ZendMM的处理方法是:先按实际要申请的内存大小申请一次,如果系统分配的地址恰好是ZEND_MM_CHUNK_SIZE的整数倍那么就不需要调整了,直接返回使用;如果不是ZEND_MM_CHUNK_SIZE的整数倍,ZendMM会把这块内存释放掉,然后按照"实际要申请的内存大小+ZEND_MM_CHUNK_SIZE"的大小重新申请一块内存,多申请的ZEND_MM_CHUNK_SIZE大小的内存是用来调整的,ZendMM会从系统分配的地址向后偏移到ZEND_MM_CHUNK_SIZE的整数倍位置,调整完以后会把多余的内存再释放掉,如下图所示,虚线部分为alignment大小的内容,灰色部分为申请的内容大小,系统返回的地址为ptr1,而实际使用的内存是从ptr2开始的。 + +![](../img/chunk_alloc.png) + +下面看下chunk的具体分配过程: +```c +//size为申请内存的大小,alignment为内存对齐值,一般为ZEND_MM_CHUNK_SIZE +static void *zend_mm_chunk_alloc_int(size_t size, size_t alignment) +{ + //向系统申请size大小的内存 + void *ptr = zend_mm_mmap(size); + if (ptr == NULL) { + return NULL; + } else if (ZEND_MM_ALIGNED_OFFSET(ptr, alignment) == 0) {//判断申请的内存是否为alignment的整数倍 + //是的话直接返回 + return ptr; + }else{ + //申请的内存不是按照alignment对齐的,注意这里的alignment并不是系统的字节对齐值 + size_t offset; + + //将申请的内存释放掉重新申请 + zend_mm_munmap(ptr, size); + //重新申请一块内存,这里会多申请一块内存,用于截取到alignment的整数倍,可以忽略REAL_PAGE_SIZE + ptr = zend_mm_mmap(size + alignment - REAL_PAGE_SIZE); + //offset为ptr距离上一个alignment对齐内存位置的大小,注意不能往前移,因为前面的内存都是分配了的 + offset = ZEND_MM_ALIGNED_OFFSET(ptr, alignment); + if (offset != 0) { + offset = alignment - offset; + zend_mm_munmap(ptr, offset); + //偏移ptr,对齐到alignment + ptr = (char*)ptr + offset; + alignment -= offset; + } + if (alignment > REAL_PAGE_SIZE) { + zend_mm_munmap((char*)ptr + size, alignment - REAL_PAGE_SIZE); + } + return ptr; + } +} +``` +这个过程中用到了一个宏: +```c +#define ZEND_MM_ALIGNED_OFFSET(size, alignment) \ + (((size_t)(size)) & ((alignment) - 1)) +``` +这个宏的作用是计算按alignment对齐的内存地址距离上一个alignment整数倍内存地址的大小,alignment必须为2的n次方,比如一段n*alignment大小的内存,ptr为其中一个位置,那么就可以通过位运算计算得到ptr所属内存块的offset: + +![](../img/align.png) + +这个位运算是因为alignment为2^n,所以可以通过alignment取到最低位的位置,也就是相对上一个整数倍alignment的offset,实际如果不用运算的话可以通过:`offset = (ptr/alignment取整)*alignment - ptr`得到,这个更容易理解些。 #### 5.1.3.2 Large分配 大于3/4的page_size(4KB)且小于等于511个page_size的内存申请,也就是一个chunk的大小够用(之所以是511个page而不是512个是因为第一个page始终被chunk结构占用),__如果申请多个page的话 分配的时候这些page都是连续的__ 。 @@ -352,7 +401,9 @@ ZEND_API void ZEND_FASTCALL _efree(void *ptr ZEND_FILE_LINE_DC ZEND_FILE_LINE_OR static zend_always_inline void zend_mm_free_heap(zend_mm_heap *heap, void *ptr ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC) { - size_t page_offset = ZEND_MM_ALIGNED_OFFSET(ptr, ZEND_MM_CHUNK_SIZE); //根据内存地址及对齐值判断内存地址偏移量是否为0,是的话只有huge情况符合,page、slot分配出的内存地址偏移量一定是>=ZEND_MM_CHUNK_SIZE的,因为第一页始终被chunk自身结构占用,不可能分配出去 + //根据内存地址及对齐值判断内存地址偏移量是否为0,是的话只有huge情况符合,page、slot分配出的内存地>址偏移量一定是>=ZEND_MM_CHUNK_SIZE的,因为第一页始终被chunk自身结构占用,不可能分配出去 + //offset就是ptr距离当前chunk起始位置的偏移量 + size_t page_offset = ZEND_MM_ALIGNED_OFFSET(ptr, ZEND_MM_CHUNK_SIZE); if (UNEXPECTED(page_offset == 0)) { if (ptr != NULL) { @@ -360,6 +411,7 @@ static zend_always_inline void zend_mm_free_heap(zend_mm_heap *heap, void *ptr Z zend_mm_free_huge(heap, ptr ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC); } } else { //page或slot,根据chunk->map[]值判断当前page的分配类型 + //根据ptr获取chunk的起始位置 zend_mm_chunk *chunk = (zend_mm_chunk*)ZEND_MM_ALIGNED_BASE(ptr, ZEND_MM_CHUNK_SIZE); int page_num = (int)(page_offset / ZEND_MM_PAGE_SIZE); zend_mm_page_info info = chunk->map[page_num]; @@ -377,6 +429,8 @@ static zend_always_inline void zend_mm_free_heap(zend_mm_heap *heap, void *ptr Z } } ``` +释放的内存地址可能是chunk中间的任意位置,因为chunk分配时是按照ZEND_MM_CHUNK_SIZE对齐的,也就是chunk的起始内存地址一定是ZEND_MM_CHUNK_SIZE的整数倍,所以可以根据chunk上的任意位置知道chunk的起始位置。 + 释放page的过程有一个地方值得注意,如果释放后发现当前chunk所有page都已经被释放则可能会释放所在chunk,还记得heap->cached_chunks吗?内存池会维持一定的chunk数,每次释放并不会直接销毁而是加入到cached_chunks中,这样下次申请chunk时直接就用了,同时为了防止占用过多内存,cached_chunks会根据每次request请求计算的chunk使用均值保证其维持在一定范围内。 每次request请求结束会对内存池进行一次清理,检查cache的chunk数是否超过均值,超过的话就进行清理,具体的操作:`zend_mm_shutdown`,这里不再展开。 diff --git a/img/align.png b/img/align.png new file mode 100644 index 0000000000000000000000000000000000000000..63d6e125e6ef467ec83ee41ba6c97a3f4318d77e GIT binary patch literal 6006 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 G&;AFk+Quya literal 0 HcmV?d00001 diff --git a/img/chunk_alloc.png b/img/chunk_alloc.png new file mode 100644 index 0000000000000000000000000000000000000000..049b76d3ffcc3c00042693512c593f8c4c065b52 GIT binary patch literal 3805 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 literal 0 HcmV?d00001 From 50d5eab2b39852d302270f119ee6f619159cce37 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Thu, 22 Jun 2017 17:03:39 +0800 Subject: [PATCH 325/379] fix error --- 1/fpm.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/1/fpm.md b/1/fpm.md index 49f961f..cea236c 100644 --- a/1/fpm.md +++ b/1/fpm.md @@ -236,8 +236,8 @@ worker处理到各个阶段时将会把当前阶段更新到`fpm_scoreboard_proc ```c void fpm_event_loop(int err) { - //创建一个io read的监听事件,这里监听的就是在fpm_init()阶段中通过socketpair()创建管道sp[1] - //当sp[1]可读时将回调fpm_got_signal() + //创建一个io read的监听事件,这里监听的就是在fpm_init()阶段中通过socketpair()创建管道sp[0] + //当sp[0]可读时将回调fpm_got_signal() fpm_event_set(&signal_fd_event, fpm_signals_get_fd(), FPM_EV_READ, &fpm_got_signal, NULL); fpm_event_add(&signal_fd_event, 0); From 17191469cab1e1fc29ae7830983dd17f6c38b3cb Mon Sep 17 00:00:00 2001 From: qinpeng Date: Tue, 27 Jun 2017 20:01:01 +0800 Subject: [PATCH 326/379] update --- 2/zend_ht.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/2/zend_ht.md b/2/zend_ht.md index 95d8177..56c818c 100644 --- a/2/zend_ht.md +++ b/2/zend_ht.md @@ -61,6 +61,8 @@ unset($arr["c"]); ![](../img/zend_hash_1.png) +> 图中Bucket的zval.u2.next默认值应该为-1,不是0 + ### 2.2.2 映射函数 映射函数(即:散列函数)是散列表的关键部分,它将key与value建立映射关系,一般映射函数可以根据key的哈希值与Bucket数组大小取模得到,即`key->h % ht->nTableSize`,但是PHP却不是这么做的: ```c From 561a23b2e7c6062a7b5e1562d814758218d321a5 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Thu, 29 Jun 2017 18:55:22 +0800 Subject: [PATCH 327/379] fix error --- img/EG.png | Bin 132759 -> 129506 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/img/EG.png b/img/EG.png index 64efe82818065100378044aa31b37aeacfcf3479..0dcd16c8a11b037119a413d11c72311e4d8fffa0 100644 GIT binary patch literal 129506 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 literal 132759 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
    8q-8F6!!sDoXwZ!L#Dl7ApHS>>;5_X-|pv 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%0A6xjp5t_t& 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 QZXgpqUHx3vIVCg!03*Jy=Kufz From 59056dfaf0c13453278730b98f769bec69e599b1 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Thu, 6 Jul 2017 09:25:35 +0800 Subject: [PATCH 328/379] fix error --- 4/break.md | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/4/break.md b/4/break.md index 5bfc256..47ec5b8 100644 --- a/4/break.md +++ b/4/break.md @@ -19,7 +19,15 @@ typedef struct _zend_brk_cont_element { ``` cont记录的是当前循环判断条件opcode起始位置,brk记录的是当前循环结束的位置,parent记录的是父层循环`zend_brk_cont_element`结构的存储位置,也就是说多层嵌套循环会生成一个`zend_brk_cont_element`的链表,每层循环编译结束时更新自己的`zend_brk_cont_element`结构,所以break、continue的处理过程实际就是根据跳出的层级索引到那一层的`zend_brk_cont_element`结构,然后得到它的cont、brk进行相应的opcode跳转。 -各循环的`zend_brk_cont_element`结构保存在`zend_op_array->brk_cont_array`数组中,实际这个数组在编译前就已经分配好了,编译各循环时依次申请一个`zend_brk_cont_element`,`zend_op_array->last_brk_cont`记录此数组第一个可用位置,每申请一个元素last_brk_cont就相应的增加1,parent记录的就是父层循环在`zend_op_array->brk_cont_array`中的位置。 +各循环的`zend_brk_cont_element`结构保存在`zend_op_array->brk_cont_array`数组中,编译各循环时依次申请一个`zend_brk_cont_element`,`zend_op_array->last_brk_cont`记录此数组第一个可用位置,每申请一个元素last_brk_cont就相应的增加1,然后将数组扩容,parent记录的就是父层循环结构在该数组中的存储位置。 +```c +zend_brk_cont_element *get_next_brk_cont_element(zend_op_array *op_array) +{ + op_array->last_brk_cont++; + op_array->brk_cont_array = erealloc(op_array->brk_cont_array, sizeof(zend_brk_cont_element)*op_array->last_brk_cont); + return &op_array->brk_cont_array[op_array->last_brk_cont-1]; +} +``` 示例: ```php From 70108cd0868d0e44c20455e73fd58f349d4436b0 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Fri, 7 Jul 2017 16:10:45 +0800 Subject: [PATCH 329/379] fix error --- 7/func.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/7/func.md b/7/func.md index 0807f69..e04228a 100644 --- a/7/func.md +++ b/7/func.md @@ -355,7 +355,7 @@ callable指函数或成员方法,如果参数是函数名称字符串、array( zend_fcall_info callable; //注意,这两个结构不能是指针 zend_fcall_info_cache call_cache; -if(zend_parse_parameters( +if(zend_parse_parameters(ZEND_NUM_ARGS(), "f", &callable, &call_cache) == FAILURE){ RETURN_FALSE; } ``` From c6983b641bc2285c5c0e0014affa7b47591697f7 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Fri, 7 Jul 2017 18:36:26 +0800 Subject: [PATCH 330/379] add defer --- img/defer.png | Bin 0 -> 20196 bytes try/break.md | 2 +- try/defer.md | 23 +++++++++++++++++++++++ 3 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 img/defer.png create mode 100644 try/defer.md diff --git a/img/defer.png b/img/defer.png new file mode 100644 index 0000000000000000000000000000000000000000..08c48e5a9c3be0704bdb22734f3e075fcc779964 GIT binary patch literal 20196 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 BFvchild[0]; zend_ast *cond_ast = ast->child[1]; diff --git a/try/defer.md b/try/defer.md new file mode 100644 index 0000000..66e35ee --- /dev/null +++ b/try/defer.md @@ -0,0 +1,23 @@ +# 附录2:defer推迟执行语法的实现 + +使用过Go语言的应该都知道defer这个语法,它用来推迟一个函数的执行,在函数执行返回前首先检查当前函数内是否有推迟执行的函数,如果有则执行,然后再返回。defer是一个非常有用的语法,这个功能可以很方便的在函数结束前执行一些清理工作,比如关闭打开的文件、关闭连接、释放资源、解锁等等。这样延迟一个函数有以下两个好处: + + * (1) 靠近使用位置,避免漏掉清理工作,同时比放在函数结尾要清晰 + * (2) 如果有多处返回的地方可以避免代码重复,比如函数中有很多处return + +在一个函数中可以使用多个defer,其执行顺序与栈类似:后进先出,先定义的defer后执行。另外,在返回之后定义的defer将不会被执行,只有返回前定义的才会执行,通过exit退出程序的情况也不会执行任何defer。 + +在PHP中并没有实现类似的语法,接下来我们介绍下如何在PHP中实现类似Go语言中defer的功能。此功能的实现需要对PHP的语法解析、抽象语法树/opcode的编译、opcode指令的执行等环节进行改造,涉及的地方比较多,但是改动点比较简单,可以很好的帮助大家完整的理解PHP编译、执行两个核心阶段的实现。整体实现思路: + + * (1) 语法解析:defer本质上还是函数调用,只是将调用时机移到了函数的最后,所以编译时可以复用调用函数的规则,但是需要与普通的调用区分开,所以我们新增一个AST节点类型,其子节点为为正常函数调用编译的AST,语法我们定义为:`defer function_name()`; + * (2) AST编译为opcode:编译opcode时也复用调用函数的编译逻辑,不同的地方在于把defer放在最后编译,另外需要在编译return前新增一条opcode,用于执行return前跳转到defer开始的位置,在defer的最后也需要新增一条opcode,用于执行完defer后跳回return的位置; + * (3) 执行阶段:执行时如果发现是return前新增的opcode则跳转到defer开始的位置,同时把return的位置记录下来,执行完defer后再跳回return。 + +编译后的opcode指令如下图所示: + +![](../img/defer.png) + +1、修改词法解析文件,将defer解析为token:T_DEFER +2、修改语法解析文件,支持语法:T_DEFER function_call,解析为AST:ZEND_AST_DEFER_CALL +3、编译ZEND_AST_DEFER_CALL时加入defer栈 +4、编译结束时继续编译defer栈中的function_call,最后编译一条ZEND_JMP,用于跳回return/exit/die的位置 From 1a059c238eb688f21bfe6fc99e7e97aed67d9fc7 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Fri, 7 Jul 2017 18:39:54 +0800 Subject: [PATCH 331/379] update --- try/defer.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/try/defer.md b/try/defer.md index 66e35ee..7f61355 100644 --- a/try/defer.md +++ b/try/defer.md @@ -2,16 +2,16 @@ 使用过Go语言的应该都知道defer这个语法,它用来推迟一个函数的执行,在函数执行返回前首先检查当前函数内是否有推迟执行的函数,如果有则执行,然后再返回。defer是一个非常有用的语法,这个功能可以很方便的在函数结束前执行一些清理工作,比如关闭打开的文件、关闭连接、释放资源、解锁等等。这样延迟一个函数有以下两个好处: - * (1) 靠近使用位置,避免漏掉清理工作,同时比放在函数结尾要清晰 - * (2) 如果有多处返回的地方可以避免代码重复,比如函数中有很多处return +* (1) 靠近使用位置,避免漏掉清理工作,同时比放在函数结尾要清晰 +* (2) 如果有多处返回的地方可以避免代码重复,比如函数中有很多处return 在一个函数中可以使用多个defer,其执行顺序与栈类似:后进先出,先定义的defer后执行。另外,在返回之后定义的defer将不会被执行,只有返回前定义的才会执行,通过exit退出程序的情况也不会执行任何defer。 在PHP中并没有实现类似的语法,接下来我们介绍下如何在PHP中实现类似Go语言中defer的功能。此功能的实现需要对PHP的语法解析、抽象语法树/opcode的编译、opcode指令的执行等环节进行改造,涉及的地方比较多,但是改动点比较简单,可以很好的帮助大家完整的理解PHP编译、执行两个核心阶段的实现。整体实现思路: - * (1) 语法解析:defer本质上还是函数调用,只是将调用时机移到了函数的最后,所以编译时可以复用调用函数的规则,但是需要与普通的调用区分开,所以我们新增一个AST节点类型,其子节点为为正常函数调用编译的AST,语法我们定义为:`defer function_name()`; - * (2) AST编译为opcode:编译opcode时也复用调用函数的编译逻辑,不同的地方在于把defer放在最后编译,另外需要在编译return前新增一条opcode,用于执行return前跳转到defer开始的位置,在defer的最后也需要新增一条opcode,用于执行完defer后跳回return的位置; - * (3) 执行阶段:执行时如果发现是return前新增的opcode则跳转到defer开始的位置,同时把return的位置记录下来,执行完defer后再跳回return。 +* (1) 语法解析:defer本质上还是函数调用,只是将调用时机移到了函数的最后,所以编译时可以复用调用函数的规则,但是需要与普通的调用区分开,所以我们新增一个AST节点类型,其子节点为为正常函数调用编译的AST,语法我们定义为:`defer function_name()`; +* (2) AST编译为opcode:编译opcode时也复用调用函数的编译逻辑,不同的地方在于把defer放在最后编译,另外需要在编译return前新增一条opcode,用于执行return前跳转到defer开始的位置,在defer的最后也需要新增一条opcode,用于执行完defer后跳回return的位置; +* (3) 执行阶段:执行时如果发现是return前新增的opcode则跳转到defer开始的位置,同时把return的位置记录下来,执行完defer后再跳回return。 编译后的opcode指令如下图所示: From 8552cec11643625189b02e144f4feaed66e876ad Mon Sep 17 00:00:00 2001 From: qinpeng Date: Fri, 7 Jul 2017 19:55:39 +0800 Subject: [PATCH 332/379] add ast --- img/defer_ast.png | Bin 0 -> 14606 bytes try/defer.md | 50 ++++++++++++++++++++++++++++++++++++++-------- 2 files changed, 42 insertions(+), 8 deletions(-) create mode 100644 img/defer_ast.png diff --git a/img/defer_ast.png b/img/defer_ast.png new file mode 100644 index 0000000000000000000000000000000000000000..db1da709f4a931e719031c1fb100409571a85b60 GIT binary patch literal 14606 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"defer" { + RETURN_TOKEN(T_DEFER); +} +``` +完成词法解析规则的修改后接着需要定义语法解析规则,这是非常关键的一步,语法解析器会根据配置的语法规则将PHP代码解析为抽象语法树(AST)。普通函数调用会被解析为ZEND_AST_CALL类型的AST节点,我们新增一种节点类型:ZEND_AST_DEFER_CALL,抽象语法树的节点类型为enum,定义在zend_ast.h中,同时此节点只需要一个子节点,这个子节点用于保存ZEND_AST_CALL节点,因此zend_ast.h的修改如下: +```c +enum _zend_ast_kind { + ... + /* 1 child node */ + ... + ZEND_AST_DEFER_CALL + .... +} +``` +定义完AST节点后就可以在配置语法解析规则了,把defer语法解析为ZEND_AST_DEFER_CALL节点,我们把这条语法规则定义在"statement:"节点下,if、echo、for等语法都定义在此节点下,语法解析规则文件为zend_language_parser.y: +```c +statement: + '{' inner_statement_list '}' { $$ = $2; } + ... + | T_DEFER function_call ';' { $$ = zend_ast_create(ZEND_AST_DEFER_CALL, $2); } +; +``` +修改完这两个文件后需要分别调用re2c、yacc生成对应的C文件,具体的生成命令可以在Makefile.frag中看到: +```c +$ re2c --no-generation-date --case-inverted -cbdFt Zend/zend_language_scanner_defs.h -oZend/zend_language_scanner.c Zend/zend_language_scanner.l +$ yacc -p ini_ -v -d Zend/zend_language_parser.y -oZend/zend_language_parser.c +``` +执行完以后将在Zend目录下重新生成zend_language_scanner.c、zend_language_parser.c两个文件。到这一步已经完成生成抽象语法树的工作了,重新编译PHP后已经能够解析defer语法了,将会生成以下节点: + +![](../img/defer_ast.png) + + From e09183e09b877548f593da43ebd49d9202040edb Mon Sep 17 00:00:00 2001 From: qinpeng Date: Fri, 7 Jul 2017 21:16:52 +0800 Subject: [PATCH 333/379] update --- img/defer_call.png | Bin 0 -> 26242 bytes try/defer.md | 147 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 147 insertions(+) create mode 100644 img/defer_call.png diff --git a/img/defer_call.png b/img/defer_call.png new file mode 100644 index 0000000000000000000000000000000000000000..37c76328f39501a1308c158dde4504b4b27a7efd GIT binary patch literal 26242 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。编译ZEND_AST_DEFER_CALL节点时不能立即进行编译,需要等到当前脚本或函数全部编译完以后再进行编译,所以在编译过程需要把ZEND_AST_DEFER_CALL节点先缓存下来,参考循环结构编译时生成的zend_brk_cont_element的存储位置,我们也把ZEND_AST_DEFER_CALL节点保存在zend_op_array中,通过数组进行存储,将ZEND_AST_DEFER_CALL节点依次存入该数组,zend_op_array中加入以下几个成员: + +* __last_defer:__ 整形,记录当前编译的defer数 +* __defer_start_op:__ 整形,用于记录defer编译生成opcode指令的起始位置 +* __defer_call_array:__ 保存ZEND_AST_DEFER_CALL节点的数组,用于保存ast节点的地址 + +```c +struct _zend_op_array { + ... + int last_defer; + uint32_t defer_start_op; + zend_ast **defer_call_array; +} +``` +修改完数据结构后接着对应修改zend_op_array初始化的过程: +```c +//zend_opcode.c +void init_op_array(zend_op_array *op_array, zend_uchar type, int initial_ops_size) +{ + ... + op_array->last_defer = 0; + op_array->defer_start_op = 0; + op_array->defer_call_array = NULL; + ... +} +``` +完成依赖的这些数据结构的改造后接下来开始编写具体的编译逻辑,也就是编译ZEND_AST_DEFER_CALL的处理。抽象语法树的编译入口函数为zend_compile_top_stmt(),然后根据不同节点的类型进行相应的编译,我们在zend_compile_stmt()函数中对ZEND_AST_DEFER_CALL节点进行编译: +```c +void zend_compile_stmt(zend_ast *ast) +{ + ... + switch (ast->kind) { + ... + case ZEND_AST_DEFER_CALL: + zend_compile_defer_call(ast); + break + ... + } +} +``` +编译过程只是将ZEND_AST_DEFER_CALL的子节点(即:ZEND_AST_CALL)保存到zend_op_array->defer_call_array数组中,注意这里defer_call_array数组还没有分配内存,参考循环结构的实现,这里我们定义了一个函数用于数组的分配: +```c +//zend_compile.c +void zend_compile_defer_call(zend_ast *ast) +{ + if(!ast){ + return; + } + + zend_ast **call_ast = NULL; + //将普通函数调用的ast节点保存到defer_call_array数组中 + call_ast = get_next_defer_call(CG(active_op_array)); + *call_ast = ast->child[0]; +} + +//zend_opcode.c +zend_ast **get_next_defer_call(zend_op_array *op_array) +{ + op_array->last_defer++; + op_array->defer_call_array = erealloc(op_array->defer_call_array, sizeof(zend_ast*)*op_array->last_defer); + return &op_array->defer_call_array[op_array->last_defer-1]; +} +``` +既然分配了defer_call_array数组的内存就需要在zend_op_array销毁时释放: +```c +//zend_opcode.c +ZEND_API void destroy_op_array(zend_op_array *op_array) +{ + ... + if (op_array->defer_call_array) { + efree(op_array->defer_call_array); + } + ... +} +``` +编译完整个脚本或函数后,最后还会编译一条ZEND_RETURN,也就是返回指令,相当于ret指令,注意:这条opcode并不是我们在脚本中定义的return语句的,而是PHP内核为我们加的一条指令,这就是为什么有些函数我们没有写return也能返回的原因,任何函数或脚本都会生成这样一条指令。我们缓存在zend_op_array->defer_call_array数组中defer就是要在这时进行编译,也就是把defer的指令编译在最后。内核最后编译返回的这条指令由zend_emit_final_return()方法完成,我们把defer的编译放在此方法的末尾: +```c +//zend_compile.c +void zend_emit_final_return(zval *zv) +{ + ... + ret = zend_emit_op(NULL, returns_reference ? ZEND_RETURN_BY_REF : ZEND_RETURN, &zn, NULL); + ret->extended_value = -1; + + //编译defer call + zend_emit_defer_call(); +} +``` +前面已经说过,defer本质上就是函数调用,所以编译的过程直接复用普通函数调用的即可。另外,在编译时把起始位置记录到zend_op_array->defer_start_op中,因为在执行return前需要知道跳转到什么位置,这个值就是在那时使用的,具体的用法稍后再作说明。编译时按照倒序的顺序进行编译: +```c +//zend_compile.c +void zend_emit_defer_call() +{ + if (!CG(active_op_array)->defer_call_array) { + return; + } + + zend_ast *call_ast; + zend_op *nop; + znode result; + uint32_t opnum = get_next_op_number(CG(active_op_array)); + int defer_num = CG(active_op_array)->last_defer; + + //记录推迟的函数调用指令开始位置 + CG(active_op_array)->defer_start_op = opnum; + + while(--defer_num >= 0){ + call_ast = CG(active_op_array)->defer_call_array[defer_num]; + if (call_ast == NULL) { + continue; + } + nop = zend_emit_op(NULL, ZEND_NOP, NULL, NULL); + nop->op1.var = -2; + //编译函数调用 + zend_compile_call(&result, call_ast, BP_VAR_R); + } + //compile ZEND_DEFER_CALL + zend_emit_op(NULL, ZEND_DEFER_CALL_END, NULL, NULL); +} +``` +编译完推迟的函数调用之后,编译一条ZEND_DEFER_CALL_END指令,该指令用于执行完推迟的函数后跳回return的位置进行返回,opcode定义在zend_vm_opcodes.h中: +```c +//zend_vm_opcodes.h +#define ZEND_DEFER_CALL_END 174 +``` +还有一个地方你可能已经注意到,在逐个编译defer的函数调用前都生成了一条ZEND_NOP的指令,这个的目的是什么呢?开始的时候已经介绍过defer语法的特点,函数中定义的defer并不是全部执行,在return之后定义的defer是不会执行的,比如: +```go +func main(){ + defer fmt.Println("A") + + if 1 == 1{ + return + } + + defer fmt.Println("B") +} +``` +这种情况下第2个defer就不会生效,因此在return前跳转的位置就不一定是zend_op_array->defer_start_op,有可能会跳过几个函数的调用,所以这里我们通过ZEND_NOP这条空指令对多个defer call进行隔离,同时为避免与其它ZEND_NOP指令混淆,增加一个判断条件:op1.var=-2。这样在return前跳转时就根据此前定义的defer数跳过部分函数的调用,如下图所示。 + +![](../img/defer_call.png) + +到这一步我们已经完成defer函数调用的编译,此时重新编译PHP后可以看到通过defer推迟的函数调用已经被编译在最后了,只不过这个时候它们不能被执行。 + +__(3)编译return__ + From 5acabed4f5818e7c598073889762cfc264c3eb9a Mon Sep 17 00:00:00 2001 From: qinpeng Date: Sat, 8 Jul 2017 00:10:24 +0800 Subject: [PATCH 334/379] add defer --- try/defer.md | 99 ++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 96 insertions(+), 3 deletions(-) diff --git a/try/defer.md b/try/defer.md index 467ff8b..e496056 100644 --- a/try/defer.md +++ b/try/defer.md @@ -48,7 +48,7 @@ statement: 修改完这两个文件后需要分别调用re2c、yacc生成对应的C文件,具体的生成命令可以在Makefile.frag中看到: ```c $ re2c --no-generation-date --case-inverted -cbdFt Zend/zend_language_scanner_defs.h -oZend/zend_language_scanner.c Zend/zend_language_scanner.l -$ yacc -p ini_ -v -d Zend/zend_language_parser.y -oZend/zend_language_parser.c +$ yacc -p zend -v -d Zend/zend_language_parser.y -oZend/zend_language_parser.c ``` 执行完以后将在Zend目录下重新生成zend_language_scanner.c、zend_language_parser.c两个文件。到这一步已经完成生成抽象语法树的工作了,重新编译PHP后已经能够解析defer语法了,将会生成以下节点: @@ -140,7 +140,7 @@ void zend_emit_final_return(zval *zv) ret = zend_emit_op(NULL, returns_reference ? ZEND_RETURN_BY_REF : ZEND_RETURN, &zn, NULL); ret->extended_value = -1; - //编译defer call + //编译推迟执行的函数调用 zend_emit_defer_call(); } ``` @@ -172,7 +172,7 @@ void zend_emit_defer_call() //编译函数调用 zend_compile_call(&result, call_ast, BP_VAR_R); } - //compile ZEND_DEFER_CALL + //compile ZEND_DEFER_CALL_END zend_emit_op(NULL, ZEND_DEFER_CALL_END, NULL, NULL); } ``` @@ -201,4 +201,97 @@ func main(){ __(3)编译return__ +编译return时需要插入一条指令用于跳转到推迟执行的函数调用指令处,因此这里需要再定义一条opcode:ZEND_DEFER_CALL,在编译过程中defer call还未编译,因此此时还无法知道具体的跳转值。 +```c +//zend_vm_opcodes.h +#define ZEND_DEFER_CALL 173 +#define ZEND_DEFER_CALL_END 174 +``` +PHP脚本中声明的return语句由zend_compile_return()方法完成编译,在编译生成ZEND_DEFER_CALL指令时还需要将当前已定义的defer数(即在return前声明的defer)记录下来,用于计算具体的跳转值。 +```c +void zend_compile_return(zend_ast *ast) +{ + ... + //在return前编译ZEND_DEFER_CALL:用于在执行retur前跳转到defer call + if (CG(active_op_array)->defer_call_array) { + defer_zn.op_type = IS_UNUSED; + defer_zn.u.op.num = CG(active_op_array)->last_defer; + zend_emit_op(NULL, ZEND_DEFER_CALL, NULL, &defer_zn); + } + + //编译正常返回的指令 + opline = zend_emit_op(NULL, by_ref ? ZEND_RETURN_BY_REF : ZEND_RETURN, + &expr_node, NULL); + ... +} +``` +除了这种return外还有一种我们上面已经提过的return,即PHP内核编译的return指令,当PHP脚本中没有声明return语句时将执行内核添加的那条指令,因此也需要在zend_emit_final_return()加上上面的逻辑。 +```c +void zend_emit_final_return(zval *zv) +{ + ... + //在return前编译ZEND_DEFER_CALL:用于在执行retur前跳转到defer call + if (CG(active_op_array)->defer_call_array) { + //当前return之前定义的defer数 + defer_zn.op_type = IS_UNUSED; + defer_zn.u.op.num = CG(active_op_array)->last_defer; + zend_emit_op(NULL, ZEND_DEFER_CALL, NULL, &defer_zn); + } + + //编译返回指令 + ret = zend_emit_op(NULL, returns_reference ? ZEND_RETURN_BY_REF : ZEND_RETURN, &zn, NULL); + ret->extended_value = -1; + + //编译推迟执行的函数调用 + zend_emit_defer_call(); +} +``` +__(4)计算ZEND_DEFER_CALL指令的跳转位置__ + +前面我们已经完成了推迟调用函数以及return编译过程的改造,在编译完成后ZEND_DEFER_CALL指令已经能够知道具体的跳转位置了,因为推迟调用的函数已经编译完成了,所以下一步就是为全部的ZEND_DEFER_CALL指令计算跳转值。前面曾介绍过,在编译完成有一个pass_two()的环节,我们就在这里完成具体跳转位置的计算,并把跳转位置保存到ZEND_DEFER_CALL指令的操作数中,在执行阶段直接跳转到对应位置。 + +```c +ZEND_API int pass_two(zend_op_array *op_array) +{ + zend_op *opline, *end; + ... + //遍历opcode + opline = op_array->opcodes; + end = opline + op_array->last; + while (opline < end) { + switch (opline->opcode) { + ... + case ZEND_DEFER_CALL: //设置jmp + { + uint32_t defer_start = op_array->defer_start_op; + //skip_defer为当前return之后声明的defer数,也就是不需要执行的defer + uint32_t skip_defer = op_array->last_defer - opline->op2.num; + //defer_opline为推迟的函数调用起始位置 + zend_op *defer_opline = op_array->opcodes + defer_start; + uint32_t n = 0; + + while(n <= skip_defer){ + if (defer_opline->opcode == ZEND_NOP && defer_opline->op1.var == -2) { + n++; + } + defer_opline++; + defer_start++; + } + + //defer_start为opcode在op_array->opcodes数组中的位置 + opline->op1.opline_num = defer_start; + //将跳转位置保存到操作数op1中 + ZEND_PASS_TWO_UPDATE_JMP_TARGET(op_array, opline, opline->op1); + } + break; + } + ... + } + ... +} +``` +这里我们并没有直接编译为ZEND_JMP跳转指令,虽然ZEND_JMP可以跳转到后面的指令位置,但是最后的那条跳回return位置的指令(即:ZEND_DEFER_CALL_END)由于可能存在多个return的原因无法在编译期间确定具体的跳转值,只能在运行期间执行ZEND_DEFER_CALL时才能确定,所以需要在ZEND_DEFER_CALL指令的handler中将return的位置记录下来,执行ZEND_DEFER_CALL_END时根据这个值跳回。 + +__(5)定义ZEND_DEFER_CALL、ZEND_DEFER_CALL_END指令的handler__ + From a5b413ba145a80ef02ba48dd5200ce16021b25b0 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Sat, 8 Jul 2017 11:57:38 +0800 Subject: [PATCH 335/379] finish defer --- try/defer.md | 60 +++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 59 insertions(+), 1 deletion(-) diff --git a/try/defer.md b/try/defer.md index e496056..0a3230e 100644 --- a/try/defer.md +++ b/try/defer.md @@ -46,7 +46,7 @@ statement: ; ``` 修改完这两个文件后需要分别调用re2c、yacc生成对应的C文件,具体的生成命令可以在Makefile.frag中看到: -```c +```sh $ re2c --no-generation-date --case-inverted -cbdFt Zend/zend_language_scanner_defs.h -oZend/zend_language_scanner.c Zend/zend_language_scanner.l $ yacc -p zend -v -d Zend/zend_language_parser.y -oZend/zend_language_parser.c ``` @@ -294,4 +294,62 @@ ZEND_API int pass_two(zend_op_array *op_array) __(5)定义ZEND_DEFER_CALL、ZEND_DEFER_CALL_END指令的handler__ +ZEND_DEFER_CALL指令执行时需要将return的位置保存下来,我们把这个值保存到zend_execute_data结构中: +```c +//zend_compile.h +struct _zend_execute_data { + ... + const zend_op *return_opline; + ... +} +``` +opcode的handler定义在zend_vm_def.h文件中,定义完成后需要执行`php zend_vm_gen.php`脚本生成具体的handler函数。 +```c +ZEND_VM_HANDLER(173, ZEND_DEFER_CALL, ANY, ANY) +{ + USE_OPLINE + + //1) 将return指令的位置保存到EX(return_opline) + EX(return_opline) = opline + 1; + + //2) 跳转 + ZEND_VM_SET_OPCODE(OP_JMP_ADDR(opline, opline->op1)); + ZEND_VM_CONTINUE(); +} + +ZEND_VM_HANDLER(174, ZEND_DEFER_CALL_END, ANY, ANY) +{ + USE_OPLINE + + ZEND_VM_SET_OPCODE(EX(return_opline)); + ZEND_VM_CONTINUE(); +} +``` +到目前为止我们已经完成了全部的修改,重新编译PHP后就可以使用defer语法了: +```php +function shutdown($a){ + echo $a."\n"; +} +function test(){ + $a = 1234; + defer shutdown($a); + + $a = 8888; + + if(1){ + return "mid end\n"; + } + defer shutdown("9999"); + return "last end\n"; +} + +echo test(); +``` +执行后将显示: +```sh +8888 +mid end +``` +这里我们只实现了普通函数调用的方式,关于成员方法、静态方法、匿名函数等调用方式并未实现,留给有兴趣的读者自己去实现。 +完整代码:[https://github.com/pangudashu/php-7.0.12](https://github.com/pangudashu/php-7.0.12) From 8418b469b9c6dbf5d82a9ee17d5b094b1b590d62 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Sat, 8 Jul 2017 11:59:19 +0800 Subject: [PATCH 336/379] finish defer --- README.md | 1 + try/defer.md | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 0fcbe4d..0192d2d 100644 --- a/README.md +++ b/README.md @@ -106,4 +106,5 @@ ## 附录 * [附录1:break/continue按标签中断语法实现](try/break.md) + * [附录2:defer推迟函数调用语法的实现](try/defer.md) diff --git a/try/defer.md b/try/defer.md index 0a3230e..761d149 100644 --- a/try/defer.md +++ b/try/defer.md @@ -1,4 +1,4 @@ -# 附录2:defer推迟执行语法的实现 +# 附录2:defer推迟函数调用语法的实现 使用过Go语言的应该都知道defer这个语法,它用来推迟一个函数的执行,在函数执行返回前首先检查当前函数内是否有推迟执行的函数,如果有则执行,然后再返回。defer是一个非常有用的语法,这个功能可以很方便的在函数结束前执行一些清理工作,比如关闭打开的文件、关闭连接、释放资源、解锁等等。这样延迟一个函数有以下两个好处: From 06499a611175fa4b075cbfa0db3ef0ab15c88d25 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Fri, 14 Jul 2017 12:45:32 +0800 Subject: [PATCH 337/379] change dir --- README.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 0192d2d..06bca77 100644 --- a/README.md +++ b/README.md @@ -85,11 +85,11 @@ * [7.7.6 数组操作](7/var.md) * [7.8 常量](7/constant.md) * 7.9 面向对象 - 7.9.1 内部类注册 - 7.9.2 定义成员属性 - 7.9.3 定义成员方法 - 7.9.4 定义常量 - 7.9.5 类的实例化 + * 7.9.1 内部类注册 + * 7.9.2 定义成员属性 + * 7.9.3 定义成员方法 + * 7.9.4 定义常量 + * 7.9.5 类的实例化 * 7.10 资源类型 * 7.11 经典扩展解析 * 7.8.1 Yaf @@ -106,5 +106,5 @@ ## 附录 * [附录1:break/continue按标签中断语法实现](try/break.md) - * [附录2:defer推迟函数调用语法的实现](try/defer.md) + * 附录2:defer推迟函数调用语法的实现 From 9a4d814fe5f5e69dae9f1a6b24cc91c13ed189b4 Mon Sep 17 00:00:00 2001 From: "byter.hu" Date: Sat, 15 Jul 2017 05:27:41 +0800 Subject: [PATCH 338/379] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E9=94=99=E5=AD=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修复错字 --- 3/function_implement.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3/function_implement.md b/3/function_implement.md index d3c0fe6..ef4bcb5 100644 --- a/3/function_implement.md +++ b/3/function_implement.md @@ -287,7 +287,7 @@ $greet = function($name) $greet('World'); $greet('PHP'); ``` -这里提函数函数只是想说明编译函数时那个use的用法: +这里提匿名函数只是想说明编译函数时那个use的用法: __匿名函数可以从父作用域中继承变量。 任何此类变量都应该用 use 语言结构传递进去。__ From 6e5b9f43b587b57993e4c1fd6982bdec27166303 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Mon, 17 Jul 2017 14:42:25 +0800 Subject: [PATCH 339/379] update --- 7/func.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/7/func.md b/7/func.md index e04228a..5c1101a 100644 --- a/7/func.md +++ b/7/func.md @@ -497,7 +497,7 @@ echo $a; ### 7.6.4 函数返回值 调用内部函数时其返回值指针作为参数传入,这个参数为`zval *return_value`,如果函数有返回值直接设置此指针即可,需要特别注意的是设置返回值时需要增加其引用计数,举个例子来看: - ```c +```c PHP_FUNCTION(my_func_1) { zval *arr; @@ -510,8 +510,6 @@ PHP_FUNCTION(my_func_1) Z_ADDREF_P(arr); //设置返回值为数组: - //return_value->u1.type = IS_ARRAY; - //return_value->value->arr = arr->value->arr; ZVAL_ARR(return_value, Z_ARR_P(arr)); } ``` From db02aafbbd43d58f29c406b07a7334eb49608bc4 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Mon, 17 Jul 2017 16:52:17 +0800 Subject: [PATCH 340/379] fix error --- 7/func.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/7/func.md b/7/func.md index 5c1101a..1ce3f35 100644 --- a/7/func.md +++ b/7/func.md @@ -123,7 +123,7 @@ PHP_FUNCTION(my_func_1) ![](../img/internal_func_param.png) -注意:解析时除了整形、浮点型、布尔型是直接硬拷贝value外,其它解析到的变量只能是指针,arr为zend_execute_data上param_1的地址,即:`zval *arr = ¶m_1`,所以图中arr、param_1之间用的不是箭头指向,也就是说参数始终存储在zend_execute_data上,解析获取的是这些参数的地址。`zend_parse_parameters()`调用了`zend_parse_va_args()`进行处理,简单看下解析过程: +注意:解析时除了整形、浮点型、布尔型是直接硬拷贝value外,其它解析到的变量只能是指针,arr为zend_execute_data上param_1的地址,即:`zval *arr = ¶m_1`,也就是说参数始终存储在zend_execute_data上,解析获取的是这些参数的地址。`zend_parse_parameters()`调用了`zend_parse_va_args()`进行处理,简单看下解析过程: ```c //va就是定义的要解析到的各个变量的地址 static int zend_parse_va_args(int num_args, const char *type_spec, va_list *va, int flags) From 95ec461b4eaa0bbcb6992c62d9d5f7eca3498f20 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Mon, 17 Jul 2017 17:57:06 +0800 Subject: [PATCH 341/379] fix error --- 7/func.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/7/func.md b/7/func.md index 1ce3f35..e492812 100644 --- a/7/func.md +++ b/7/func.md @@ -229,7 +229,7 @@ static zend_always_inline int zend_parse_arg_long(zval *arg, zend_long *dest, ze return 1; } ``` -> __Note:__ "l"与"L"的区别在于,当传参不是整形且转为整形后超过了整形的大小范围时,"L"将值调整为整形的最大或最小值,而"l"将报错,比如传的参数是字符串"9223372036854775808",转整形后超过了unsigned int64的最大值:0xFFFFFFFFFFFFFFFF,"L"将解析为0xFFFFFFFFFFFFFFFF。 +> __Note:__ "l"与"L"的区别在于,当传参不是整形且转为整形后超过了整形的大小范围时,"L"将值调整为整形的最大或最小值,而"l"将报错,比如传的参数是字符串"9223372036854775808"(0x7FFFFFFFFFFFFFFF + 1),转整形后超过了有符号int64的最大值:0x7FFFFFFFFFFFFFFF,所以如果是"L"将解析为0x7FFFFFFFFFFFFFFF。 #### 7.6.2.2 布尔型:b 通过"b"标识符表示将传入的参数解析为布尔型,解析到的变量必须是zend_bool: From 56163b40731c1735f6b75c9a8bcd904c4e21fe2f Mon Sep 17 00:00:00 2001 From: qinpeng Date: Wed, 19 Jul 2017 13:18:43 +0800 Subject: [PATCH 342/379] add global register variables --- 3/zend_global_register.md | 28 ++++++++++++++++++++++++++++ img/executor.png | Bin 0 -> 13778 bytes 2 files changed, 28 insertions(+) create mode 100644 3/zend_global_register.md create mode 100644 img/executor.png diff --git a/3/zend_global_register.md b/3/zend_global_register.md new file mode 100644 index 0000000..44f5c9a --- /dev/null +++ b/3/zend_global_register.md @@ -0,0 +1,28 @@ +### 3.3.4 全局execute_data和opline +Zend执行器在opcode的执行过程中,会频繁的用到execute_data和opline两个变量,execute_data为zend_execute_data结构,opline为当前执行的指令。普通的处理方式在执行每条opcode指令的handler时,会把execute_data地址作为参数传给handler使用,使用时先从当前栈上获取execute_data地址,然后再从堆上获取变量的数据,这种方式下Zend执行器展开后是下面这样: +```c +ZEND_API void execute_ex(zend_execute_data *ex) +{ + zend_execute_data *execute_data = ex; + + while (1) { + int ret; + + if (UNEXPECTED((ret = ((opcode_handler_t)execute_data->opline->handler)(execute_data)) != 0)) { + if (EXPECTED(ret > 0)) { + execute_data = EG(current_execute_data); + } else { + return; + } + } + } +} +``` +执行器实际是一个大循环,从第一条opcode开始执行,execute_data->opline指向当前执行的指令,执行完以后指向下一条指令,opline类似eip(或rip)寄存器的作用。通过这个循环,ZendVM完成opcode指令的执行,如下图。 + +![](../img/executor.png) + + + + +全局寄存器变量(Global Register Variables)是数据保存在寄存器中的一种变量类型,与存储在内存中的变量相比,寄存器变量具有更快的访问速度,在计算机的存储层次中,寄存器的速度最快,其次是内存,最慢的是内存。 diff --git a/img/executor.png b/img/executor.png new file mode 100644 index 0000000000000000000000000000000000000000..f2cdbe77ec115b8d3b226118461723c45a9d91c7 GIT binary patch literal 13778 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 KVyXOx!2bhw6w<%| literal 0 HcmV?d00001 From 67ea35249f73e94634f3242e227410eb992c0221 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Wed, 19 Jul 2017 14:25:34 +0800 Subject: [PATCH 343/379] update --- 3/zend_global_register.md | 39 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 36 insertions(+), 3 deletions(-) diff --git a/3/zend_global_register.md b/3/zend_global_register.md index 44f5c9a..898ad6c 100644 --- a/3/zend_global_register.md +++ b/3/zend_global_register.md @@ -18,11 +18,44 @@ ZEND_API void execute_ex(zend_execute_data *ex) } } ``` -执行器实际是一个大循环,从第一条opcode开始执行,execute_data->opline指向当前执行的指令,执行完以后指向下一条指令,opline类似eip(或rip)寄存器的作用。通过这个循环,ZendVM完成opcode指令的执行,如下图。 +执行器实际是一个大循环,从第一条opcode开始执行,execute_data->opline指向当前执行的指令,执行完以后指向下一条指令,opline类似eip(或rip)寄存器的作用。通过这个循环,ZendVM完成opcode指令的执行。opcode执行完后以后指向下一条指令的操作是在当前handler中完成,也就是说每条执行执行完以后会主动更新opline,这里会有下面几个不同的动作: +```c +ZEND_VM_CONTINUE() +ZEND_VM_ENTER() +ZEND_VM_LEAVE() +ZEND_VM_RETURN() +``` +ZEND_VM_CONTINUE()表示继续执行下一条opcode;ZEND_VM_ENTER()/ZEND_VM_LEAVE()是调用函数时的动作,普通模式下ZEND_VM_ENTER()实际就是return 1,然后execute_ex()中会将execute_data切换到被调函数的结构上,对应的,在函数调用完成后ZEND_VM_LEAVE()会return 2,再将execute_data切换至原来的结构;ZEND_VM_RETURN()表示执行完成,比如exit,这时候execute_ex()将退出执行。下面看一个具体的例子: +```php +$a = "hi~"; +echo $a; +``` +执行过程如下图所示: ![](../img/executor.png) +以ZEND_ASSIGN这条赋值指令为例,其handler展开前如下: +```c +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + ... + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); +} +``` +所有opcode的handler定义格式都是相同的,其参数列表通过ZEND_OPCODE_HANDLER_ARGS宏定义,展开后实际只有一个execute_data;ZEND_FASTCALL这个宏是用于指定C语言函数调用方式的,这里指定的是fastcall方式,GNU C下就是__attribute__((fastcall))。去掉一些非关键操作展开后: +```c +static int __attribute__((fastcall)) ZEND_ASSIGN_SPEC_CV_CONST_HANDLER(zend_execute_data *execute_data) +{ + //USE_OPLINE + const zend_op *opline = execute_data->opline; + ... + //ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION() + execute_data->opline = execute_data->opline + 1; + return 0; +} +``` +从这个例子可以很清楚的看到,执行完以后会将execute_data->opline加1,也就是指向下一条opcode,然后返回0给execute_ex(),接着执行器在下一次循环时执行下一条opcode,依次类推,直至所有的opcode执行完成。 - -全局寄存器变量(Global Register Variables)是数据保存在寄存器中的一种变量类型,与存储在内存中的变量相比,寄存器变量具有更快的访问速度,在计算机的存储层次中,寄存器的速度最快,其次是内存,最慢的是内存。 +全局寄存器变量(Global Register Variables)是数据保存在寄存器中的一种变量,与存储在内存中的变量相比,寄存器变量具有更快的访问速度,在计算机的存储层次中,寄存器的速度最快,其次是内存,最慢的是内存。寄存器变量 From 34a9e6fbe17c5aa9d400e78247f888723cadaf69 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Wed, 19 Jul 2017 14:26:15 +0800 Subject: [PATCH 344/379] update --- img/executor.png | Bin 13778 -> 23846 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/img/executor.png b/img/executor.png index f2cdbe77ec115b8d3b226118461723c45a9d91c7..dfbb4618cf57977f68391c9919fc5d7f01f13a4c 100644 GIT binary patch literal 23846 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 literal 13778 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 KVyXOx!2bhw6w<%| From ddfbddd0dd901d3ce0e233cb3ba7dbd365e09ac2 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Wed, 19 Jul 2017 15:25:34 +0800 Subject: [PATCH 345/379] update --- 3/zend_global_register.md | 57 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 55 insertions(+), 2 deletions(-) diff --git a/3/zend_global_register.md b/3/zend_global_register.md index 898ad6c..6d9b24e 100644 --- a/3/zend_global_register.md +++ b/3/zend_global_register.md @@ -56,6 +56,59 @@ static int __attribute__((fastcall)) ZEND_ASSIGN_SPEC_CV_CONST_HANDLER(zend_exe return 0; } ``` -从这个例子可以很清楚的看到,执行完以后会将execute_data->opline加1,也就是指向下一条opcode,然后返回0给execute_ex(),接着执行器在下一次循环时执行下一条opcode,依次类推,直至所有的opcode执行完成。 +从这个例子可以很清楚的看到,执行完以后会将execute_data->opline加1,也就是指向下一条opcode,然后返回0给execute_ex(),接着执行器在下一次循环时执行下一条opcode,依次类推,直至所有的opcode执行完成。这个处理过程比较简单,并没有不好理解的地方,而且整个过程看起来也都那么顺理成章。PHP7针对execute_data、opline两个变量的存储位置进行了优化,那就是使用全局寄存器保存这两个变量的地址,以实现更高效率的读取。这种方式下execute_data、opline直接从寄存器读取地址,在性能上大概有5%的提升(官方说法)。在分析PHP7的优化之前,我们先简单介绍下什么是寄存器变量。 + +寄存器变量存放在CPU的寄存器中,使用时,不需要访问内存直接从寄存器中读写,与存储在内存中的变量相比,寄存器变量具有更快的访问速度,在计算机的存储层次中,寄存器的速度最快,其>次是内存,最慢的是内存。C语言中使用关键字register来声明局部变量为寄存器变量,需要注意的是,只有局部自动变量和形式参数才能够被定义为寄存器变量,全局变量和局部静态变量都不能被定义为寄存器变量。而且,一个计算机中寄存器数量是有限的,一般为2到3个,因此寄存器变量的数量不能太多。对于在一个函数中说明的多于2到3个的寄存器变量,C编译程序会自动地将寄存器变量变为自动变量。 受硬件寄存器长度的限制,寄存器变量只能是char、int或指针型,而不能使其他复杂数据类型。由于register变量使用的是硬件CPU中的寄存器,寄存器变量无地址,所以不能使用取地址运算符"&"求寄存器变量的地址。 + +GCC从4.8.0版本开始支持了另外一项特性:全局寄存器变量,也就是可以把全局变量定义为寄存器变量,从而可以实现函数间共享数据。可以通过下面的语法告诉编译器使用寄存器来保存数据: +```c +register int *foo asm ("r12"); //r12、%r12 +``` +或者: +```c +register int *foo __asm__ ("r12"); //r12、%r12 +``` +这里r12就是指定使用的寄存器,它必须是运行平台上有效的寄存器,这样就可以像使用普通的变量一样使用foo,但是foo同样没有地址,也就是无法通过&获取它的地址,在gdb调试时也无法使用foo符号,只能使用对应的寄存器获取数据。举个例子来看: +```c +//main.c +#include + +typedef struct _execute_data { + int ip; +}zend_execute_data; + + +register zend_execute_data* execute_data __asm__ ("%r14"); + +int main(void) +{ + execute_data = (zend_execute_data *)malloc(sizeof(zend_execute_data)); + execute_data->ip = 9999; + + return 0; +} +``` +编译:`$ gcc -o main -g main.c`,然后通过gdb看下: +```sh +$ gdb main +(gdb) break main +(gdb) r +Starting program: /home/qinpeng/c/php/main + +Breakpoint 1, main () at main.c:12 +12 execute_data = (zend_execute_data *)malloc(sizeof(zend_execute_data)); +(gdb) n +13 execute_data->ip = 9999; +(gdb) n +15 return 0; +``` +这时我们就无法再像普通变量那样直接使用execute_data访问数据,只能通过r14寄存器读取: +```sh +(gdb) p execute_data +Missing ELF symbol "execute_data". +(gdb) info register r14 +r14 0x601010 6295568 +(gdb) p ((zend_execute_data *)$r14)->ip +$3 = 9999 +``` -全局寄存器变量(Global Register Variables)是数据保存在寄存器中的一种变量,与存储在内存中的变量相比,寄存器变量具有更快的访问速度,在计算机的存储层次中,寄存器的速度最快,其次是内存,最慢的是内存。寄存器变量 From 8b3d976818c26364056596c23e77484769e2ab9d Mon Sep 17 00:00:00 2001 From: qinpeng Date: Wed, 19 Jul 2017 17:43:39 +0800 Subject: [PATCH 346/379] update --- 3/zend_global_register.md | 67 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 62 insertions(+), 5 deletions(-) diff --git a/3/zend_global_register.md b/3/zend_global_register.md index 6d9b24e..18e15d8 100644 --- a/3/zend_global_register.md +++ b/3/zend_global_register.md @@ -20,12 +20,12 @@ ZEND_API void execute_ex(zend_execute_data *ex) ``` 执行器实际是一个大循环,从第一条opcode开始执行,execute_data->opline指向当前执行的指令,执行完以后指向下一条指令,opline类似eip(或rip)寄存器的作用。通过这个循环,ZendVM完成opcode指令的执行。opcode执行完后以后指向下一条指令的操作是在当前handler中完成,也就是说每条执行执行完以后会主动更新opline,这里会有下面几个不同的动作: ```c -ZEND_VM_CONTINUE() -ZEND_VM_ENTER() -ZEND_VM_LEAVE() -ZEND_VM_RETURN() +#define ZEND_VM_CONTINUE() return 0 +#define ZEND_VM_ENTER() return 1 +#define ZEND_VM_LEAVE() return 2 +#define ZEND_VM_RETURN() return -1 ``` -ZEND_VM_CONTINUE()表示继续执行下一条opcode;ZEND_VM_ENTER()/ZEND_VM_LEAVE()是调用函数时的动作,普通模式下ZEND_VM_ENTER()实际就是return 1,然后execute_ex()中会将execute_data切换到被调函数的结构上,对应的,在函数调用完成后ZEND_VM_LEAVE()会return 2,再将execute_data切换至原来的结构;ZEND_VM_RETURN()表示执行完成,比如exit,这时候execute_ex()将退出执行。下面看一个具体的例子: +ZEND_VM_CONTINUE()表示继续执行下一条opcode;ZEND_VM_ENTER()/ZEND_VM_LEAVE()是调用函数时的动作,普通模式下ZEND_VM_ENTER()实际就是return 1,然后execute_ex()中会将execute_data切换到被调函数的结构上,对应的,在函数调用完成后ZEND_VM_LEAVE()会return 2,再将execute_data切换至原来的结构;ZEND_VM_RETURN()表示执行完成,返回-1给execute_ex(),比如exit,这时候execute_ex()将退出执行。下面看一个具体的例子: ```php $a = "hi~"; echo $a; @@ -111,4 +111,61 @@ r14 0x601010 6295568 (gdb) p ((zend_execute_data *)$r14)->ip $3 = 9999 ``` +了解完全局寄存器变量,接下来我们再回头看下PHP7中的用法,处理也比较简单,就是在execute_ex()执行各opcode指令的过程中,不再将execute_data作为参数传给handler,而是通过寄存器保存execute_data及opline的地址,handler使用时直接从全局变量(寄存器)读取,执行完再把下一条指令更新到全局变量。 +该功能需要GCC 4.8+支持,默认开启,可以通过 --disable-gcc-global-regs 编译参数关闭。以x86_64为例,execute_data使用r14寄存器,opline使用r15寄存器: +```c +//file: zend_execute.c line: 2631 +# define ZEND_VM_FP_GLOBAL_REG "%r14" +# define ZEND_VM_IP_GLOBAL_REG "%r15" + +//file: zend_vm_execute.h line: 315 +register zend_execute_data* volatile execute_data __asm__(ZEND_VM_FP_GLOBAL_REG); +register const zend_op* volatile opline __asm__(ZEND_VM_IP_GLOBAL_REG); +``` +execute_data、opline定义为全局变量,下面看下execute_ex()的变化,展开后: +```c +ZEND_API void execute_ex(zend_execute_data *ex) +{ + const zend_op *orig_opline = opline; + zend_execute_data *orig_execute_data = execute_data; + + //将当前execute_data、opline保存到全局变量 + execute_data = ex; + opline = execute_data->opline + + while (1) { + ((opcode_handler_t)opline->handler)(); + + if (UNEXPECTED(!opline)) { + execute_data = orig_execute_data; + opline = orig_opline; + + return; + } + } +} +``` +这个时候调用各opcode指令的handler时就不再传入execute_data的参数了,handler使用时直接从全局变量读取,仍以上面的赋值ZEND_ASSIGN指令为例,handler展开后: +```c +static int __attribute__((fastcall)) ZEND_ASSIGN_SPEC_CV_CONST_HANDLER(void) +{ + ... + + //ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION() + opline = execute_data->opline + 1; + return; +} +``` +当调用函数时,会把execute_data、opline更新为被调函数的,然后回到execute_ex()开始执行被调函数的指令: +```c +# define ZEND_VM_ENTER() execute_data = EG(current_execute_data); LOAD_OPLINE(); ZEND_VM_CONTINUE() +``` +展开后: +```c +//ZEND_VM_ENTER() +execute_data = execute_data->current_execute_data; +opline = execute_data->opline; +return; +``` +这两种处理方式并没有本质上的差异,只是通过全局寄存器变量提升了一些性能。 From ac29cb0d9821778a692c18d63407699500526a3e Mon Sep 17 00:00:00 2001 From: qinpeng Date: Wed, 19 Jul 2017 17:48:30 +0800 Subject: [PATCH 347/379] update dir --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 06bca77..ccdf4aa 100644 --- a/README.md +++ b/README.md @@ -37,6 +37,7 @@ * 3.3.1 基本结构 * 3.3.2 执行流程 * 3.3.3 函数的执行流程 + * [3.3.4 全局execute_data和opline](3/zend_global_register.md) * 3.4 面向对象实现 * [3.4.1 类](3/zend_class.md) * [3.4.2 对象](3/zend_object.md) From ac38e217dea0823f5502c783464a6dd8bb0ef3f4 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Wed, 19 Jul 2017 17:57:34 +0800 Subject: [PATCH 348/379] update --- 3/zend_global_register.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/3/zend_global_register.md b/3/zend_global_register.md index 18e15d8..66d7c41 100644 --- a/3/zend_global_register.md +++ b/3/zend_global_register.md @@ -169,3 +169,5 @@ opline = execute_data->opline; return; ``` 这两种处理方式并没有本质上的差异,只是通过全局寄存器变量提升了一些性能。 + +> __Note:__ automake编译时的命令是cc,而不是gcc,如果更新gcc后发现PHP仍然没有支持这个特性,请检查下cc是否指向了新的gcc From 5461dedcc55da125508199a97104e7dbc74f3e71 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Wed, 19 Jul 2017 18:02:14 +0800 Subject: [PATCH 349/379] update --- 3/zend_global_register.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3/zend_global_register.md b/3/zend_global_register.md index 66d7c41..f091eda 100644 --- a/3/zend_global_register.md +++ b/3/zend_global_register.md @@ -60,7 +60,7 @@ static int __attribute__((fastcall)) ZEND_ASSIGN_SPEC_CV_CONST_HANDLER(zend_exe 寄存器变量存放在CPU的寄存器中,使用时,不需要访问内存直接从寄存器中读写,与存储在内存中的变量相比,寄存器变量具有更快的访问速度,在计算机的存储层次中,寄存器的速度最快,其>次是内存,最慢的是内存。C语言中使用关键字register来声明局部变量为寄存器变量,需要注意的是,只有局部自动变量和形式参数才能够被定义为寄存器变量,全局变量和局部静态变量都不能被定义为寄存器变量。而且,一个计算机中寄存器数量是有限的,一般为2到3个,因此寄存器变量的数量不能太多。对于在一个函数中说明的多于2到3个的寄存器变量,C编译程序会自动地将寄存器变量变为自动变量。 受硬件寄存器长度的限制,寄存器变量只能是char、int或指针型,而不能使其他复杂数据类型。由于register变量使用的是硬件CPU中的寄存器,寄存器变量无地址,所以不能使用取地址运算符"&"求寄存器变量的地址。 -GCC从4.8.0版本开始支持了另外一项特性:全局寄存器变量,也就是可以把全局变量定义为寄存器变量,从而可以实现函数间共享数据。可以通过下面的语法告诉编译器使用寄存器来保存数据: +GCC从4.8.0版本开始支持了另外一项特性:全局寄存器变量(Global Register Variables,参考:https://gcc.gnu.org/onlinedocs/gcc-6.1.0/gcc/Global-Register-Variables.html),也就是可以把全局变量定义为寄存器变量,从而可以实现函数间共享数据。可以通过下面的语法告诉编译器使用寄存器来保存数据: ```c register int *foo asm ("r12"); //r12、%r12 ``` From c0de5f804b3184582e8e3d7af1dc13f1e585e921 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Wed, 19 Jul 2017 18:03:20 +0800 Subject: [PATCH 350/379] update --- 3/zend_global_register.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3/zend_global_register.md b/3/zend_global_register.md index f091eda..93a52ea 100644 --- a/3/zend_global_register.md +++ b/3/zend_global_register.md @@ -60,7 +60,7 @@ static int __attribute__((fastcall)) ZEND_ASSIGN_SPEC_CV_CONST_HANDLER(zend_exe 寄存器变量存放在CPU的寄存器中,使用时,不需要访问内存直接从寄存器中读写,与存储在内存中的变量相比,寄存器变量具有更快的访问速度,在计算机的存储层次中,寄存器的速度最快,其>次是内存,最慢的是内存。C语言中使用关键字register来声明局部变量为寄存器变量,需要注意的是,只有局部自动变量和形式参数才能够被定义为寄存器变量,全局变量和局部静态变量都不能被定义为寄存器变量。而且,一个计算机中寄存器数量是有限的,一般为2到3个,因此寄存器变量的数量不能太多。对于在一个函数中说明的多于2到3个的寄存器变量,C编译程序会自动地将寄存器变量变为自动变量。 受硬件寄存器长度的限制,寄存器变量只能是char、int或指针型,而不能使其他复杂数据类型。由于register变量使用的是硬件CPU中的寄存器,寄存器变量无地址,所以不能使用取地址运算符"&"求寄存器变量的地址。 -GCC从4.8.0版本开始支持了另外一项特性:全局寄存器变量(Global Register Variables,参考:https://gcc.gnu.org/onlinedocs/gcc-6.1.0/gcc/Global-Register-Variables.html),也就是可以把全局变量定义为寄存器变量,从而可以实现函数间共享数据。可以通过下面的语法告诉编译器使用寄存器来保存数据: +GCC从4.8.0版本开始支持了另外一项特性:全局寄存器变量(Global Register Variables,[详细介绍](https://gcc.gnu.org/onlinedocs/gcc-6.1.0/gcc/Global-Register-Variables.html)),也就是可以把全局变量定义为寄存器变量,从而可以实现函数间共享数据。可以通过下面的语法告诉编译器使用寄存器来保存数据: ```c register int *foo asm ("r12"); //r12、%r12 ``` From ed96756cb3cf3bed4c07591665dac3efee2764ff Mon Sep 17 00:00:00 2001 From: qinpeng Date: Thu, 20 Jul 2017 10:12:35 +0800 Subject: [PATCH 351/379] update --- 3/zend_global_register.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3/zend_global_register.md b/3/zend_global_register.md index 93a52ea..51cd81f 100644 --- a/3/zend_global_register.md +++ b/3/zend_global_register.md @@ -58,7 +58,7 @@ static int __attribute__((fastcall)) ZEND_ASSIGN_SPEC_CV_CONST_HANDLER(zend_exe ``` 从这个例子可以很清楚的看到,执行完以后会将execute_data->opline加1,也就是指向下一条opcode,然后返回0给execute_ex(),接着执行器在下一次循环时执行下一条opcode,依次类推,直至所有的opcode执行完成。这个处理过程比较简单,并没有不好理解的地方,而且整个过程看起来也都那么顺理成章。PHP7针对execute_data、opline两个变量的存储位置进行了优化,那就是使用全局寄存器保存这两个变量的地址,以实现更高效率的读取。这种方式下execute_data、opline直接从寄存器读取地址,在性能上大概有5%的提升(官方说法)。在分析PHP7的优化之前,我们先简单介绍下什么是寄存器变量。 -寄存器变量存放在CPU的寄存器中,使用时,不需要访问内存直接从寄存器中读写,与存储在内存中的变量相比,寄存器变量具有更快的访问速度,在计算机的存储层次中,寄存器的速度最快,其>次是内存,最慢的是内存。C语言中使用关键字register来声明局部变量为寄存器变量,需要注意的是,只有局部自动变量和形式参数才能够被定义为寄存器变量,全局变量和局部静态变量都不能被定义为寄存器变量。而且,一个计算机中寄存器数量是有限的,一般为2到3个,因此寄存器变量的数量不能太多。对于在一个函数中说明的多于2到3个的寄存器变量,C编译程序会自动地将寄存器变量变为自动变量。 受硬件寄存器长度的限制,寄存器变量只能是char、int或指针型,而不能使其他复杂数据类型。由于register变量使用的是硬件CPU中的寄存器,寄存器变量无地址,所以不能使用取地址运算符"&"求寄存器变量的地址。 +寄存器变量存放在CPU的寄存器中,使用时,不需要访问内存直接从寄存器中读写,与存储在内存中的变量相比,寄存器变量具有更快的访问速度,在计算机的存储层次中,寄存器的速度最快,其次是内存,最慢的是硬盘。C语言中使用关键字register来声明局部变量为寄存器变量,需要注意的是,只有局部自动变量和形式参数才能够被定义为寄存器变量,全局变量和局部静态变量都不能被定义为寄存器变量。而且,一个计算机中寄存器数量是有限的,一般为2到3个,因此寄存器变量的数量不能太多。对于在一个函数中说明的多于2到3个的寄存器变量,C编译程序会自动地将寄存器变量变为自动变量。 受硬件寄存器长度的限制,寄存器变量只能是char、int或指针型,而不能使其他复杂数据类型。由于register变量使用的是硬件CPU中的寄存器,寄存器变量无地址,所以不能使用取地址运算符"&"求寄存器变量的地址。 GCC从4.8.0版本开始支持了另外一项特性:全局寄存器变量(Global Register Variables,[详细介绍](https://gcc.gnu.org/onlinedocs/gcc-6.1.0/gcc/Global-Register-Variables.html)),也就是可以把全局变量定义为寄存器变量,从而可以实现函数间共享数据。可以通过下面的语法告诉编译器使用寄存器来保存数据: ```c From ee2e98fb01d7b734dad19f33bb2054ce7b78c111 Mon Sep 17 00:00:00 2001 From: "byter.hu" Date: Sat, 22 Jul 2017 02:13:06 +0800 Subject: [PATCH 352/379] Update func.md fix error --- 7/func.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/7/func.md b/7/func.md index e04228a..a1fd5e9 100644 --- a/7/func.md +++ b/7/func.md @@ -67,7 +67,7 @@ const zend_function_entry mytest_functions[] = { #define ZEND_FENTRY(zend_name, name, arg_info, flags) { #zend_name, name, arg_info, (uint32_t) (sizeof(arg_info)/sizeof(struct _zend_internal_arg_info)-1), flags }, #define ZEND_FN(name) zif_##name ``` -最后将`zend_module_entry->functions`设置为`timeout_functions`即可: +最后将`zend_module_entry->functions`设置为`mytest_functions`即可: ```c zend_module_entry mytest_module_entry = { STANDARD_MODULE_HEADER, From 3e09906791e3f375bb9a85bbfd5c3533a125ebe3 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Mon, 24 Jul 2017 17:17:29 +0800 Subject: [PATCH 353/379] fix error --- 3/zend_global_register.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/3/zend_global_register.md b/3/zend_global_register.md index 51cd81f..9c9462e 100644 --- a/3/zend_global_register.md +++ b/3/zend_global_register.md @@ -43,9 +43,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_CV_CONST_HANDLER(Z ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } ``` -所有opcode的handler定义格式都是相同的,其参数列表通过ZEND_OPCODE_HANDLER_ARGS宏定义,展开后实际只有一个execute_data;ZEND_FASTCALL这个宏是用于指定C语言函数调用方式的,这里指定的是fastcall方式,GNU C下就是__attribute__((fastcall))。去掉一些非关键操作展开后: +所有opcode的handler定义格式都是相同的,其参数列表通过ZEND_OPCODE_HANDLER_ARGS宏定义,展开后实际只有一个execute_data,展开后: ```c -static int __attribute__((fastcall)) ZEND_ASSIGN_SPEC_CV_CONST_HANDLER(zend_execute_data *execute_data) +static int ZEND_ASSIGN_SPEC_CV_CONST_HANDLER(zend_execute_data *execute_data) { //USE_OPLINE const zend_op *opline = execute_data->opline; @@ -148,7 +148,7 @@ ZEND_API void execute_ex(zend_execute_data *ex) ``` 这个时候调用各opcode指令的handler时就不再传入execute_data的参数了,handler使用时直接从全局变量读取,仍以上面的赋值ZEND_ASSIGN指令为例,handler展开后: ```c -static int __attribute__((fastcall)) ZEND_ASSIGN_SPEC_CV_CONST_HANDLER(void) +static int ZEND_ASSIGN_SPEC_CV_CONST_HANDLER(void) { ... From bfdd8fd5bfb4a3a5b7a3ec68e2fa4b9b4b525ae8 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Tue, 25 Jul 2017 11:08:08 +0800 Subject: [PATCH 354/379] update --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index ccdf4aa..dbec699 100644 --- a/README.md +++ b/README.md @@ -46,6 +46,10 @@ * [3.4.5 魔术方法](3/zend_magic_method.md) * [3.4.6 类的自动加载](3/zend_autoload.md) * [3.5 运行时缓存](3/zend_runtime_cache.md) + * 3.6 Opcache + * 3.6.1 opcode缓存 + * 3.6.2 opcode优化 + * 3.6.3 JIT * 第4章 PHP基础语法实现 * [4.1 类型转换](4/type.md) * [4.2 选择结构](4/if.md) From 163db8b5856f3f9f5ad76344fbb63fa2713c744d Mon Sep 17 00:00:00 2001 From: qinpeng Date: Tue, 25 Jul 2017 15:03:13 +0800 Subject: [PATCH 355/379] fix error --- 2/zend_constant.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2/zend_constant.md b/2/zend_constant.md index fad305c..eca3f65 100644 --- a/2/zend_constant.md +++ b/2/zend_constant.md @@ -8,7 +8,7 @@ PHP中的常量通过`define()`函数定义: define('CONST_VAR_1', 1234); ``` ### 2.5.1 常量的存储 -在内核中常量存储在`EG(zend_constant)`哈希表中,访问时也是根据常量名直接到哈希表中查找,其实现比较简单。 +在内核中常量存储在`EG(zend_constants)`哈希表中,访问时也是根据常量名直接到哈希表中查找,其实现比较简单。 常量的数据结构: ```c From 337ab9c385d669d64a2554ea60867c5297c52170 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Tue, 25 Jul 2017 21:13:09 +0800 Subject: [PATCH 356/379] update --- 2/global_var.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/2/global_var.md b/2/global_var.md index a6e90fc..5537b51 100644 --- a/2/global_var.md +++ b/2/global_var.md @@ -1,7 +1,5 @@ ## 2.4 全局变量 -PHP中在函数、类之外直接定义的变量可以在函数、类成员方法中通过global关键词引入使用,这些变量称为:全局变量。 - -这些直接在PHP中定义的变量(包括include、require文件中的)相对于函数、类方法而言它们是全局变量,但是对自身执行域zend_execute_data而言它们是普通的局部变量,自身执行时它们与普通变量的读写方式完全相同。 +PHP中把定义在函数、类之外的变量称之为全局变量,也就是定义在主脚本中的变量,这些变量可以在函数、成员方法中通过global关键字引入使用。 ```php function test() { From cec1807fe0c946e146565ebfa1cbdef5311ba47c Mon Sep 17 00:00:00 2001 From: qinpeng Date: Wed, 26 Jul 2017 16:38:28 +0800 Subject: [PATCH 357/379] update --- 2/global_var.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2/global_var.md b/2/global_var.md index 5537b51..e9515d4 100644 --- a/2/global_var.md +++ b/2/global_var.md @@ -62,7 +62,7 @@ global $id; // 相当于:$id = & EG(symbol_table)["id"]; ![](../img/zend_global_ref.png) ### 2.4.3 超全局变量 -全部变量除了通过global引入外还有一类特殊的类型,它们不需要使用global引入而可以直接使用,这些全局变量称为:超全局变量。 +全局变量除了通过global引入外还有一类特殊的类型,它们不需要使用global引入而可以直接使用,这些全局变量称为:超全局变量。 超全局变量实际是PHP内核定义的一些全局变量:$GLOBALS、$_SERVER、$_REQUEST、$_POST、$_GET、$_FILES、$_ENV、$_COOKIE、$_SESSION、argv、argc。 From a6eec9f8121a4bf35664e57524bd39b4fa96f8ba Mon Sep 17 00:00:00 2001 From: qinpeng Date: Thu, 27 Jul 2017 20:38:56 +0800 Subject: [PATCH 358/379] fix error --- 8/namespace.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/8/namespace.md b/8/namespace.md index b9b7c6d..d59d086 100644 --- a/8/namespace.md +++ b/8/namespace.md @@ -259,7 +259,7 @@ typedef struct _zend_file_context { ``` 简单总结下use的几种不同用法: * __a.导入命名空间:__ 导入的名称保存在FC(imports)中,编译使用的语句时搜索此符号表进行补全 -* __b.导入类:__ 导入的名称保存在FC(imports)中,与a不同的时如果不会根据"\"切割后的最后一节检索,而是直接使用类名查找 +* __b.导入类:__ 导入的名称保存在FC(imports)中,与a不同的是不会根据"\"切割后的最后一节检索,而是直接使用类名查找 * __c.导入函数:__ 通过`use function`导入到FC(imports_function),补全时先查找FC(imports_function),如果没有找到则继续按照a的情况处理 * __d.导入常量:__ 通过`use const`导入到FC(imports_const),不全是先查找FC(imports_const),如果没有找到则继续按照a的情况处理 From fb2385c368209a0d48f3e050bccce499f118102e Mon Sep 17 00:00:00 2001 From: qinpeng Date: Thu, 27 Jul 2017 20:40:29 +0800 Subject: [PATCH 359/379] fix error --- 8/namespace.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/8/namespace.md b/8/namespace.md index d59d086..dc5ac2b 100644 --- a/8/namespace.md +++ b/8/namespace.md @@ -261,7 +261,7 @@ typedef struct _zend_file_context { * __a.导入命名空间:__ 导入的名称保存在FC(imports)中,编译使用的语句时搜索此符号表进行补全 * __b.导入类:__ 导入的名称保存在FC(imports)中,与a不同的是不会根据"\"切割后的最后一节检索,而是直接使用类名查找 * __c.导入函数:__ 通过`use function`导入到FC(imports_function),补全时先查找FC(imports_function),如果没有找到则继续按照a的情况处理 -* __d.导入常量:__ 通过`use const`导入到FC(imports_const),不全是先查找FC(imports_const),如果没有找到则继续按照a的情况处理 +* __d.导入常量:__ 通过`use const`导入到FC(imports_const),补全时先查找FC(imports_const),如果没有找到则继续按照a的情况处理 ```php use aa\bb; //导入namespace From 3edb26dc0af49be9adead33e9045678493508e7b Mon Sep 17 00:00:00 2001 From: qinpeng Date: Fri, 28 Jul 2017 14:25:39 +0800 Subject: [PATCH 360/379] fix error --- 8/namespace.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/8/namespace.md b/8/namespace.md index dc5ac2b..58ac9fe 100644 --- a/8/namespace.md +++ b/8/namespace.md @@ -427,7 +427,7 @@ zend_string *zend_resolve_non_class_name( return zend_prefix_with_ns(name); } ``` -可以看到,函数与常量的的补全逻辑只是优先用原始名称去FC(imports_function)或FC(imports_const)查找,如果没有找到再去FC(imports)中匹配。如果我们这样导入了一个函数:`use aa\bb\my_func;`,编译`my_func()`会在FC(imports_function)中根据"my_func"找到"aa\bb\my_func",从而使用完整的这个名称。 +可以看到,函数与常量的的补全逻辑只是优先用原始名称去FC(imports_function)或FC(imports_const)查找,如果没有找到再去FC(imports)中匹配。如果我们这样导入了一个函数:`use function aa\bb\my_func;`,编译`my_func()`会在FC(imports_function)中根据"my_func"找到"aa\bb\my_func",从而使用完整的这个名称。 ### 8.3.3 动态用法 前面介绍的这些命名空间的使用都是名称为CONST类型的情况,所有的处理都是在编译环节完成的,PHP是动态语言,能否动态使用命名空间呢?举个例子: From c84843bd92c33080dd344b1582d193c29aaa13e8 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Tue, 1 Aug 2017 17:53:26 +0800 Subject: [PATCH 361/379] fix error --- 4/loop.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/4/loop.md b/4/loop.md index 19ce394..f698d0e 100644 --- a/4/loop.md +++ b/4/loop.md @@ -241,7 +241,7 @@ foreach($arr as $k=>$v){ 了解了foreach的实现、运行机制我们再回头看下其编译过程: -* __(1)__ 编译"拷贝"数组/对象操作的opcode:`ZEND_FE_RESET_R`,如果value是引用则是`ZEND_FE_RESET_RW`,执行时如果发现数组或对象属性为空则直接跳出遍历,所以这条opcode还需要知道跳出的位置,这个位置需要编译完foreach以后才能确定; +* __(1)__ 编译拷贝数组、对象操作的指令:ZEND_FE_RESET_R,如果value是引用则是ZEND_FE_RESET_RW。执行时如果发现遍历的变量不是数组、对象,则抛出一个warning,然后跳出循环,所以这条指令还需要知道跳出的位置,这个位置需要编译完foreach以后才能确定; * __(2)__ 编译fetch数组/对象当前单元key、value的opcode:`ZEND_FE_FETCH_R`,如果是引用则是`ZEND_FE_FETCH_RW`,此opcode还需要知道当遍历已经到达数组末尾时跳出遍历的位置,与步骤(1)的opcode相同,另外还有一个关键操作,前面已经说过遍历的key、value实际就是普通的局部变量,它们的内存存储位置正是在这一步分配确定的,分配过程与普通局部变量的过程完全相同,如果value不是一个CV变量(比如:foreach($arr as $v["xx"]){...})则还会编译其它操作的opcode; * __(3)__ 如果foreach定义了key则编译一条赋值opcode,此操作是对key进行赋值; * __(4)__ 编译循环体statement; From c9275007b354068318fc35322cc197481faec8c3 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Fri, 4 Aug 2017 14:35:12 +0800 Subject: [PATCH 362/379] fix error --- 3/zend_class.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3/zend_class.md b/3/zend_class.md index e0bc8f5..b7099af 100644 --- a/3/zend_class.md +++ b/3/zend_class.md @@ -416,7 +416,7 @@ void zend_compile_class_const_decl(zend_ast *ast) zend_class_entry *ce = CG(active_class_entry); uint32_t i; - for (i = 0; i < list->children; ++i) { //不清楚这个地方为什么要用list,试了几个例子这个节点都只有一个child,即for只循环一次 + for (i = 0; i < list->children; ++i) { //const声明了多个常量,遍历编译每个子节点 zend_ast *const_ast = list->child[i]; zend_ast *name_ast = const_ast->child[0]; //常量名节点 zend_ast *value_ast = const_ast->child[1];//常量值节点 From 42c82f65cedbf7a08d0d4d67476a9a60b28a2da3 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Fri, 4 Aug 2017 14:46:28 +0800 Subject: [PATCH 363/379] fix error --- 3/zend_class.md | 1 - 1 file changed, 1 deletion(-) diff --git a/3/zend_class.md b/3/zend_class.md index b7099af..f67783b 100644 --- a/3/zend_class.md +++ b/3/zend_class.md @@ -446,7 +446,6 @@ void zend_compile_prop_decl(zend_ast *ast) zend_class_entry *ce = CG(active_class_entry); uint32_t i, children = list->children; - //也不清楚这里为啥用循环,测试的情况child只有一个 for (i = 0; i < children; ++i) { zend_ast *prop_ast = list->child[i]; //这个节点类型为:ZEND_AST_PROP_ELEM zend_ast *name_ast = prop_ast->child[0]; //属性名节点 From eb2f96fc2aa72515a3d1fb4f87e387b650775ac3 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Mon, 7 Aug 2017 17:26:13 +0800 Subject: [PATCH 364/379] fix error --- 7/func.md | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/7/func.md b/7/func.md index 74ae72a..4c4a47c 100644 --- a/7/func.md +++ b/7/func.md @@ -376,8 +376,25 @@ my_func_1(array($object, 'method')); #### 7.6.2.11 其它标识符 除了上面介绍的这些解析符号以外,还有几个有特殊用法的标识符:"|"、"+"、"*",它们并不是用来表示某种数据类型的。 -* __|:__ 表示此后的参数为可选参数,可以不传,比如解析规则为:"al|b",则可以传2个或3个参数,如果是:"alb",则必须传3个,否则将报错; -* __+/*:__ 用于可变参数,注意这里与PHP函数...的用法不太一样,PHP中可以把函数最后一个参数前加...,表示调用时可以传多个参数,这些参数都会插入...参数的数组中,"*/+"也表示这个参数是可变的,但内核中只能接收一个值,即使传了多个后面那些也解析不到,"*"、"+"的区别在于"*"表示可以不传可变参数,而"+"表示可变参数至少有一个。 +* __|:__ 表示此后的参数为可选参数,可以不传,比如解析规则为:"al|b",则可以传2个或3个参数,如果是:"alb",则必须传3个,否则将报错 +* __+、* :__ 用于可变参数,`+、*`的区别在于 * 表示可以不传可变参数,而 + 表示可变参数至少有一个。可变参数将被解析到zval数组,可以通过一个整形参数,用于获取具体的数量,例如: +```c +PHP_FUNCTION(my_func_1) +{ + zval *args; + int argc; + + if (zend_parse_parameters(ZEND_NUM_ARGS(), "+", &args, &argc) == FAILURE) { + return; + } + //... +} +``` +argc获取的就是可变参数的数量,args为参数数组,指向第一个参数,可以通过args[i]获取其它参数,比如这样传参: +```php +my_func_1(array(), 1, false, "ddd"); +``` +那么传入的4个参数就可以在解析后通过args[0]、args[1]、args[2]、args[3]获取。 ### 7.6.3 引用传参 上一节介绍了如何在内部函数中解析参数,这里还有一种情况没有讲到,那就是引用传参: From b7dbd3deebd3fff05fde871ec0e4331361dfe89e Mon Sep 17 00:00:00 2001 From: jianzhiyao <739319867@qq.com> Date: Tue, 29 Aug 2017 16:58:59 +0800 Subject: [PATCH 365/379] =?UTF-8?q?=E6=8B=BC=E5=86=99=E5=8F=AF=E8=83=BD?= =?UTF-8?q?=E9=94=99=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 7/implement.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/7/implement.md b/7/implement.md index bebf3d4..7c84d1c 100644 --- a/7/implement.md +++ b/7/implement.md @@ -1,5 +1,5 @@ ## 7.2 扩展的实现原理 -PHP中扩展通过`zend_module_entry`这个结构来表示,此结构定义了扩展的全部信息:扩展名、扩展版本、扩展提供的函数列表以及PHP四个执行阶段的hook函数等,每一个扩展都需要定义一个此结构的变量,而且这个变量的名称格式必须是:`{mudule_name}_module_entry`,内核正是通过这个结构获取到扩展提供的功能的。 +PHP中扩展通过`zend_module_entry`这个结构来表示,此结构定义了扩展的全部信息:扩展名、扩展版本、扩展提供的函数列表以及PHP四个执行阶段的hook函数等,每一个扩展都需要定义一个此结构的变量,而且这个变量的名称格式必须是:`{module_name}_module_entry`,内核正是通过这个结构获取到扩展提供的功能的。 扩展可以在编译PHP时一起编译(静态编译),也可以单独编译为动态库,动态库需要加入到php.ini配置中去,然后在`php_module_startup()`阶段把这些动态库加载到PHP中: ```c From 386016c4e23bd83003039bef2d5e2855b9d2281b Mon Sep 17 00:00:00 2001 From: qinpeng Date: Mon, 13 Nov 2017 19:49:28 +0800 Subject: [PATCH 366/379] update --- README.md | 5 ++++- img/book.jpg | Bin 0 -> 75288 bytes 2 files changed, 4 insertions(+), 1 deletion(-) create mode 100644 img/book.jpg diff --git a/README.md b/README.md index dbec699..5dddd92 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,10 @@ ## 反馈 [交流&吐槽](https://github.com/pangudashu/php7-internal/issues/3) [错误反馈](https://github.com/pangudashu/php7-internal/issues/2) -![](img/my_wx2.png) +## 纸质版 +

    + +
    ## 目录: * 第1章 PHP基本架构 diff --git a/img/book.jpg b/img/book.jpg new file mode 100644 index 0000000000000000000000000000000000000000..89fc991f3db944b2f9540e7f491fe28831e57e7a GIT binary patch literal 75288 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ⓈubSvbsX|0)3%Vj`+dSGujJ5T^R<<1qh(K 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 Date: Mon, 13 Nov 2017 19:52:12 +0800 Subject: [PATCH 367/379] update --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 5dddd92..57dfd71 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,8 @@ ## 纸质版
    + + (coming soon)
    ## 目录: From d5ec26aab7785a00065893226fb4bb36af26878f Mon Sep 17 00:00:00 2001 From: glowdan Date: Wed, 15 Nov 2017 21:12:30 +0800 Subject: [PATCH 368/379] add gitbook support --- SUMMARY.md | 108 +++++++++++++++++++++++++++++++++++++++++++++++++++++ book.json | 7 ++++ 2 files changed, 115 insertions(+) create mode 100644 SUMMARY.md create mode 100644 book.json diff --git a/SUMMARY.md b/SUMMARY.md new file mode 100644 index 0000000..d26efd0 --- /dev/null +++ b/SUMMARY.md @@ -0,0 +1,108 @@ +# PHP7-internal + +## 目录 + +* 第1章 PHP基本架构 + * 1.1 PHP简介 + * 1.2 PHP7的改进 + * [1.3 FPM](1/fpm.md) + * [1.3.1 概述](1/fpm.md) + * [1.3.2 基本实现](1/fpm.md) + * [1.3.3 FPM的初始化](1/fpm.md) + * [1.3.4 请求处理](1/fpm.md) + * [1.3.5 进程管理](1/fpm.md) + * [1.4 PHP执行的几个阶段](1/base_process.md) +* 第2章 变量 + * [2.1 变量的内部实现](2/zval.md) + * [2.2 数组](2/zend_ht.md) + * [2.3 静态变量](2/static_var.md) + * [2.4 全局变量](2/global_var.md) + * [2.5 常量](2/zend_constant.md) +* 第3章 Zend虚拟机 + * [3.1 PHP代码的编译](3/zend_compile.md) + * [3.1.1 词法解析、语法解析](3/zend_compile_parse.md) + * [3.1.2 抽象语法树编译流程](3/zend_compile_opcode.md) + * [3.2 函数实现](3/function_implement.md) + * [3.2.1 内部函数](3/function_implement.md) + * 3.2.2 用户函数的实现 + * [3.3 Zend引擎执行流程](3/zend_executor.md) + * 3.3.1 基本结构 + * 3.3.2 执行流程 + * 3.3.3 函数的执行流程 + * [3.3.4 全局execute_data和opline](3/zend_global_register.md) + * 3.4 面向对象实现 + * [3.4.1 类](3/zend_class.md) + * [3.4.2 对象](3/zend_object.md) + * [3.4.3 继承](3/zend_extends.md) + * [3.4.4 动态属性](3/zend_prop.md) + * [3.4.5 魔术方法](3/zend_magic_method.md) + * [3.4.6 类的自动加载](3/zend_autoload.md) + * [3.5 运行时缓存](3/zend_runtime_cache.md) + * 3.6 Opcache + * 3.6.1 opcode缓存 + * 3.6.2 opcode优化 + * 3.6.3 JIT +* 第4章 PHP基础语法实现 + * [4.1 类型转换](4/type.md) + * [4.2 选择结构](4/if.md) + * [4.3 循环结构](4/loop.md) + * [4.4 中断及跳转](4/break.md) + * [4.5 include/require](4/include.md) + * [4.6 异常处理](4/exception.md) +* 第5章 内存管理 + * [5.1 Zend内存池](5/zend_alloc.md) + * [5.2 垃圾回收](5/gc.md) +* 第6章 线程安全 + * [6.1 什么是线程安全](6/ts.md) + * [6.2 线程安全资源管理器](6/ts.md) +* 第7章 扩展开发 + * [7.1 概述](7/intro.md) + * [7.2 扩展的实现原理](7/implement.md) + * [7.3 扩展的构成及编译](7/extension_intro.md) + * [7.3.1 扩展的构成](7/extension_intro.md) + * [7.3.2 编译工具](7/extension_intro.md) + * [7.3.3 编写扩展的基本步骤](7/extension_intro.md) + * [7.3.4 config.m4](7/extension_intro.md) + * [7.4 钩子函数](7/hook.md) + * [7.5 运行时配置](7/conf.md) + * [7.5.1 全局变量](7/conf.md) + * [7.5.2 ini配置](7/conf.md) + * [7.6 函数](7/func.md) + * 7.6.1 内部函数注册 + * 7.6.2 函数参数解析 + * 7.6.3 引用传参 + * 7.6.4 函数返回值 + * 7.6.5 函数调用 + * [7.7 zval的操作](7/var.md) + * [7.7.1 新生成各类型zval](7/var.md) + * [7.7.2 获取zval的值及类型](7/var.md) + * [7.7.3 类型转换](7/var.md) + * [7.7.4 引用计数](7/var.md) + * [7.7.5 字符串操作](7/var.md) + * [7.7.6 数组操作](7/var.md) + * [7.8 常量](7/constant.md) + * 7.9 面向对象 + * 7.9.1 内部类注册 + * 7.9.2 定义成员属性 + * 7.9.3 定义成员方法 + * 7.9.4 定义常量 + * 7.9.5 类的实例化 + * 7.10 资源类型 + * 7.11 经典扩展解析 + * 7.8.1 Yaf + * 7.8.2 Redis +* 第8章 命名空间 + * [8.1 概述](8/namespace.md) + * [8.2 命名空间的定义](8/namespace.md) + * [8.2.1 定义语法](8/namespace.md) + * [8.2.2 内部实现](8/namespace.md) + * [8.3 命名空间的使用](8/namespace.md) + * [8.3.1 基本用法](8/namespace.md) + * [8.3.2 use导入](8/namespace.md) + * [8.3.3 动态用法](8/namespace.md) + +---- + +## 附录 + * [附录1:break/continue按标签中断语法实现](try/break.md) + * 附录2:defer推迟函数调用语法的实现 \ No newline at end of file diff --git a/book.json b/book.json new file mode 100644 index 0000000..d167834 --- /dev/null +++ b/book.json @@ -0,0 +1,7 @@ +{ + "title" : "PHP7内核剖析", + "author" : "pangudashu", + "description" : "PHP7", + "language" : "zh-hans", + "gitbook" : ">=3.0.0" +} \ No newline at end of file From 3c0ba793950105f929a2d9f597a2ccc8137d2df8 Mon Sep 17 00:00:00 2001 From: glowdan Date: Wed, 15 Nov 2017 21:17:24 +0800 Subject: [PATCH 369/379] edit description --- book.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/book.json b/book.json index d167834..26f051e 100644 --- a/book.json +++ b/book.json @@ -1,7 +1,7 @@ { "title" : "PHP7内核剖析", "author" : "pangudashu", - "description" : "PHP7", + "description" : "PHP7内核剖析,基于PHP版本:php-7.0.12", "language" : "zh-hans", "gitbook" : ">=3.0.0" } \ No newline at end of file From bf67ee7d1cc994f2282e06ae1dafbd088ed4f9cc Mon Sep 17 00:00:00 2001 From: qinpeng Date: Fri, 1 Dec 2017 10:13:27 +0800 Subject: [PATCH 370/379] update --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 57dfd71..7458bfa 100644 --- a/README.md +++ b/README.md @@ -10,8 +10,8 @@ ## 纸质版
    - - (coming soon) + [京东](https://item.jd.com/12267210.html) + [当当](http://product.dangdang.com/25185400.html)
    ## 目录: From f89a9abc25b94fd0d7aa950dcc6a47a49f701a4b Mon Sep 17 00:00:00 2001 From: qinpeng Date: Fri, 1 Dec 2017 10:16:25 +0800 Subject: [PATCH 371/379] add url --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 7458bfa..6ae92fe 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,9 @@ ## 纸质版
    + [京东](https://item.jd.com/12267210.html) + [当当](http://product.dangdang.com/25185400.html)
    From 254c7b87aa865b50535e9d09354fcd014a19c70d Mon Sep 17 00:00:00 2001 From: qinpeng Date: Fri, 1 Dec 2017 10:18:20 +0800 Subject: [PATCH 372/379] add url --- README.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 6ae92fe..dacb5fc 100644 --- a/README.md +++ b/README.md @@ -11,9 +11,8 @@
    - [京东](https://item.jd.com/12267210.html) - - [当当](http://product.dangdang.com/25185400.html) + [京东] + [当当]
    ## 目录: From 9e273d42af08960642989a32bc605d3122cde55b Mon Sep 17 00:00:00 2001 From: qinpeng Date: Fri, 1 Dec 2017 10:18:55 +0800 Subject: [PATCH 373/379] add url --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index dacb5fc..90ebdf2 100644 --- a/README.md +++ b/README.md @@ -10,10 +10,10 @@ ## 纸质版
    +
    [京东] [当当] - ## 目录: * 第1章 PHP基本架构 From 6c469f14f222c0a922aa194b56c972747697f331 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Fri, 1 Dec 2017 10:19:55 +0800 Subject: [PATCH 374/379] add url --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 90ebdf2..95dcbb4 100644 --- a/README.md +++ b/README.md @@ -11,9 +11,9 @@
    - - [京东] - [当当] + +[京东](https://item.jd.com/12267210.html) +[当当](http://product.dangdang.com/25185400.html) ## 目录: * 第1章 PHP基本架构 From 6c34d2e2036c4d06be089283e3e6b4b3e7cc5b1d Mon Sep 17 00:00:00 2001 From: xmc Date: Mon, 19 Mar 2018 17:01:54 +0800 Subject: [PATCH 375/379] =?UTF-8?q?fix=20=E8=AF=8D=E8=AF=AD=E9=94=99?= =?UTF-8?q?=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2/zval.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2/zval.md b/2/zval.md index 6f96b7e..dd82bc0 100644 --- a/2/zval.md +++ b/2/zval.md @@ -278,7 +278,7 @@ $b[] = 3; ![zval_sep](../img/zval_sep.png) -不是所有类型都可以copy的,比如对象、资源,实时上只有string、array两种支持,与引用计数相同,也是通过`zval.u1.type_flag`标识value是否可复制的: +不是所有类型都可以copy的,比如对象、资源,事实上只有string、array两种支持,与引用计数相同,也是通过`zval.u1.type_flag`标识value是否可复制的: ```c #define IS_TYPE_COPYABLE (1<<4) ``` From 66505547ac5a3ff13c0399d62e64dd51750682fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?mc=C2=B2?= Date: Mon, 26 Mar 2018 17:53:21 +0800 Subject: [PATCH 376/379] =?UTF-8?q?=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修复 严格的将 => 严格的说 --- 2/static_var.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/2/static_var.md b/2/static_var.md index d382cb4..c134cf2 100644 --- a/2/static_var.md +++ b/2/static_var.md @@ -87,7 +87,7 @@ if (by_ref) { * __ZEND_FETCH_W:__ 这条opcode对应的操作是创建一个IS_INDIRECT类型的zval,指向static_variables中对应静态变量的zval * __ZEND_ASSIGN_REF:__ 它的操作是引用赋值,即将一个引用赋值给CV变量 -通过上面两条opcode可以确定静态变量的读写过程:首先根据变量名在static_variables中取出对应的zval,然后将它修改为引用类型并赋值给局部变量,也就是说`static $count = 4;`包含了两个操作,严格的将`$count`并不是真正的静态变量,它只是一个指向静态变量的局部变量,执行时实际操作是:`$count = & static_variables["count"];`。上面例子$count与static_variables["count"]间的关系如图所示。 +通过上面两条opcode可以确定静态变量的读写过程:首先根据变量名在static_variables中取出对应的zval,然后将它修改为引用类型并赋值给局部变量,也就是说`static $count = 4;`包含了两个操作,严格的说`$count`并不是真正的静态变量,它只是一个指向静态变量的局部变量,执行时实际操作是:`$count = & static_variables["count"];`。上面例子$count与static_variables["count"]间的关系如图所示。 ![](../img/zend_static_ref.png) From 217ea91e703df8cbfacb872ad7a6259e07d4aa89 Mon Sep 17 00:00:00 2001 From: smalleyes Date: Wed, 25 Apr 2018 18:04:16 +0800 Subject: [PATCH 377/379] =?UTF-8?q?=E6=A0=A1=E5=AF=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 3/zend_class.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3/zend_class.md b/3/zend_class.md index f67783b..62eea77 100644 --- a/3/zend_class.md +++ b/3/zend_class.md @@ -1,7 +1,7 @@ ### 3.4.1 类 类是现实世界或思维世界中的实体在计算机中的反映,它将某些具有关联关系的数据以及这些数据上的操作封装在一起。在面向对象中类是对象的抽象,对象是类的具体实例。 -在PHP中类编译阶段的产物,而对象是运行时产生的,它们归属于不同阶段。 +在PHP中类是编译阶段的产物,而对象是运行时产生的,它们归属于不同阶段。 PHP中我们这样定义一个类: ```php From 124d6bc9bbf5abc5a3671bfc005b46bcec099252 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Tue, 10 Jul 2018 17:34:12 +0800 Subject: [PATCH 378/379] update doc --- README.md | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 95dcbb4..566fac0 100644 --- a/README.md +++ b/README.md @@ -115,7 +115,10 @@ * [8.3.2 use导入](8/namespace.md) * [8.3.3 动态用法](8/namespace.md) -## 附录 - * [附录1:break/continue按标签中断语法实现](try/break.md) - * 附录2:defer推迟函数调用语法的实现 +## 实现PHP新特性 + * [1、break/continue按标签中断语法实现](try/break.md) + * 2、defer语法 + * 3、协程 + * 3.1 协程的原理 + * 3.2 上下文切换 From 860410be29627212b5dbd485664ace2d4e6188b3 Mon Sep 17 00:00:00 2001 From: Ching-Ping Sun <252880+tomjpsun@users.noreply.github.com> Date: Fri, 18 Jan 2019 17:29:42 +0800 Subject: [PATCH 379/379] fix example typo --- 7/extension_intro.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/7/extension_intro.md b/7/extension_intro.md index f6aafc8..020a179 100644 --- a/7/extension_intro.md +++ b/7/extension_intro.md @@ -270,7 +270,7 @@ __(5)PHP_ADD_INCLUDE(path):__ 添加include路径,即:`gcc -Iinclude_dir`, __(6)PHP_CHECK_LIBRARY(library, function [, action-found [, action-not-found [, extra-libs]]]):__ 检查依赖的库中是否存在需要的function,action-found为存在时执行的动作,action-not-found为不存在时执行的动作,比如扩展里使用到线程pthread,检查pthread_create(),如果没找到则终止./configure执行: ```sh -PHP_ADD_INCLUDE(pthread, pthread_create, [], [ +PHP_CHECK_LIBRARY(pthread, pthread_create, [], [ AC_MSG_ERROR([not find pthread_create() in lib pthread]) ]) ```