
php7内核分析
ball球
这个作者很懒,什么都没留下…
展开
-
php7数组的实现及部分源码分析
1.基本概念1.1 数组的语义本质上PHP数组是一个有序字典,它必须同时满足以下2个条件:语义一:PHP数组是一个字典,存储着键-值(key-value)对。通过键可以快速地找到对应的值,键可以是整型,也可以是字符串。语义二:PHP数组是有序的。这个有序指的是插入顺序,即遍历数组的时候,遍历元素的顺序应该和插入顺序一致,而不像普通字典一样是随机的。1.2 数组的概念PHP的数组zend_array对应的是HashTable。HashTable(哈希表)是一种通过某种哈希函数将特定的键映射到特原创 2020-09-28 12:31:35 · 810 阅读 · 5 评论 -
php7垃圾回收机制及相关源码解读
0. gc的基本结构0.1 zend_refcounted_h在《php7的引用计数》一文中,我们说过,php7的复杂类型,像字符串、数组、引用等的数据结构中,头部都有一个gc,变量的引用计数维护在这个gc中。gc是zend_refcounted_h类型的,其定义如下://php7.0 Zend/zend_types.htypedef struct _zend_refcounted_h { uint32_t refcount; /* reference c原创 2020-09-14 18:46:10 · 1121 阅读 · 2 评论 -
php7的zval及变量存储方式
Zval是PHP中最重要的数据结构之一,它包含了PHP中变量的值和类型相关信息。1. zval1.1 zval的结构(zend_types.h)typedef struct _zval_struct zval;struct _zval_struct { zend_value value; /* value */ union { struct { ZEND_ENDIAN_LOHI_4(原创 2020-08-20 10:15:23 · 690 阅读 · 0 评论 -
php7引用计数
1. 什么是引用计数在《php7 zval及变量存储方式》的2.3节中我们说到,对于复杂类型的变量(string,array,object,resource等),我们会将其具体的值记录在单独的内存区域,再由zend_value中相应的指针指向该内存区域。指向该内存区域的指针数量,即为引用计数。引用计数是服务于垃圾回收的机制的。当引用计数为0,相应的内存区域就可以回收了。官方手册中有关于引用计数的阐述,不过应该是针对5.*版本的,和7.*相比,大体思想是一样的,但实现和使用xdebug_debug_zv原创 2020-08-28 16:00:51 · 656 阅读 · 2 评论 -
php7 写时复制
1. 什么是写时复制在《php7引用计数》的文章中,我们知道,对于复制类型的变量,在赋值时,我们并没有重新复制一份数据,而是让新变量的zend_value中相应的指针指向原来的数据,同时增加引用计数。赋值后,如果其中一个变量试图改变数据内容,就需要重新拷贝一份原数据,同时断开zend_value指向,并改变引用计数。这个过程我们称为写时复制。下面来看一个例子:$a = range(0,2);$b = $a;xdebug_debug_zval('a');xdebug_debug_zval('b'原创 2020-09-01 18:30:46 · 269 阅读 · 0 评论