From a086de61fe673eba97320509aea06f678867e14a Mon Sep 17 00:00:00 2001 From: zhang <360586201@qq.com> Date: Tue, 27 Sep 2016 21:54:25 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E4=BC=98=E5=8C=96=E9=A6=96=E7=AB=A0?= =?UTF-8?q?=E5=91=BD=E5=90=8D=EF=BC=8C=E4=BD=BF=E5=BE=97=E6=8E=92=E5=BA=8F?= =?UTF-8?q?=E6=9B=B4=E5=A5=BD=E4=BA=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + 1.md => 1.0.md | 0 10.md => 10.0.md | 0 11.md => 11.0.md | 0 12.md => 12.0.md | 0 13.md => 13.0.md | 0 14.md => 14.0.md | 0 15.md => 15.0.md | 0 16.md => 16.0.md | 0 17.md => 17.0.md | 0 18.md => 18.0.md | 0 19.md => 19.0.md | 0 2.md => 2.0.md | 0 20.md => 20.0.md | 0 3.md => 3.0.md | 0 4.md => 4.0.md | 0 5.md => 5.0.md | 0 6.md => 6.0.md | 0 7.md => 7.0.md | 0 8.md => 8.0.md | 0 9.md => 9.0.md | 0 21 files changed, 1 insertion(+) create mode 100644 .gitignore rename 1.md => 1.0.md (100%) rename 10.md => 10.0.md (100%) rename 11.md => 11.0.md (100%) rename 12.md => 12.0.md (100%) rename 13.md => 13.0.md (100%) rename 14.md => 14.0.md (100%) rename 15.md => 15.0.md (100%) rename 16.md => 16.0.md (100%) rename 17.md => 17.0.md (100%) rename 18.md => 18.0.md (100%) rename 19.md => 19.0.md (100%) rename 2.md => 2.0.md (100%) rename 20.md => 20.0.md (100%) rename 3.md => 3.0.md (100%) rename 4.md => 4.0.md (100%) rename 5.md => 5.0.md (100%) rename 6.md => 6.0.md (100%) rename 7.md => 7.0.md (100%) rename 8.md => 8.0.md (100%) rename 9.md => 9.0.md (100%) diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c8148f0 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/约定 diff --git a/1.md b/1.0.md similarity index 100% rename from 1.md rename to 1.0.md diff --git a/10.md b/10.0.md similarity index 100% rename from 10.md rename to 10.0.md diff --git a/11.md b/11.0.md similarity index 100% rename from 11.md rename to 11.0.md diff --git a/12.md b/12.0.md similarity index 100% rename from 12.md rename to 12.0.md diff --git a/13.md b/13.0.md similarity index 100% rename from 13.md rename to 13.0.md diff --git a/14.md b/14.0.md similarity index 100% rename from 14.md rename to 14.0.md diff --git a/15.md b/15.0.md similarity index 100% rename from 15.md rename to 15.0.md diff --git a/16.md b/16.0.md similarity index 100% rename from 16.md rename to 16.0.md diff --git a/17.md b/17.0.md similarity index 100% rename from 17.md rename to 17.0.md diff --git a/18.md b/18.0.md similarity index 100% rename from 18.md rename to 18.0.md diff --git a/19.md b/19.0.md similarity index 100% rename from 19.md rename to 19.0.md diff --git a/2.md b/2.0.md similarity index 100% rename from 2.md rename to 2.0.md diff --git a/20.md b/20.0.md similarity index 100% rename from 20.md rename to 20.0.md diff --git a/3.md b/3.0.md similarity index 100% rename from 3.md rename to 3.0.md diff --git a/4.md b/4.0.md similarity index 100% rename from 4.md rename to 4.0.md diff --git a/5.md b/5.0.md similarity index 100% rename from 5.md rename to 5.0.md diff --git a/6.md b/6.0.md similarity index 100% rename from 6.md rename to 6.0.md diff --git a/7.md b/7.0.md similarity index 100% rename from 7.md rename to 7.0.md diff --git a/8.md b/8.0.md similarity index 100% rename from 8.md rename to 8.0.md diff --git a/9.md b/9.0.md similarity index 100% rename from 9.md rename to 9.0.md From 6588fbb3e167bc5a3d3caa12763d425183e02062 Mon Sep 17 00:00:00 2001 From: zhang <360586201@qq.com> Date: Tue, 27 Sep 2016 22:01:22 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=E8=A7=84=E8=8C=83markdown=E7=9A=84?= =?UTF-8?q?=E5=9B=BE=E7=89=87=E6=A0=BC=E5=BC=8F=EF=BC=8C=E5=8E=9F=E6=9D=A5?= =?UTF-8?q?=E7=9A=84html=E6=A0=BC=E5=BC=8F=E5=9C=A8=E6=9C=89=E4=BA=9Bmarkd?= =?UTF-8?q?own=E9=98=85=E8=AF=BB=E5=99=A8=E4=B8=8B=E6=97=A0=E6=B3=95?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=E5=9B=BE=E7=89=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 1.3.md | 41 ++++++++++++++++++++++++++++++----------- 1 file changed, 30 insertions(+), 11 deletions(-) diff --git a/1.3.md b/1.3.md index 83b8039..2f6a75e 100644 --- a/1.3.md +++ b/1.3.md @@ -6,31 +6,44 @@ 那么两种init和两种shutdown各会执行多少次、各自的执行频率有多少呢? 这取决与PHP是用什么sapi与宿主通信的。最常见的四种方式如下所列: - * 直接以CLI/CGI模式调用 - * 多进程模式 - * 多线程模式 - * Embedded(嵌入式,在自己的C程序中调用Zend Engine) +* 直接以CLI/CGI模式调用 +* 多进程模式 +* 多线程模式 +* Embedded(嵌入式,在自己的C程序中调用Zend Engine) ## 1、CLI/CGI CLI和CGI的SAPI是相当特殊的,因为这时PHP的生命周期完全在一个单独的请求中完成。虽然简单,不过我们以前提过的两种init和两种shutdown仍然都会被执行。图1.1展示了PHP在这种模式下是怎么工作的。 -
+
+
+
+
+
除了提供隐式的内存清除功能之外,ZendMM还能够根据php.ini中memory_limit设置来控制每一次内存请求行为,如果一个脚本试图请求比系统中可用内存更多的内存,或大于它每次应该请求的最大量,那么,ZendMM将自动地发出一个E_ERROR消息并且启动相应的终止进程。这种方法的一个额外优点在于,大多数内存分配调用的返回值并不需要检查,因为如果失败的话将会导致立即跳转到引擎的退出部分。
把PHP内核代码和OS的实际的内存管理层"钩"在一起的原理并不复杂:所有内部分配的内存都要使用一组特定的可选函数实现。例如,PHP内核代码不是使用malloc(16)来分配一个16字节内存块而是使用了emalloc(16)。除了实现实际的内存分配任务外,ZendMM还会使用相应的绑定请求类型来标志该内存块;这样以来,当一个请求"跳出"时,ZendMM可以隐式地释放它。
有些时候,某次申请的内存需要在一个请求结束后仍然存活一段时间,也就是持续性存在于各个请求之间。这种类型的分配(因其在一次请求结束之后仍然存在而被称为"永久性分配"),可以使用传统型内存分配器来实现,因为这些分配并不会添加ZendMM使用的那些额外的相应于每种请求的信息。然而有时,我们必须在程序运行时根据某个数据的具体值或者状态才能确定是否需要进行永久性分配,因此ZendMM定义了一组帮助宏,其行为类似于其它的内存分配函数,但是使用最后一个额外参数来指示是否为永久性分配。
如果你确实想实现一个永久性分配,那么这个参数应该被设置为1;在这种情况下,请求是通过传统型malloc()分配器家族进行传递的。然而,如果运行时刻逻辑认为这个块不需要永久性分配;那么,这个参数可以被设置为零,并且调用将会被调整到针对每种请求的内存分配器函数。
例如,pemalloc(buffer_len,1)将映射到malloc(buffer_len),而pemalloc(buffer_len,0)将被使用下列语句映射到emalloc(buffer_len):
+
````c
//define in Zend/zend_alloc.h:
#define pemalloc(size, persistent) ((persistent)?malloc(size): emalloc(size))
````
所有这些在ZendMM中提供的内存管理函数都能够从下表中找到其在C语言中的函数。
+
+
C语言原生函数 | PHP内核封装后的函数 | @@ -131,6 +139,6 @@ void *safe_pemalloc(size_t size, size_t count, size_t addtl, char persistent); ## links - * 3 [内存管理](<3.md>) - * 3.2 [引用计数](<3.2.md>) +* 3 [内存管理](<3.md>) +* 3.2 [引用计数](<3.2.md>) From 73b700610617eb5dcf7d403be81814fa5f5a9457 Mon Sep 17 00:00:00 2001 From: ken <360586201@qq.com> Date: Wed, 28 Sep 2016 14:29:50 +0800 Subject: [PATCH 4/4] =?UTF-8?q?=E9=94=99=E5=88=AB=E5=AD=97=E6=94=B9?= =?UTF-8?q?=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 4.2.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/4.2.md b/4.2.md index d95091f..82254a0 100644 --- a/4.2.md +++ b/4.2.md @@ -33,7 +33,7 @@ Orz...错误出在哪呢?我们遍历myext_samplefuc的所有实现代码也 p = strchr(str, ','); ```` -现在所有的问题都水落石出了,字符串变量str没有以NULL结尾,而我们却把它当作一个参数传给了二进制不安全的字符串处理函数,str将会扫描str知道找到NULL为止,它的扫描肯定是越界了,然后引发了一个段错误。找到问题根源后,我们只要用memchr来替换strchr函数就能修复这个bug了。 +现在所有的问题都水落石出了,字符串变量str没有以NULL结尾,而我们却把它当作一个参数传给了二进制不安全的字符串处理函数,str将会扫描str直道找到NULL为止,它的扫描肯定是越界了,然后引发了一个段错误。找到问题根源后,我们只要用memchr来替换strchr函数就能修复这个bug了。 ### --enable-maintainer-zts 第二个重要的参数便是激活php的线程安全机制(Thread Safe Resource Manager(TSRM)/Zend Thread Safety(ZTS)),使我们开发出的程序是线程安全的。对于TSRM的介绍大家可以参考第一章的介绍,在平时的开发中,建议打开这个选项。 ### --enable-embed @@ -41,6 +41,6 @@ p = strchr(str, ','); ## links - * 4.1 [编译前的准备](<4.1.md>) - * 4.3 [Unix/Linux平台下的编译](<4.3.md>) +* 4.1 [编译前的准备](<4.1.md>) +* 4.3 [Unix/Linux平台下的编译](<4.3.md>)