以图明志

PHP服务器脚本

PHP内核探索:定义函数的过程

函数的一切从function开始
在PHP中,用户函数的定义从function关键字开始。函数的一切从function开始。我们从function开始函数定义的探索之旅。在 Zend/zend_language_scanner.l中我们找到如下所示的代码:……它所表示的含义是function将会生成T_FUNCTION标记。

PHP服务器脚本

PHP内核探索:函数结构转换

不同结构间的强制转换
在函数调用的执行代码中我们会看到这样一些强制转换,这些不同结构间的强制转换是如何进行的呢?首先我们来看zend_function的结构,在Zend/zend_compile.h文件中。这是一个联合体,我们来温习一下联合体的一些特性。 联合体的所有成员变量共享内存中的一块内存,在某个时刻只能有一个成员使用这块内存。

PHP服务器脚本

PHP内核探索:函数的内部结构

在其内部可以实现各种语句的执行
在PHP中,函数有自己的作用域,同时在其内部可以实现各种语句的执行,最后返回最终结果值。 其中的ZEND_USER_FUNCTION是用户函数,ZEND_INTERNAL_FUNCTION是内置的函数。也就是说PHP将内置的函数和用户定义的函数分别保存。

PHP服务器脚本

PHP内核探索:函数的分类

可以在任何被需要的时候执行的代码块
函数是一种可以在任何被需要的时候执行的代码块。它不仅仅包括用户自定义的函数,还包括程序语言实现的库函数。PHP 有很多标准的函数和结构。如我们常见的count、strpos、implode等函数,这些都是标准函数,它们都是由标准扩展提供的; 如我们经常用到的isset、empty、eval等函数,这些结构被称之为语言结构。

PHP服务器脚本

PHP内核探索:数组源码分析

数组最大的好处便是速度快
PHP中经常使用数组,使用数组最大的好处便是速度!读写都可以在O(1)内完成,因为它每个元素的大小都是一致的,只要知道下标,便可以瞬间计算出其对应的元素在内存中的位置,从而直接取出或者写入。那么内核中是如何实现的呢?PHP大部分功能,都是通过HashTable来实现,其中就包括数组。

PHP服务器脚本

PHP内核探索:数组操作

操作HashTable存储zval*
当你在扩展中使用HashTable时候,95%是要存储用户端的变量,就像PHP语言中数组那样。为此,内核中已经准备好了相应的工具,来让我们更加的方便的操作HashTable存储zval*,也就是PHP语言中的数组,即IS_ARRAY常量代表的zval,以下用{数组}来代替PHP语言中的数组这个词。

PHP服务器脚本

PHP内核探索:使用哈希表API

Zend把与HashTable有关的API分成了好几类
Zend把与HashTable有关的API分成了好几类以便于我们寻找,这些API的返回值大多都是常量SUCCESS或者FAILURE。下面在介绍函数原型的时候都使用了ht名称,但是我们在编写扩展的时候,一定不要使用这个名称,因为一些PHP宏展开后会声明这个名称的变量,进而引发命名冲突。

PHP服务器脚本

PHP内核探索:数组与链表

C语言中数组和链表的一些事情
在C语言中,我们可以自定义各种各样的数据结构,用来把很多数据保存在一个变量里面,但是每种数据结构都有自己的优缺点,PHP内核规模如此庞大,是否已经找到了一些非常棒的解决方法呢?我们在选择各种数据结构时,往往会考虑我们需要处理的数据规模以及需要的性能。下面让我们简要的看一下看C语言中数组和链表的一些事情。

PHP服务器脚本

PHP内核探索:写时复制COW机制

在写入时才真正复制一份内存进行修改
写时复制(Copy-on-Write,也缩写为COW),顾名思义,就是在写入时才真正复制一份内存进行修改。 COW最早应用在*nix系统中对线程与内存使用的优化,后面广泛的被使用在各种编程语言中,如C++的STL等。 在PHP内核中,COW也是主要的内存优化手段。 在前面关于变量和内存的讨论中,引用计数对变量的销毁与回收中起着至关重要的标识作用。

PHP服务器脚本

PHP内核探索:内存管理中的cache

PHP将缓存添加到内存管理机制中
在维基百科中有这样一段描述: 凡是位于速度相差较大的两种硬件之间的,用于协调两者数据传输速度差异的结构,均可称之为Cache。 从最初始的处理器与内存间的Cache开始,都是为了让数据访问的速度适应CPU的处理速度, 其基于的原理是内存中“程序执行与数据访问的局域性行为”。

PHP服务器脚本

PHP内核探索:PHP5.3的垃圾回收机制

解决了无法处理循环的引用内存泄漏问题
在PHP5.3版本之前,PHP只有简单的基于引用计数的垃圾回收,当一个变量的引用计数变为0时, PHP将在内存中销毁这个变量,只是这里的垃圾并不能称之为垃圾。 并且PHP在一个生命周期结束后就会释放此进程/线程所点的内容,这种方式决定了PHP在前期不需要过多考虑内存的泄露问题。

PHP服务器脚本

PHP内核探索:引用计数与写时复制

引用计数是节省内存的一个超棒的模式
对于PHP这种需要同时处理多个请求的程序来说,申请和释放内存的时候应该慎之又慎,一不小心便会酿成大错。另一方面,除了要安全的申请和释放内存外,还应该做到内存的最小化使用,因为它可能要处理每秒钟数以千计的请求,为了提高系统整体的性能,每一次操作都应该只使用最少的内存,对于不必要的相同数据的复制则应该能免则免。

PHP服务器脚本

PHP内核探索:内存的申请与销毁

ZendMM会在内存池中分配相应的内存
PHP底层对内存的管理, 围绕着小块内存列表(free_buckets)、 大块内存列表(large_free_buckets)和 剩余内存列表(rest_buckets)三个列表来分层进行的。 ZendMM向系统进行的内存申请,并不是有需要时向系统即时申请, 而是由ZendMM的最底层(heap层)先向系统申请一大块的内存。

PHP服务器脚本

PHP内核探索:PHP的内存管理

在ZEND内核中以宏的形式作为接口提供
PHP的内存管理可以被看作是分层(hierarchical)的。 它分为三层:存储层(storage)、堆层(heap)和接口层(emalloc/efree)。 存储层通过 malloc()、mmap() 等函数向系统真正的申请内存,并通过 free() 函数释放所申请的内存。 存储层通常申请的内存块都比较大,这里申请的内存大并不是指storage层结构所需要的内存大。

PHP服务器脚本

PHP内核探索:Zend内存管理器

非常类似于操作系统的内存管理功能
每个平台操作内存的方式都是差不多的有两个方面,一负责申请,二负责释放。如果应用程序向系统申请内存,系统便会在内存中寻找还没有被使用的地方,如果有合适的,便分配给这个程序,并标记下来,不再给其它的程序了。如果一个内存块没有释放,而所有者应用程序也永远不再使用它了。那么,我们就称其为"内存泄漏",那么这部分内存就无法再为其它程序所用了。

PHP服务器脚本

PHP内核探索:内存管理开篇

尽可能高效的利用内存
内存是计算机非常关键的部件之一,是暂时存储程序以及数据的空间,CPU只有有限的寄存器可以用于存储计算数据,而大部分的数据都是存储在内存中的,程序运行都是在内存中进行的。和CPU计算能力一样, 内存也是决定计算效率的一个关键部分。计算中的资源中主要包含:CPU计算能力,内存资源以及I/O。
3 / 6 首页 < Prev 1 2 3 4 5 Next > 尾页 页码: