From fc4943d67dc47cecf7f66294119f13b53dc8a5d9 Mon Sep 17 00:00:00 2001 From: qinpeng Date: Mon, 12 Jun 2017 19:06:11 +0800 Subject: [PATCH 01/67] 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 02/67] =?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 03/67] =?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 zcmb8WcR1EzA2)2pMRxXHAv3bGy2#23A$yPPO-Ob&Aw*j;H}2&pD*5C@mHgo%e%W*X>kZv zlak=v!VlLpFtC5dIgp~rqM=b#RZ%fIp{>rY+|=Bx;t=#yro@*dax1gm53shyPB+zJqQ?O**G-Vm+`k0AG4EGhDDOVZP^tn{O3i@e}DJ}zcB)`igZ%Yv|6ixD@rb*AYa;PXDoM%G*SE1k!_LV`hadtONwqc`ZXn6Q9ThhF% z_M5!%DZhWzSJu>g8y_DZ8{6Ai>WDu-{555Y+B-jQ6hdh6%)y~dKQF9`e!9|H&B^I+ znSQPG#LJ_jqq#;eHxZfx`7{|sge;T7_wMfQ!9hGm_pON{_)7zlZ{NO&ZQo#Y-&uS> zL*Ex)(N-mwNQhirU8SU?tiw=x^ayVG=FOY`c`#+3gt0l+8`hJ{G@`B+J$BW%d+PeW zeLMQu8FgZ9YHAACopox(;}fO9_jxnm-Wf>>^QEY$IHNq++Z#wu%1A;@-RL+c2IrHK zYGsTmEi8O_P*PkBQ{wFH;PB_8VIuL^iedr%p~z#>U2_{4!)i@kjlu zdvMDE0ar6Kdi*qzq20^x#C=?syJ9Tf`uO;W(-9D@mTD9+F)=Cp33iS-Zhy5fKTk(V zS?{teS1LcF{JQ`8nc!pH7+BAG!WH;%XIS&oj*dLxA`!Adgi5N{N7&BF%1V1XGFyG) z&-H=lB*J?C{_O1ReF1@_(VE*S{ge8QE3Q5;nX%pP!#&VPZyhn$;V`I+)7_pCx_4wY`$3_y1~DS?e$xmbt~MsH{9NS)#M#Vsf+7 z%mrS=KmFyy>*(lcFVt92V6BiSdA7kEGIDuw-itBG*-v8r;Gq)w&SMW}XOvSLhwCF$ zv#hMFK=qxN_s;wB^77!|js}lkurM=l@bE|x7%eR=ye%hY78We^{@UK&-tYr+iorrw?`w<>H5V@CpeD$-JGInd!5tlrNki zxyWYflr7SdlaqTrBpwXs?&^}0%re&1tuy(8MtCPeR>RP+8A3ubD=RtqiJl(LAbVRZ z?R_Dqd1Y265}cBflH=dsWiXZU$G&4k`J&kG|-!*jDP>B5wXZ_RGCLN*VM zhfNw1Mb7IgLh}Rj>q-0h=_%h?jpz0c>_4j(0+3*p-e-EayC3W>cQ0Lx;zhss^y$+G ztqKF-$@zJQi?_E(u9C;zN-uBgzp<_^tGNb`=idZ8atAN>_FRS19jvXx3DL4toBw5_ zJTP12{T>vydwkq|F- zMgIkFVdt*v3u9wr+Y8-?Sh`5sK6|9AtLx%Y@qE2m%-H{sG`wSUZsvA^LY{`LogHVr z=xRaM3ni*Gi22o3Qfg{_m}6KZrpXbPN5N6DZ(X(~?i|v|(8cK(7~n=oC)SI-dGltb zPkp%=o~YcQeyqJc=&`n#vRUQ#y0da3e~xUDi!=kKd^M>@s;Wbgq@3*?9UcdxcgG$V zY4JAg1a%!u%E&T}!uY6VNtTUL(2}(m9WMkdOig+1{_Lb0Z0p9u!-Gg{_jM zQ%!AcOsiM2Igyb#6vaqBu__fMbORpY+qYLovSsSl9Tk56{{8RYzxjZxi~L6^LuvQ0 z7^@)0{Dg#sbr=X4Ld3+xJ{mR8Oil`hGYANfyznSp>@`3>=4NWxR+0Q6m z_o+i!rUWex|MNe!z0&G|k&%&7SEs{iX=!e21A())wzhm``#2q!A3uIf=G5W;DIzLr z%k}ToD@2hN&Y$m8LOol6u_pGR)^6+d=%v+w_OaR0x% zq@3%f3YxP}vv2AN|9Rn%_@8h8Z==O;Pbc-lKwrOP7{8aKuP04*Qi3e1+N={tQ=iY} zWF=8e*#YfyW#zcrf{)u;{d(rTYHX`P7QJPf_+E<-LZ(fSq7sLtu9`l4z+^lqkh<7} zML>YuSWPjGef27p&%A4Tc7NdB@bvVwxX<3omtd^ctIP9gY7_Sjs&%R~ccw|Gn5tLV z6+EdJ5wfla8>7C*+l(P(+}o<>>TgNxifGRj9uRLx_@REM%_U=U4cR-rpv>(red=jGvHX>GmG;!n*8 zb^Gi3{?%SeYwDPKpKM4Z$wTs5r-h-Rq3x|LBmyFS|McJHc)`7&Nhv8QNlD@_{(1K$ z-Ff`@F(V_R<_BfI(2Ar8Y|W5x=-J5>uYOk3$;%uG~dL>cXV(Nj7)$q z;pHW`8tCa!FVce6O}C8w7Qu|OV~hRtCsalfa&n!gPoEkZ8a{r^=e2DR5?@fTzBO60 zyu2KfoS;!OFgy&sj(nHnk)ypmyr8F`kVZ5g&Dibk?sAd!FHU?kZlxn5gHBlnv(Mu5 z!zePiM14a8RfRJ98oEOwzorF$8g%#&18YO?(i0OaJ^##n`gAv6BZ5%OePaZAG>g)s zl$x5F!a{cSLYUg0Kh2mu2Yh^eVbw_2G6;A)kPAcQUR6h=PE2U&>(7!K`|Wnq2e>;s zGeq5%l3G}7Vz&w@G8FB*8l9UPT;44%DS5&%+3b5-T>Dk!c)@CO$;31#D8C!=_@8Xk_aJ6C zxpDJlx^#;n%(iZ7n`YbJyvu(_vrZ2mK9qAB`*y2Bmxhuu!jL2QJ|R5e+2OAWJ8Y?n zuZi7N%T7%)5Bm<{&1AJTwEpu}?~9U<5R5Q|1Vh6!>1QD>SXdhbMX#AR6)0JZnlNtHQ-61;TAM_akg2Yk}ed}G&i%6l$^}1Ut_-# zTe!JVSW8&Bi6T3avD6f4MJ(g-#19zyaNX~0yprvJ@ z>tqhsIFYyLrjOP`;nQn<;SZCU(%&g)$&=E*yc>Ne@je<;E3XSbro*SF#(9#S^EvbH zH(~*o;vW^?N&3$$x_9BavJN5)ISfY4Px7Wd8p_YdT|#{+3pY7F3&NiBC);8Fhd-roapf;kQlF^H>9)DwdXz*&p-M@* zfw9bYn~#r(F)1-Im~ijl!0+O4N>f8aHA4h&ctU)^D6AV_rfnLVt$;rvPg2RhLtgfyZU+{+4 zFhv{hiin&*It$AmpPPG^k`m786-`u0K^G@4gof`$L1mfro=K1+{tqoqCn-B5Lc*)m7Z_rtUMg(I-jpr^Qe$s# zPfk+wX}%>YwwxR3`@yB0XlNGXZc-E{#>Y!<5mmjSwruEvst~p?3y&Hbi_c8qFn^bo zt>5DF(uemdUOkr1cd2N3`le+bJ|ijm_)!kAq=zZGC(S?@?VL@TIDAV8n>iz6K-Z6w z3bl8QBl@xS?;MI792#9%dhgmEGhro^M2{jYXF|0HLK2i!VfH&Dxq5DiVqm-{m8cBD ze{h%I+td|?cZ1)WOR>eY19Rhs@Jpzg1s^`N*Q|-t#SO2=S@iDg;+wCp?CdzB6F=ri z{@b*#>g9D@VcxydgDx)iweUy-HzYDC!Nu9xE3E;Dn+)sNc*Vp*pN*NB@gL@-b=UMJqcy?;LE7yM*$Hh)@vN3E^%@Z*~Bb z^Yj#ot`WA^;mOzNHLC!IW_>VSp7XiY4bnTzK#eS~uh)A1(K9w)2n!2?az)9du@bfZ zpT?m3P#}fxeM^g^lob6@6Am_ZL}cVx>!2g#5_EL*i;Ih@9BW6oT}h~z0qgI)p8NXl zD)XVY{hd|N3uR->`wVF1-SB#2W8*I$?(h5$`REH3(r70FsYJWpW+?Mv!7FmWmcT)& zo5HE}8a>O3xT(tHeXn7TKhQtobi)&Jk8uMdlj@~gw88{0G$sIl^$!hUrbK#1$7;d} zZmcv4w5z(~pyz8mg)uQQiY3gE$Xh1j&|qByyi{LbzbFkC$p7#`1M8W<#@1Hf&`{Wy zvx$5vW4QC%E9o+`Uh?VPar98AUOswwuG~$em8Xn;+KyXWkik#f(9p2Azi)aX`A3|V z9R2`xB9LEHE-gcuk{Z&8Ai%%Q&Q1g)^ojoG*Q|)9zJMYh1Vo<=EYaWZ_d^EbVbx#b zk5swyCxf>*G|VyHvDw!|`?>O4YC))M^{nnyRS7u1H!v{J(9|qKw+w>>)B#6(yNyhC zn)JhG?%Dex-9*gS7nOjElDTK@h=kHysGS=PqH<{DqItaU5{&Ncoyh0shGl?jp6UGT z8Ao^rU-e@WnfHl_gBTD1Aw#z^O-6cq*PvW1OOxxRwZV%Ip^-^MFeFMUDmSn=7#J9U zuM<3u=L>WT^?#+B`DAQ4rtD3ygisHE3GYJ(>3;Naljzy0C$ zp?AK(ujb~OdwL$VUS0eR3`8Z1dg!Yfed92%ikO~0D?Pn`;p;2$QpEep$Wp@o*7-q^qZ9t>*F@$1*b#p+4$acgU9Xn)r; zeepR-kTxbJ?{jk6L&8*83KeV@VQB%kipb{F`6#UbXwBW-T}Njs>5gWN)57(QOT8wE zuC1*tE8}L~fsR$9XoBTP8OFo*{f7^7JSiPt2GfO4{a(NWEO*Df%gBg~ib6+2Q+8nJ zj8^AJh90)oaZW?(MwVC~BHKYj8Cv9=oE#HF#*mT9VafBA-dpf=IYb)|15Mef6dygx zz0VdGe@$ImVHqitU9->4%@@$FZX!8JJd%|1%gg`5b^iXSzjycUdo2#iCrv+o7;B?CkAKq)TuYqm@?PC5rnz z9~!;Xi;TB#`_}i17Ge{W@>6&W`Kw8jBD!ARel&qzq;Nqm?D)gR)^^kzhe}=siG*_% z{lXvlrrc-4kl35)fAka@HX7u^tt*p*P5{FyY5c2zk}~-%BNG#EMRn#d_uon4TkK6_ zTTvTidZNk^?Tw8eSLk;o;~AN>Vk9& z9kiSx(Cx}5VN+;r8KU0&9AC*hb0)j6CWQB)tLY5 z=x9Y@p~3|T{`&r@alnO#qvOZ)bm}x!E2|H|!RWfvb8|7}dQ~=~Zw2iRgatV{OCX~% zGJaWDFqUX4FOM6v>UfHHtoGnS50^qM4A5bQs2eK_iv_@)-rnAoqM4bQ*RNmSvmRO` ztgG(pQvzI1Gd(_@`1&b~tCUl7a;nR8F|b`OlV7k81|*u(L}e z5`-V7RZ%?1y9T^Aqd5r$=n~Ewbhlhuj;tU-$f8du) zDolb@u|huC;o;rXPECBJSJoG_4r94&rXuaQZM{?YcFzJ>d{@_VkR6iaI}8jvLODpe85BTCx{952t@IqP;q5T8v*~|GnL+(hGQ7k7xMdZa=?b z8`Se~a%vW7K|><)9abr5C_u$EgA}yVO!4NN-SiTMY6(;qND*fMg6_@B&~E&-X{@W0 zer(YC!jOy1Tweb;ssTtAHML<7H9+dgl<=)-Zk_`nqP(1d{?XkRN58*2w<59+4%|Hw zW?BQJkcfkJlyZ8;gPkQAk9tP*81H2YbcrHBQURAK#xJm+-SE3SU58}b|Aw2n)#JYB?@!g$gF{2C`?sZf zqIr+7==~P|{JEyu4?TH2OwyYG;4(feuCJ%eNCB2DOWcPzN(*@FnQA+oj|TNH@VO$d zEiEnIy?eLvOdB}Qm0=JBPIxg`h_R9EckhnO&u4Zl`R(32>$f^T>jxh4^K~|iHnPiiHV7UK}LG|?9jXW zy~*t`hu>#rl*rsQHOGM*KiY2m%dZjk7ai_UHS=?AZCqp|$DKQ%YRb$5_F8oofj=0f z#k+jCs0jF?zP6T}t;K5a?e)rQZM~Y*F*dAsy{!=Tg*~|siuB8uC>jF7_R|c>O1sCc zm6cF*2(v)Xs;I6Gtqo$dHV;<9qk&sLgx;5wgrrcb7$O0Fe&7w5SwW#E;uag6To57~ zQY;|FrT*O9Tt@LbcOnLI3JTbOqR&>3_qjuYGdB7S6=}0JkS0#Y%gwFgrOY5M?g#q7 zh`a#H^r&``mi2IE=hF1(H>=lOXj<#1>scuZEGfLk-`Mz7e~gX2?p`J(B~4g@MAU`% z{;c3bX5HDU#UjGVU^(EecEZ>jSy1BK+}wcPWX=%J6!R!PyH)^&g@tK`*tv9cbojpj z3m*U%eDUH%v;hFR(L)kHY}N4Lb>KI^5rHbl)6Fq$20y%GNt&Brg?Q_^w3}OHc{wjl zxn8vrNAl~dzOxlcKf|$`HhcRA2N>m=bEBZi@^Enh{cdb+z5cCCe~CoE@Xu^5pbC3u zXTrbZ!I@$+pi5ft%+UNfD!5yEwirx6h=jqNTqiRyG$cZv`TcpDp1#zN8Y_ektk}om zV!e9TRYdr2E=b2q?V%MF70>lzL4a#=UB$Wd1eyqF!mnSyCQ#%ObTzoVHucqjH3<=N z5@07VUGHWMWeAk6rVpG0C@9o2*IoeJI!}l+C;Ig~KS zVL>GdXrT)8a1e!Kg=k}9J>A^)VHg0U%>DQQgghCK!K>xC=3I$@OTTLwY@ouWir2X1 z_vYqP4UN6p)(e$@B4E*PlJg9J@R}8lPy4yLn)b7c`3gmC7%HxQ9>~lDG$IUSQQ@3_ z;3-#Xq<|$Dp-^E;fJ#X5BaxPz+}h6WCSHgb=*h$Fp*KCG?h(Gbg#pll?U!*XL}ZMG zL=!p|eyM(~s(HsCh!liK&`i0=5`8BD&2t;n#aB6W$I>!bf4D6qL`LMmPW3q8GgLT@ zB6pw%W_V1i>R;xT&0{~&);^lkoS-gvU$J*_ygaZJ8SjI&dxqD&iU|xRZQ$Ti_k_KkrNGtCpZ;WwziujA1^L46>f2`dwj&)ZVN{L+iIup3F!K(XW1c|z_#6PdX>n`(`x^H+o1 z3`c-(q@27j(sVqKmBsMk9=grUEF+O&fKSP|0=OE=T7|B? zsVOQWXeQ9gz_A06yRxb2$Iy^!c(rSNQ*Esm!0Bk`4K@xgt_(?kvF**u>S|D;8*WW> z0Z14fzhaA)W@w9TD}GXfPcNzb?eM*xyiiVV!M6XCC#0TrJ^U=U1jumHg0p}m0J83T zjYE2PIF<;xZaHN@Zx+;f8vOOfzb(OC3=U5j+DF4Y)jSdfB6;!SVqzqG_E@xndU{qW zlvzuPigphUCd!tlN4prW6$Pkj5Fi82k){IJ%=crwgjueYack>>=e>3};iDm)I@yC- z=HEK_<;*P{?oj;d3TM;EV_EuWESVLz8YZrNf zn1_mO|`l*OCOnaAu(ym$Y*}5dv*Uru_ zSfyoUDpz8Sm6dKTF1vs=e*gIcKx2A#HcFU>948bDpN5@-1A=(bW;jbK%igv9>>T1_ zSsHu>F_WhdBf=sgsYI`M?HwE>z(i73_6JlG4{F?4p*t7gA=up91U!GwY5>Ifz=}Kk zX}EgSl=P$$-|JkK0mCi$?W^#laFXEIJ$n}RBoK#y;COd;$ysE?(S%EYOcJTUlmKI( z*!6t$e#Z~IN=sZlrf#A-)9sDXToCP^);iMSCX9y<3=9CC0JV`R1nob^i<2cR5s&pD z+OS+a+8Y$QF?5U=GOs9?WW;7xLLt#4BqYe-S10ybG&eVIm5DFf&`Uf|TC&L!aS3|t zW1*WL18h5h=taH~NWU`L`MpWmZX+`@ZwCyAORGm`XCJ+hdfH>aGo>r6n&Xpxc>B>C z8ybG8U50S^*WhJ{ms~{j4h@kZFsRg)w#zEkLAnWko12Lqpa}Q82dIo{jwM2tKf&FY zDdCeY7kZ@5JMe$x>P*WM1UvbC|7^K+m6+&%x>zxakgHC~iHXQl?nmTR1rh%m{r(NK2hX322}!e){4643flFLNftb(l?>`jo zNH-Bb@&j=^A|iq#87IuUzOF9XGZyOj#%7BMbHV%fCVytCK~`FK76AkT^1htnH}>eU z)(PmcC)VHDSU5YY`>ReaE;5M5$0ZRk@beSDL6<=crt$?3uP=wb41_*X3Jp-cYst+; zKn7vGav;xfaSe=)K8Ctu)CAxVyiJMp?a(>{sh>WR(N)Ko!!evG)vJ!|MW zj9lvt9IdT&K$3Er7Y~V7W<3Xom;ymbYb!lR`zJ>Nn&ac+MBdhS?`Sv2w6(N$yv1Wa z;zg*lf9(dB+LJg!GBWKaPeKVbIFg}3=wEHGA@^2d{dR{eN)T#z9r>aA;x_9vg%&zH z7gv+}rUq!`@rQ8`F#y_wg3!8#yv6R?B?L`2E=>;(mX(w|x=0kEvY%@Jb&kq1QqIFe zu<)6o;ap!bC)-hgo2O?D+4e9J1DroIR!O5laWEsEQ=uwDrVBwuOnCZ zJ~}$eUTM^IAKXVXmDX{R4Y#PN&%u^f-g5RV=v5MoL+S5eLcq)#UJfk8ia_Fd>%y#q z8H2FJX+g3n3^T4fSmg&HGT`cb;X&upYmje!_SYWZfNh114eJdKq*HJn0X#lIhNy!W z2szEzn0_Vs%^OVKAJEwjS)-aHen;IQn@dC8+X8zk;Hf0w*C7zdLbV~F-ggUz)yOb^0T|MtQ-=}K@6 z>YAD|)-&BOFUIkk>~TjyFzQ&U#}&OG73kvo=4v84E+tPRV%~*oP_xDOQlluT*J7F$ zWHf;0(S(P?e>R@H=sqUINOi)SU0+>WtEsJRY-sq9mp3svX=!D}W8Bj8@gvXe+qZdm z@cReXpe{Ph06(Dx_8Mb_lQj4-HT9KLJ*d*3;!uW4^7AbrK%w1ntrrJ#8*qv_IY{}F zl@+LI<*k=uNCnnJy!yl^Fx}ofJ2h=C#>Sv3s*~Tb>0jJG1v=qB9cgD**K7Sw6OcOd zjp*&6o!#EX%o+j=*J(D_`rxUt-h`FhbL7(9|t1g6#7Id_#aPVG8)I9zBWzCL8^ejyG@(3+Mg2ab&HnPP(#BN%y}pE02AQGmTiEo-~uhy(Xp#!aH-}l^l;EE znyRVjpRD8+6=7==U3)$WMzG5+@!dQBy%ojZ%XRhj zonOCt`}+P}Xr<2plVy-s0J@qI1L2~hWa=Usw|cZw3%(l8i=WSmz;+NjV*{(0f;puh zoLEl~Un8x6TOveA^E)eNtJk@$4~>m!_zkS@ue$m;IB;)^Wk~o6c|QTy*{FQPIM7UV zbabCIf}Y3jOtPFyb8>K;ou4zVNnP&7fy$YX{|6ZSFy3tWm=oS*~@F8!W;-NEUi_5?L8+V9~vsR zR#vps)unkNzW?}vo5o*^KGV*|7#tkDBir_CluU(%xI&j}qaJ9U9BBsNTe>>NDb6*` zLd{ry!mXoSy7P$VijVepU6Rruk z{Wsv8m$Lk>_RpS~39QVu_|JmJuv;$X{P^$j&JIwwr|VKzMcf#-2npMkcMs@4L#m>t zqADIF(zd42ITrBDFL~A3IVscgh=OlY^Ckk()7RI|2rLlbt!pyHZHh>8Y1BI%d<@W1 z?XL~~`ukTWfb4{W>q062GZ6fFD*)E=3f@0&X!HOw*wQlpIa56TZ{ILAK_Q`r#zvV} zx?Ewazv#rh?}GE=_cY(0W(b~}yZef>$a|HM$GMJ`UFlBhI?VF%GK^6AQ~F zt+3mI1{l2G;b$i&ZQBl@DuZPf5LsMf<9#0XFg*S=yjY{lDrpaBB45%+nzQ;W}L zehNjD^{)=_T2y}i%)!a210E;4-@p*aK>UlU`;U-G+6E@KW|yhY-c^X!C{l()O-;)8 zhzr@%-OUEYo{cShX_8-C&8n>s^$A#_F)@)*pA!=kx3epwQMIofae)4OZw= z!s`^|L5tRL;37swM&2*yPuDn5Pb8U}oAVkq74n6I3|cL>f2}5y#a&}K@4FTYEPQYG zijdtQOt@C4qP_mi98R@f3bL|xfgy*J^B3?b;nfEF`}^TE+PQdiaX>d#fCAky3?8Mf z$w>fo{ABqPWRjvp5wc)_gyw-$yVM&fH;8+JLlIY0*AR7}T8lIbddg&hgaC?EyHt1S z*Dq>HO6-M9Q^66O(Dt^rHn4+&8o2pN8w9>5Pds2X*p!9{XDHvy3XuwH#lZ*?RCa|#lYVkh@`{~u?-z%mNP+pmtm~g3m zMPf^Q5!nC)plrdc090IAsRHsaSqYFm8691${+Ek?|Hj70CncVdMIDYk;w_rG>^XqT z)Y^Y%O6)ayzL^hh)7ACs1J*ipc-iWOur(nx?kRRE^++Geg3rl3xSxVXq=kiKZ$-#n zV=Kqlk`g<}^=4*20e$p*F!0~l*pOE9V7YTgktb!L!NYEIEFYRy*vBA`5ET&tYUd@z zgGpX^n}s+uENs3tfWExh|LW4;`#o67K%LcZ@e{SDVkM6F`ST}`)6TJX4_Kf?LxVXv znQXv`AN%L`Zytj>kbF#<*k1`!YR>K^Fv|lMdcvx%1a#6TUQ=~-LNZ4%02>;{Bu>6z z7Qe|(U)m`Wf{OtqzSg3bSOk!GaAf9l1Ukaq!{bJ1Pyrzc35Ip+$(%E%C3sR?6QZfp?7%*)SjK3z+%5@27$1jmae z*8r+`JyIA`xtRj%mtq=?E_opA_y9Tge^Aj3>q9=m@yqb|aSnNex%j6VL5c&l2eiz3 zCDySN66bY;K7Vas+ep`K`WGkJHTfHp-3j1X1MdVJ*U%J7zgb4it5=03CF4i80Ea`n z`MMx4FE74CT~1cEkXI=!G0_deiLvY<0&Jv<4@_Z&Z;=&uUx7^EA$#2nbOTMgbt7j8 zh>`GtDJ`&9Mia0EU@*dS65axdi=RY4d%=%bRpkRm}|0|54a6WSUYd zy}#TUC@F8jG4le&1roxa+J&EjH=*oJ2s#4JqK8hoxLiMoaPRQ2*>yEi4qU^2Mn0>g zy1}?nu)D+WWQVZ_)u$94o;HSCWzq1nZYiWwMV8k!H9~;fK7Y9G?+B#+#rLlwpCt9K z2Jw2X_K}iBP5$`tZ#du*BrKV1bsGb>?<^ZsE|*{~{dal(*W3!HlSO<#I`GM5g_B6_ zr%!E;{h)^hc32OjKERjJDbfNHlhoC}eV9%Y+^XtoL1k=pb`lW9Sj}Gt=f%-UG=K;h zV=c(D7yRmpLC+ZY$kBX3z;ru1uth+(Ed`p$g9oUh{6-wfOd+~lZ)$6WOVMz;VdBA6 z{pH?lU`9p;eZap_*xLh$4b~OBgUAN_2g`6dHJ&%~YUjIk7Ps!FmwdGCK-=eQK-2m1 z36y0JYXWcjfSsp1DlQH-0)*t>A4D}|>eLksL-KLU$I^UxwEAbh`97GoVt@VmMN}b2 zirfIII&drVG6Fy=D5?f6eowR2P1rg=sgOBW>L@56SXP&pbG10`@$*ygDV`z-2*Pdc z5R5Rshs{ldNNOQ_6A^XrbVutkQf8NxIY5`R^0Y!%++#~iOx<19Q2`bUng^^!j>wTZO+A^T*QeSqBa07|orpr918LfPKKTM5p{{cQ^2D zEFg@>La##e!tP@{xSI5?W=!c{BKx_#eBF^?E?RzCaXp0qNl#CAx!q7w(%;*Q&8VfV z{U$ZlCaI`gE-;eB^2f-+f|}5yrDYh^1fu;!HOY#qDtkLS-@{2AQk>BI{M#S5=jz?U zqp>B)k%gtDxJbyPRWV4|CA6|Pe)c=m*1#m+T!I-mfG=CYV2^;ug~xoPto+rkssqn# z^Y_Mvi2H`RnHdv*>$@1(0@sBHTVGBt7>)Cw9xro%fCV!N!YMEwpUj>;ew+{<9)4LL z9~EWJ#lU6VHgvw85kG{ zeH>sqk!yujO)b26N&)aYXjw)^bofA!LvH~~ABJN5O|_`FX3Ui>FkQ>Rpyd}f;bLz- zX+EC!h4jpb+yHrglHwFPOYrzZqp@yssQLCmE|Ccv85}RCHV0nD+GWsJ6!)!acSv~ zCZBr(Ey}QQ=<4zU1mm`I7Bt}78L;X&ond?2HAMccc?2G@iyMl7FXB8OMyEZ0ZUIf8J9&rN$BSXaHXN>Ut z&cVS~A%%R{`6DM6lMH)7nxWz|LUot@bhdty?j?d6zOcJv#nP>?C8h#iyJ} zLh#6D3=>!d(RdU8-5v0M?HKs)3$T<#2L8uaA}#U1`w9N9k2;7HP$1w-G#<=#Sesb| z8ald)!wt)vY?pMw1{}0b=Zz26Nsog*21)bbV>*RD%-(pp8}RVICmi8r{GUyt|J^Zq 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 04/67] 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 05/67] 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 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 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 06/67] 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 07/67] 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 08/67] 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 09/67] 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 10/67] 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 11/67] 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 12/67] 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 13/67] 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 14/67] 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 15/67] 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 16/67] 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 17/67] 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 18/67] 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 19/67] 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 20/67] 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 21/67] 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 22/67] 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 23/67] 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 24/67] 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 25/67] 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 26/67] =?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 27/67] 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 28/67] 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 29/67] 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 30/67] 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 31/67] 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 32/67] 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 33/67] 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 34/67] 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 35/67] 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 36/67] 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 37/67] 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 38/67] 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 39/67] 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 40/67] 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 41/67] 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 42/67] 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 43/67] 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 44/67] 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 45/67] 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 46/67] 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 47/67] 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 48/67] 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 49/67] 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 50/67] 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 51/67] 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 52/67] 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 53/67] =?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 54/67] 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 zvp^p_(mB9J-4Yt5?vBaK{#%6uJ#JF(Z&2VK{h(O7#U2S6NW8@e+Se&GM#r7CBJb9O zG_c%dQlBPkx@WHXGxNnAz-`LZVM7Sb1=>F^MN`ji!^2`v=J~}Ch70>J-Bc;K5wQ|m zimD!(^JB<`Z%GkR605)8Gu=Qfy|;=~JpmJ$cgxzTAyg=$SQl{-J1{kR@HftC36yd?T27{abyVCsRSo$2h9MGcN_Sx~<>}o!u#nL*_aX9% z!Y|Riv>>0LmU^i*b>BG*70p@5R7Gt|W)PNin!QngRgSkk|Kp6lkvwpU#_y8 zWRmc<&8V^CE0i*PNcJb_VX@CUg{JTWeMEP^PmUmFVR0~4NB?bu;B71S*|0`;$s_RNPia!ZN+RneyOW3^mX3}%#;m2K@oLAYV4K6UnbWwC=CIzS z0K|ddX(g?Anx#2(lFOEP3$FQ&HYcvftB?)ApjS26TdAnR&gSt>f0i|a3^mX_u=Ut8 zY7q;m&+=a}3+@wWXYE5lQYFdCPaTdcv6ub*Lg5qYu6EuzXcvV<#L1GN<|!(D!79TF zm{|{D6?%r}tf8N=vZlOW2+yPjyRUKgK=F6abPYw;B z#z;@d2v`IqNd=@^e&S55Uu!?Oe9a>5aS17E;^y8Pk6~s*7VbM;3Bb^l-)lJgqw4ZK zYm=VH>>SYI%H=+!>ndc>D|pH}fFG>axRey-zS}~FaCXvFdyt)S_c`CwwPfDsA8)P) z-8{SBPIjFI;6Bah3<~r-e1%|#nG(5qmY8QBKmWwpBdRII_C2GDmU?+w+A1lDGqjTp z!nPiMlJ4Da7~4_Ozosq^ThW}dPHUBl8E_o+3mv=3ZoS!e+#w0$TZTHYz-YQxaLs?1 znf?%SGP?5LRw2x=xSkJZlWzF7*J{BWn)#GEzJ7aquG1{0T?DNo+q)7NKmj(Nd)bnt zoct=Y`@Cie-)sD1JPork`+IWNuIP(7wzwTwvl~Z8p=~SN1jt$hZKegaVinda1_gzlYlH7YC65Qz}vYH2Z)U`I}>< znBO=8)_p&70fA&mMU2C0W$4OL@^Hr$LmlXvGrlDg&9@zcQSh!rYp!BH*+|TvQmMZ> zJ90U=Q$P%U!jyQ_KV9t$fX?R#7Iq8=${WMZLWhxEM>uh{J8>JC7@ppLyJf6Gm;RnR zx~4&UO6*b^dAPn3+AbL|gcY53eC4s^r-4N5I!K8O(W@zoAHAJMwR3gy{yZhZr$_he zqrG#$7H1d8hOXgKHNR^?AowaxdET^o(eGth8$I6Wy?C$%1KwB^L1W-@QaX8ScZynYwE5NDAhwCEiC7zSr$@4&%<*Zawr@|2|XHLkB z)b-wJnjWvS7tP_*f--wCSc}Z`BX6dBzYJkx8w@2k_C-S%=+G3pV?1-1`0AO4o)jnHIAQPqJ>){NxQ^9omLo+B zI{@Q^unX#DlGy%^8jcm_R)KPdSKtLKIZ$?VQgn<4%?E9dji_;5FPkH-zFQEsM+1Ao zf!{blRX6M(Rb4&c1OU|s1yCK=(ZauRcKAK1TVp<_gof$@8xH*asiZX{U35dSIvJ|p zE?1F~CAX#>beLeK6fnM0v(j}K9O*2>neCHO`{}~nLFz-MZQCbJ9SUZ0P0uG;tCsYq zyu4+fQWN|_Ai!TE06smzAGvZJ1B_Sg$ef<`{>Rw>B(N>}>+Ffzo3Nhfe?d~{&j6uo zuIE>Rf2=fvM4^Ks02&B`10-(C%IaUSouG)c^WO0bPC4%1INt=eu@Sx)V4ELg2_0NR z^I=;Lp(mgAP7dMQnD{?p#y_c#0oc$MU=HmBzUl@NLj~Xuy^c$jll*307GjXj-vA{e z$a;lnC-bhH4A`PmYI^SF4s5HCvuz|P9{=lWj<_RXe7w(0@`q+smxX`9%qRe6#Tk)PY2j40Sns2UW4GLePSyRgN#Kz@j z&D4Elh?AX;@^CqS*#dy?+4c=|6x?5^(-d!3#;E-H{ize92hIl!GKq@Zc#Eqz((!yp z?rWhD71#;0I$*A=ymb-WVc@S|UOKLpzR8&9FZaS?r%CDupsRGyD|?5X=aGG|<)J-lmAC>*1q&>~dlgu!-3DqsUBk9A*odxb)Nm?G zjX27M`?cp)zstzbO(_UT8#!Ki7>$Z_N_b<8*ZPG zU(V{<@lA6-#v9JiCJhJm3Orn}y_?uHal-K7dMj_m$EHbps5k9l^wDbc=&u zsic5l`FhH-?TB0VeM04@4|P5xt%EOI zi>+ZDJ@3fwO;(ZAj|W5T$$mzem_DnuEkL-UAT8jGi5Ma9E&g`06q%Q$W7uU zbssWBT~3)#4&St8aByaE3G^2c}r$EwYsYRYLKCYWrN7H?#vCll!;^baL*qu z^64XCm=ItA#E3pzS4OW~>8Zi}iPahdAqu5CXNEdyB{FBvY~j(3T2H(>&2b-(J#y9B zcObmXEM%#(`A{k2ef1bU+-2xl39GD=Wwxvid%W_P0Zu0?=V|J&ezjb7&e!$#$zFSA z)?9D*kVs>1C9feA)*#{{=z^&yc4co{-w#zIz7Ci0y#0Eca6T>QC;nZBb!Z5b7%PUI z4v=vnH!-!R`8I$xIgIrD-ZeWRe~}aT_>MBDIh+7Lrq_3FsiTUyB@akW#7LKL&%Iy! z9-|V^{GwXE;x62A;Qvtdof{9;~ynHZlQtqIQmb{{XFk;81*s#+mrBddT_W--r*1`S#lXzX0-7M`-*E4iD zB9txbLSfX+4G76AJ(y6B8I9pj^-A^TT|2I$u=yXGj*dFjcz56BR<5`=HJ_~1bnNe; z)Xt(%M(FiEsf^;c+4dB-Tx3*>HxEvQuZN#Gm&W3KWPf$8U_teZ1?W~-aDVVfLN#;_ zxEzWu(9WEa+#EVKF>=I{5FgVx-)TxX#EWl*WZMtvns~~cBHN?#!S3DlQlw#TNn%qA z7V_Kj%lJNoiqYz@JmG`8parz4rrMbvKEChtB1k%5mwp-ucAf##?GI25;brYqVEE** zS-YQ2vIdHz)^AaPe&f2Do28GGU5seU900uPt$F*HbSmZWd%Rx+|uBnMS;O^yn5#44}N)5ecgAjqARq)I^2_*BN*)m`L69 zXv#sRJg+w5#bqGk-XeHs)>;Q|QdSTlWeq zSsr25r2M5PC%bF57BBg*H&20pa11BAq6dQh#9dt>3}xXecduDUCS$8QT$2gxMIxaw z?eW#AJU{ML&}wUpS2b?EI0qyvEfZVk1np$**jN?=Li9i1?j7CX62sRW@Nl+O(g#^+ z;Lt|%GNVtcIgiZ%?)G)l4Y$wNHREKaEQIe^G>#SR07xoBT7TnIwP*w3$bb(4iZCPe zsHDSA$PuDbiw7x%f)EuSyvja&Ep!Vd8h^rmAD}0KEAt@_uBcY_K$OtcoTPRM?3jvW zbKA7%s1naD@P01Xgi4LswQ2pO#v}EB^ohF}F)XPav>ls*m)_SgDIjb@ubC#aQ=`?0 zC=_bx@AiGD)CX>tJt?5)Ezs7j^5g*j)u7o!%$wghpIhu!&cy9lE;XtCWcFNee{X>B zbv{4lMzdhHlT)@bQ+t?=sFjgUQxk6iTyCsv!CdQB-|X0}`^ieuCb^5C)i_h8`0iDg zaE#i01a@%__PE`&YN4-cTek0*d&B-5LrsiTPX^3Hsw$>{rkYGcR0JPwxHRc(yoO~$$`ZGfemVH!p?yU07H{P;JUpiEUe~~9@z)V4`0oW ztlG&hm;VAVtQs5iCK^8_rjF8D)vjO*zv*i_w3+Uj{ z6p}|12h5^ZGP&*qjCVdh^0ya4a~uX^Ojdv6gtiOTqr5{-{R#crTseaTG)7nLUK;ha ze15oLN&d-9Z{j&@vBJfx^RINj)q#F+4!{Toh$31zYloQ-xj6>7IKp`jtb>-;wLabC z(&}m9=`&DXH+%j{VcKqf@xmK>%Nse@4<%`5L01p=2hcbEIPfGfmqg@b=r0b^2EJ|> z7$IUktt=|adGCC%CDCKVP_Dgp)>5GVjI+6I^59L-qfYOZo}pasz<6b@cA7u+d~3}Z zC{SJpM0oC?YxpQ&;P}WEtGI@<4ft|UDpC`0 z1^x5)#f7glaCZxZgJ`h#7SJ@`FM*J_U~0wz8-b-I2&LYEK6;iT>KM$bHQ#?z*5TuI z5b$pbXs?FWRf3~>VHF7_4u+qF=jR6tE;3BozDX~#2+J>yH$2`Co^Ah`&Er7 zLkC2~QujM1$AIyT3)jzm67~Drl~f0!FQr@bc`NEHNDFh9b{beOBtFVeSX9hv6`qLM zN8&^LYycd6gm${8#(>`I9lQ7DZFxV-`9Yh+ng4Zy93_Se^~{ueO5jw$#<)RCpt8;{ zP-tG2mWxB@wJv+iPwtAFgO#2+iJy!|Pj92f7uZ*2pvi3Foo-K-i9Mtre-T~35v@3>)x;|Lb)E5sh?(-MPfrf| z`l1-^!%IqXZP5Q(*PP&Z7hWBvpoI4iBD;+=E^ z2gJ-bBe-!$RY$ea5o=^5=)*1vQyP?4B584+>Hd{sUfEE!)0@5cJZ3uiJy@MZOI^HG zr1Td2NCxM?=<%Ysj?D~S9}z4-U-Zb&yclk<{aYlvcNn* zdjh-q<~uNonxJwYF3BD$Z%40kXlylbxnj~M%5OzwyDPSsX^)*k=YQj@$rYkv2%(vQ`l8a^C&JP`XLwkOHY)+jz{Omw09YES|D z<0NP2woX=hTH>`vP?e158W}NoN;OUmu3i!nW1g)f8hY)^3>hJuH-t zUA%Z7+g20n+Oj^*up7W&YYFfr3@XYuZSOyV+I2E;Og26VQ60yxFe)JR>Ghed0~(h! z&H2ZJ_q62w-Og#q&MMOe=pY?Jt}Y2TC5SjFJWPEG;o&cWaB;P8p$i_3w^F>*Zn{WbyDjU+>lYW6!qLt*Sz+{i zGE-@?wzw>7%Bn_BWoaWOxQN~MyAn}!`ify?z_xl-q>G6tV$-{!^5TACM~~XIhPvR2 zJaWT3nZEEWP+mOmTVIsj<1jB|Op6a|G%10+H;PXu`MVc0{{%#sV5xlf=IpZn3q|QA zy6F4MV*2xDf{)*QCm(;lQaD!pm9xfz*NR$Ov%}to zn;btn8&FR;JX|}fO>!i!H=-Iw-pO+?-n~Ty zYMt)A_HRx)t_Nsi!^2yiAktQOAGi~Nr$Y=UzrZ$ZHeX0T^ z`|}iKMOvgD?8J%J!nIhR)kP-I}Q&DthgL5lMNd!WJWi-lE@m*&tQ`+%Byy ztwk;V3T6Tzbvqi}%2Y3ryU_~_x4-DdXsBA7{KO6Mlrrn8v4MwsW|tX;svUcCyxVbL zcDu>*K@!#k^E>JH4TT2R$Iu;}w$&J2D5xja4nt2kb@|uri}dcO_9+kHFdnCsYxSq^ zS7BOO_GWyHDhEnSAu}q1mat5^fV~}VU!Z$TO(X#4L98^`$m`bKz@f_2$Q)`2*@sHaaX&OqeiX7l%XlZ zk($&ZR^|rII(hIZS8-*~NhVr(L0QC+y+vj@jjf&F{S*}d-AFH&8 z(zEwl!4jFFiK}{SmqBv}5O4~_H$CQ9BHX!l=ft-5oWjVk?;vM&j5e^AH=*%u!<#qo zrcrKqSWLyqpcw6`EcxtAezTlaYbjGF_)e+$V|*EV+6a-b`IVHjO0r)`zG5*m`MJ+6 zT3Z`i5=Nc+A(NtUagJ5r_xY0Q&<2G@Xs_*O>QG|`hs_}A8jfFw{K8zFcg?>(W4~%- zuez6Jvp7`1Kw}H@Kdj7eJ_iu>VRAV*vsV{HamP0_|2iRGJl};Nas+@QYHYdyX17Eo^Eec1N>PjwE)o{GApo^2; z%W4HSwO5&URZAq>^$!FmFSj+-3IOKlXPB-{RQ8)!WZ68o@FQznRx?Qzat-Ywte@*I zmt(YQKa6fiyl8(LP^KngBP-9IT{tX#U|R%ls!d96KRh_Ww0O!)buK?bC1TSZiWEzC z>EFk9zf9JlwB4gB4~(%qGJR0bs`lhpZGyNUZ-04%U3*k4YYsLT)(!8vU{_&kij@Dre{08zr#0_iKyE*AiL01`HuLU zlvwglMCLf}p!33OrA5qeqOtQhJ9~<2bh7pfS^DYnQNEq>g`-n!3!@MM7f#}>hSCkT z%5k{gKei+=@?zmxQCV(iC*GEomIltUA@!FI69o13KFkqaVSmm;c;YWwO-#^p_0Y?MVPN}=)HEnGp~V>EWR6zZy-yh;tO4w zBn6=Yyf8J1ShdfMR~&{3=5WiW+4BmReI-@yB#?;Zu{O`(U`txvx0y{tE$s5cRUtsY8)2{1S)W1gz=r3Gv+TiUYZ5Bq!%*{=j&VMbRG)m7lurNR5hz4sj2HP?wjVtuG?=&Zd zW^+y&nDj~;XgD3{FaVNW__?J0_$=8}Lv~U$-3AbZnntpE=6)*u)|Tvx!Of6OnZ9K( z?c=3>!|5MD8HB*Zp&?9l=EO&gZbSbdnzDauWRQ82h)C#zY)xS1^CCghLM77Ftnvo} zkZUiQ?S4I}vqBUhg0%_t?Cg@cj59@+)8cha{nh>V!%bwV58}1FEYkyHrEFM?o2JF) zTV?%=>dPP2AbWgsO$}d+32t3gY*8hNsYhy#A8qFSdQ$n^AG%gw>f%}`wiMDMb@Gc_ zo59E1O?>)A{XgJX%I`IbeJ?4%^9h2R!95yyKX z0$?9%E637zWV)l~!X0%#NUX`{UJoR|;>!vB)cu5FQKV7uug+zy?Luvp9 zm1h#cTe9JXO?=mWMz50dkG9M#KPoFZs%xsNLL~)V?s%;V{>YSmRJ4IG1rOrg^AmcM zp+B9LmRNqtdC4qx^;nTQqzoLV)AXp;*QD&D#wR1{cuoFN5#Ev@4Nw^V@!@zW`e>I) zb4{bzr@*vS!6#qkY>xb4cUUxn^`jE0vU6zZ{GKW4WUD-Nrd{E6M4F7U- zq=ourAlXpfx@^^KsXd4i!kJ$ett~dG?DLlCNXjr%kjI!Je;k?l88w&x7$#gd%A=Hi zn>3-QyyPN7Y?UED0nQvfYJJ@AT2fp;O*YiO0c(7dyNNH(zVrTZUPHZ9Sh$R^D7~Kq zjK25!^4T^~1aIkKy7k0Fr4z=MY zTx3b`e%ggC&GUPLemFxBjfC%7o=Hqxkg2lSPS?sJ;}= zzG4)y(YLAEVd)*+gJs>?hIsH21p@`K&yZIx-yrQx+(FhGl484eG0%~wV@WQtU&}6L z;e_!MCv%j&TLb1qM8RPM`o)h$fs7Oy<;S!Uk>_x?y!=D*Z=BXpnW6BZ{MUT(jEBaA zc&w4m4_(|gL%W}Ao~KCox4CT2H7vWr{KwB?vq@__i`8>>j?m9x-t7+ZoIM%FEk@(2 zpXOX7b?_vuEyjfBA(AsT>4!|SUg!;4$WI;4moS#;D*OC%%Megzj0_i_Btr-E~U^=?T}NV zK%GMH=l-n^yaozDvKOE!?8tv@tlJ=-&npT`u3J&hI5!aoq_P&h`**~CR*2e(S`_gd z9pcAWbAdpg?^vAsGk#-JTa%PLsg$0sb<*Ab?pqKkx>v4hxUI3^DBx`Is7lpPp1z$B zsmy;n8;3%kgC&=zBvHC$ak<^JWcqVj10dDOEQz$ym=<+1GM+X^*6lPofdbN;Erc0z z7(9N6mNn6SL8yPXx<~$L)OR`AW3Jh%ZNW&>eyXRMmfNKInabEK(-#jh^T?w9MEzgg zYu6tnwSNF~!Q8CB&xHOt&i=E1T3`Y8Pb6j~G%H7pRhO!m5VNcsHHRG=Vh-5#-#EPg zYcus5XXxM5J-zWaqcJi*bkn*S^$xS3I5R_C&=D;`1ML3sq$&AZnU!qc z@|OL!$-!^OL*0y~S$5wXyot(h+z>k^_LC8$=jc1}i_y z`LtrRXm9T7dp0+zAKh7;S`IR^{0%r0-B+x6SJN=?a_;>L|^&E zhrzozCVezkR-L?ren~QcrePA@akpN4izwsvYH;w1=-scX7A2=OXZsXLtK`xfv1`AT zuv&Qs*z(0atDT~9bUKKcY1IIV-Zr1BoKQ&|*>_ZFWhngZn>Y@OOFQ8ln?AO4-pf~p z{n23P>uDD(i=ucd0^ zfuq`*c>RI>o@8_Vv?|eh>`i1VrRa|xb4il0GvDfQE{g^jjU`m#0If4 zH7C?o*W9r;a3mDk98IKcI$%9xG7%ZCjY!n@Y+&W#8J z{$@JzCQaF0Fy9+$^~QYGs)c-zG5HRT+xpOV{U`2yH;xCXPN?F7Ap$l8pLLt5J}YRX zj@MbmZAWVCvm8?R#rqtlsEreXHMaPQwvk(@_f7Nc-WANd-tSX=0{)ek=5KqZ(bHOA z8WiPFxqj_(e8fHB*(QFlD=Wy*n}Tv=YkgCqVw*RhM-o$ZOZOM_OQpnhwrQtW1V<8& ziy&g3ErU-?D?x?Y=KjN;&&dG{wW$P9u!y%4&AiJYXB@A}oX%Ozq@VWe zJUi!x6~{O3taUF{rqUIQDUV;+;p(pWfG%N&aJ_Rp=kbKNRLV*9Ae*?8Rrxqq%r^431XnT@o!XP-~6K%yGci%?NUHZ*fsn@pBu>AP}fsa|r9)!FO! zlIcMa2?|I*`(*N6>b>kIrwDHFHgPVA?xbjf#=u8}AV*_yGikZIY z^HH03RiRS{tv@$!So=q+D2_Ohk1gfBVI6b$#mjSMSo+Y%@pUfG(Ch`aa4dtOej4G4 zU{P=V;Y`h^wqWFK5HQ8rtWs3om_UAkhsi#Uxt4pCvbPV6yto_B)`k5z9hUX-Q!5oB z$)8O@E$n;>ag

f{(J>23OcG*>lV@#<-zbGD|?hVJ&%)a63qGPp4Ggp6{$u-ATK zZ(@G9#BRkQ0<-5HLgAlZeN^+!G0W{?nUbC)R|zSH^ezJ5~mYV*)nQmGV69bS3DmaXI3j|FGrF^U|kje7FwT8pIH+a{{`7 z9vc&Q1*#T!y|S|@;B9}qYt(Fza6WcrS?a>z(L3Sqm3BFCmcdt2Nhxhq9py6PY{<&) z^nhVwzv6O%_HoCCyD->z!1!ItzN@9@74Vj?dSqh~U-1Qt*C*Y3; zIc+WA;QSjW5y#-qY{=G-bPbJ7m*3<&iEfE9GzQAlW_^uaRSGVNO*+$NWg92zy2q+(J@9#^DC7 zDesH1ftNDL0eyLC$rB&8$pgzbmMtHis7ZYYc|rDhqD~C9^V@ff~H$HUs^=I!&B-K-kn3);(IypIqsum=6 z<=GRe3CrN{MWwDwbPeRjE35-5eX{Z%TMt|tiG!oLnF5g8g|c=TX8~^TKk5U9Q@{S~Z20G*u&{`712FZJ$&cDpzK;95 zH|uV3eN$^VN&(NjWdGPW++v9=yN4R}Q}j7RJgD4TW9n=gU0z*@ zHD?=h_<4a+CZ+L-`}t*UEsT-^SXz%DvXi5uyQTwG_l_r3R@_SOX4OL3-rx|q&=F<= zIvo1Q5jo|clP?`rY(Iv6J~dMNz@tXZb1TFP6(Y&#tK&D`YD@kqEw|8u_1gW~zk$&Gr43>>F^OsbbgU8PCcfI*qM@A;!Rpa0aF5>ojd%VOK7e^WD zciY`SMBbczJSW)|_#VWj{a=tr{yU54WgF0D{Ex*0+K{#S*W&RcyCD8+@$CMm#S@K% znG%^XK;#-GbL6-h+ouI{zJ05mtk{U1l{8g!_4Fw1`}xeVGxhxw9LvZv`y+r@UG2hX zw?anRwmMF)zE)K@kaGc_csot3%<(BZG3n_|{m(TYzjFBV&@cXy5m_r2>XM@mlb;w} zFa*X8O_m1T`Kl!OCsleQxHIZV0O_P+MjEeXowmB`o%ZHXD%FE%HM;cg44LN0CdtQ) zw}*iw75M*K*6wedpZ^e?`Zu1#eR_;lm^A}3Qpxp8fYWoDb2&G6cYraG>nhIlR&R>Tq@AvZ{8cdv&D)zSJX@iU z4}4vM91#H38DHN}A074*Mbhe;DfD_;Fr??)On6x4JCRm%^QGd5)}HkTbaryXpkwX<`Lscy=m{*cwCD6+{V+u1qHC?^#7B zF}^vv`HRHaw|82Np!vy%#E2UY1R7WGxcQ~@0gJSzofPPv&tR$SyxZ?Kx3*5)Op=yv z>9o!kE3^_qXI;>@e~zj6;~17w5U_($#m z!pCiZ(D5CBSf(XXVVDqpfPe?RB*D?Ipn;#q2tdTVnaX>ptH}#Y?B%TBLZ5DQeMn$G zSZs-%VbE#fYAHDeMX%iSU}14U?nxm=_yrJ~bs2O{pUY+igZ*3N6nMYtSPI^hxhp&y zm_znHgRc$M(IqS0(;O|OSbLuOWq#-BE2@uU&jdMjT!h_^Az3zA{bDUZ26_u&M#e=# z=yF%=0$5R5D6873s3-v?_`-0TQ}-5Sqj|N(ZL0S~ICvR#e_np$|0sg<|EZDrZwws& zRWSN1n4JA%HUIT9T>s-|_(w2#05HMu0F^HL(^u2bjR!WT&}+i?{CXcSrl^coSYr``;ONpkyq;W_o@{Bq=*67(mS z4F8WHGcQ9^wD5s`-lvGQm)7lX0di_Kz$px%MM4ALAoZfeK%^!Prd&q1DjWsxycj}# zW2hR$4S#%AaSuD*anBP(tF~sMcQ!IzIA>1)NL9O?1R%y-6j-J{(e7?;}m zH%HSc;3xrHekiXY<`SJ=j5b@V+z&=kcKNy>I9Xy_UzM2{sXH`iyVT2X4%5bq_EaoU zMRYRWxOsY|dFGh}j4J&3h15kWMdQIXnl_&nYor-$2RSlS$K4fsW@3jTk2>Nq>1yK$ zAi^`PiU47OMSof}#&AKsvD%^X)U9pt<@2~2P7`XapX}dG3nBLCxh$|+ryPF^@_Htz z5>9s8?#IfaotAW;OtBStsR-g%fU}aXHnGTbQKjgt9Q$q+y5hL2SvR9Ow8_eeWM-+> z%PnVq;rZl! zAGMpWB1v#9ehu;UL#$AKrjr=%d~_@crFz4ZXC|FpGgEX!f(9dO{2gnGfrah5u+%sI zT>d;K$!)5BGz)w?q8y@G0Kne`aahUT3iWCFtb;Q=C`rE5IiZW>(tH0+ngy!)3mgj_uk0=btM3{m^hzLS8QKZ}5 z&9j9hm3CbY z;JePj+S$?G@XC9(Sb7m#-;6pZ7nfBsVq=qCF5SctP0={d$1830FQa>y%6c^x-!&dW zTq_rTWm2|_g5yb~<_sH+NJs?)`(FESv^S=V>4egf`z-G(snFrr zLv5oF%w}IV4uOgpL;YzVcvQ`d8#_>+(2LSuOJB}9Ymku0yk+y%S|xSVcnL;Lp)%5^ zw`jDzUa4_<8Y0S7=1O1Cu&%Dq56cKy3qN7-Gr3RfmExpo9j|KnSsGGG_p;!A3NxwxGcj5`jdjq&NNJs9nGMf;*PoYRrlE^~XaVpr=sYM(8%Uu*3(!Q$DZQiG7(zp2U2v1y58c zrN+o(MutC*|lADTc;gm6qs94b^G4l6Z+#W3@;2v!?j)6#~*G4 z9BGxg$7J131t{2EaTI9Hv$APVf8SxPSto;#&CKu>2O;rM#th5q7bX(Y-ySM`;ov*C zooz>^=$D>}phMBXHG?6VxpwXMCS+KhJROPz$}7Z1wO#|h#s&qkk1bxXM&9$GH{ig- z!&Ut*0kS2FN;!Y;B)X7E0w%&zM46~(MGB~%E;tYi$@x5c`HaKA_v@G7k1bC>dRxMq zKv8CRt!!|i7<$2~BC!4V%gN>I(++Znl!FTAWb$HtN4EOJue#hecYf+T`Q)_mtrx)U zl;4;6P&&Pp!5+{^VE9)e$UNwt)Kgnv)Y{FQ4O7kW>D60Yi;I_}xPzSq0;2rbNoFb3 zLEzdFnZ~!t1+~T*R)x}CH}i}Is;tmaLfmm&+uXh9XbS_PQ0p-yMD;9 zI1DGb^JqM8*{~tq)16_Uisv=Cl1%j4te$zVag7s>7Us4DzEg zyskK4m<+ZSuk^ zlA+-X7RShnva<~(3pN9{T)fGT9#UlUW^m^g6ifH0f6=do6`QwWL-ym=v$K`W2cD6z zyQ_5dPd_Cky5%((pB!s41pH_hn|55El;JxgW-{M1^B3(UO+FhQ$cmM$;EtzV_S6Hf zs>E8}rfqT3j)ZoTD0H)s7N}HWWr_FtCO9TNq`iM|g^t}gmRWXGxpk!g$$xzydF#E8 z=ser?=T>F!(r3wMu#C(SQ~d?A`S}GIUF6cm9=*m`csXOd+Ggogm#O+Mc2k3(7n?n%-HjkkNEaX;6g3qA8N zVAK@2Mt#O3lNb!@_6ps5m9fbcsVp*DZ&?@YSDdJ3!S3}l^z{wCB$Q1=0PYS}cG5!@ zYJy@eEJu^>ur)MJ=ck~`OgL;f^HQawGhOpGBl}95TnCZ;{bs}vY1I9_9#h7N01kVp z+Wgg|?f3_};r`n*`^GX{vd}R#($-?`w8~44mVFEAj{$+7ogea8JuGu;tUOSsL&HhF8 zPLi+!2dB1Mqwso=JS{s_F#sJQEmybEQyQq`o>46aCI_wAyavZbv++WK{MzUV(A{F2 zuW^jE)s$1W>rSZv_a!zprT=;h_2s{#_KS;J!B9nR?_-(J4n6^0wB-={_<{aBSB|$| z8+UQ==Riox-ep?UHipWtCx8zbP)b;uX9l*QKL5nd^D$3+0DTAV-Hd?k|Cy~-W9@;DrArrC9wSyRY9+0Kiuf@j7+?*`lfB*(~F zWv|#xz`FfCLX63JQvRPm)u_bt2M%4>GDW<+C9|4xmAWb$a*&8r=xjDEwByW2B!`tb z9XM^$f-TiNbd{L1g2*O6JYXicdJZPmM}qdJP}B}>_AuL4WfbY0apYsx{$$3>^pCH- zoXf;-xc1x6UDwDET*o2D;T=6bbr*sR#>kn_49AVYR|2!k8{hm_G4sc9w6vXj8FIlW zu83T8n5vVI$&`Q?A5FX@J?wxgUL3q+sl>ZTQBl(U4M2Zuj`#)vU^2z zMjfn3yPwAWqo#5{^4hPngfQL~P9$4t0=3`j&-F_BRu|Mfj^pX#l3rQItiK)GV8u-^ zG20(5nTG}R%aKoUJA}4mc12F~CB@e~wtUyhn?|9mQFn0fJL3F6A}76NWEm$YM%g@z}rY+YQmj3mHD_>~vzo5J?v*y8zxvj4WYH zX>X4GGA}A*^J+o=vF!)%(laHp#MersSMJ@>PCF@=hLJb6N9Aa1&@s$WYx)8nB=-H9 zQ*sY>SsdzvdW>w8SnQ6LZ3C}&YigYu@e+=G=`AzJ(ZLR@EvW*0-6?eyx!x$hE3XFv zOYByYo72?FZfkwt-z?HettPUk=}n2gdV9-6;arO!d) z-9hnk7jLGj3$=>?lUn&NcoW|@B7ez|K!nj@$g3_nK4ktd*xhXEurlT>!7WZU?c9CQ z{c-z6>bY>*{SW-3^t@^2ZIhAwg4U2>V2=}+Ni8E=fv&$&LivYW&t@0yAQu42xKB)h zJ&v-}qTzMYjdD8|W^|975%sG^rqu)!>jb2Wu_oRB)7`a4L%FZv&!wbXQlpUVeu*Jn zNUmclLoN+TDs4k{qS;cLG)X?mC8JCtI>byaxg^uYC6tkCks_J48BF7ziDqON%zSe` z?X%C?XRWi=Ip^Q=-}lFFt#AF_-@BgmuJ?VP=Mgl_`sO0B&*%}4teah*_cDHY-kZI} zusYK<2K)^p)YeZOh&$(OKj^qgA?T82Gwxct05xouP?h2yBx_DyE7*;dXCA-1<$ZcY z_wzfWCg?p$c`~N0QC$cxrSGI^(-1DrLy!itNksdfp7126=<^q|9ZO!$&iGs5gU%t6 zbyxLoKDUUC4yEQ52++&hzeEXRbkf~;`l1xs6CvUFAlJy*iiS=DKNYtY+3W80i(^lH zvPJ7>PcA!=$BJ`mfp}vT4nmsm7W{Yf^&rj^< zW*_*8PRa5)kS^D70zZDT|5|h__mb|lqjl}E=2ws&bUu=_PU!P8$p;mXr!tYyHMx^n z?p)GrRQt=3cNl2}Mg51IvaOH9HH`@=pM8>aV1Qv%eoJiF-FLe8>UPYK_R%oIpfJ;p zEFJs1p~Yj2oi9=^Mu&V}N8TWy9^y zU8Y>W>XJ3lME&hz#|WGLB!DtR2yDWwibzr64;o#NKR^|tbs76gnzd%N4kd+eTNl^) z>}q$aqLW$kBY0iRwEepM7J-HN&E5LFU;S$u?sm@WC%9;9dmlFGG6d91_!iTLJp;mb zHN*Ur;{-9Zx349VGaAH48fCVbRpvmBwfX=$a=sS z=#pd1jI*`}Lf=6b)*=d{=XOeE66}j4f%)xy0|7muG0H*$p zQQ}|gf*;?BGaGFK_CLj-mtX&0T0)U_Tyr0DP9}Us%lxk^SO5FB(IY+lLZK($9GEgL zU&_ptZDAyopBB|-fV&P?*!r*u3I;rljHDiFpcqgCKIPXkNty%$O@5v+Y$#M2HhQL# zyg{fyyNFA~E{z~yj;L|4)WiJei}r>Dbj;Y`S2F*-`|~i-?ffvJh9+vtT=W~bU|zdf z4D6MJiwop+)P~UCV@8@9bkd>00^Il>Yr4nOzT` zz+~6|WGbV(lRD&Y{~&e~F%Hk%;}h}e9LCPi0hR0ZoTr)eSvBY9UO47a(=vRDyftz) zZVSPFM;6aMUErq;Re3|Y1nnpSu?JS1&s(_&nxc?T9Ayq;<56+YICg0wzy{PSArGHU zx_AFea38y`RE9o$hX8z`r8P*8uC?9mrwC+uAGU918k-%ipleZ1nn?|jKoG*mY~ zgjyK$hJtF91wL$(aaUa3 zEM35Pb?e5P;ao#*{XXH%ovg+@#5IxM%`-ITR^ODSB{?wMtwxh8;h_37+L^m|4i*R? z^WXTvR5rDnuou8SRaa&$ij$XX1Ae_j(?~8d9DEWFHm-8Xz5weHA59WUd&n5GHomY0 zKlXFHz}lh?)SQ+Piv7!R+7ek#K*VC_4xfO+evV==&75^LxoQNW_6G}LiBwA1b;~ZO zppo%?DQtTQoCaN5JZkbNJYW92<^Gp(mW~+Ew_qlC_Bf5XUj5>rjuPq(+1`RUuXYnr zUmlczg%PZ2F!^@P8@6bJ5;WLC62?|c5drpF7NTgmlq~?K<6+pWT4nJl#>njwz49`+ zG*O%mzns;NW3(qRx-O{8BPt^>AN+`t;<&s#8>i+{AH?rr`K-{NTY~`QOdPeuYA@ zBsMl)hV}S6igl9pu0Cq36e)$B6qokY+~&{~H-|nZC`mY?$UkmTCel^z>2Xk1BH+-Z znUKs82rzDmGRPoDw!!>(Kskm8l-2zi>BA54XRXn&cxCLzN)IV%PlYt<*g-}?KB)t? zSlMp(=kkFuvYv1@Ao#RnL_pk{(qM|h3BuWBCsV^j>i!++>4E3gy&}(Jej{@?k^;TY z+Tym|YrtKPaP7prv*jGNT%X3dvn6S`s^3eWXtjBR&f^7y#5g0Xg(i&*CHo}~zTBou zpv`F+=MXxZF512tb~pXryEz21n6%DHm_u?M={Zsp6&^Kv?VqCf2&vg7VYR^v7Y6P-N5;CE1i85QzE_36wW)1#^JZN|>_ z8Uh!Cj$nE-)K3J$geFvp8AhH_@2GC&p|BO;C=5&1SP#i#LO@RLjcMWSs!+I3&AhSi z0kgtxz4z-m4q~}FO;NChqHqSAY_Be(Jl_-80YQH-jbIvoE!$@2sGUCA1N{{s2_mn8li>&sadmD&Fd( z5>dvHGDX07keg2UfaUwGy$W(36hTV82cPlOu>2Uc587fNX4VOEL00F-?x9u+-O`I1 zt|^M1-J#8&ckUJ*%m`e@?oS#tQBPZZ^K%tKqNO68w+YM7GpQj#wIMvxL^e)<5#kM( zSn5M&PkkLw^DfiyyXq0laFK5zD|(Ko-y1cji~yS?kYa$!JMz*{)N%?pieLF(rXZxK zgIRIG?s&KuaJP`nS*$V^ZsV4U0pCzP7XJe#Y#d*eA8WM+QYGw&nyl`E=KTBWK?%Vj zO@5SVnMg Date: Mon, 13 Nov 2017 19:52:12 +0800 Subject: [PATCH 55/67] 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 56/67] 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 57/67] 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 58/67] 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 59/67] 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 60/67] 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 61/67] 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 62/67] 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 63/67] =?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 64/67] =?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 65/67] =?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 66/67] 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 67/67] 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]) ]) ```