PHP底层分析

1.PHP编译

php由zend编译器编译成opcode,由zend虚拟机执行opcode。

2.变量的底层实现

php变量的值是存放在zval结构体中的value段中的,存放在内存中。

PHP字符串的长度已缓存在结构体中,所以strlen()计算字符串长度特别快。

变量名存在在一张符号表(哈希表)中,指向对应的内存结构体。

3.变量的赋值

$a = 3;
$b = $a;
并没有重新生成一个结构体,而是两个变量指向同一个结构体。给$b重新赋值时,将会造成结构体的分裂。 cow写时复制 copy on write.

引用赋值,指向共同的结构体。is_ref_gc=1,修改赋值时,所有的变量值都发生变化。

$a = 3; $b=$a; $c=&$a;
$b变量强制分裂一个结构体。

$a = [0,1,2]; $b = $a; $a[0] = 1;
数组中哈希表指针,指向部分共用结构体。

4.符号表与作用域

函数在执行时,根据函数的参数,局部变量等生成一个执行环境的结构体。结构体入栈,函数编译后的opcode,称为op_array(就是执行逻辑),开始执行–以入栈的环境结构体为环境执行。并生成函数的符号表,即局部变量。

注意:函数可能调用多次,栈中可能有某函数的多个执行环境,但是只有一个op_array。

5.静态变量

函数中的静态变量存放在op_array中,不存在结构体中。所以每次调用都可以取到上次的值。

6.内存分层

zend_mm_storge层

zend_mm_heap层(全局符号表,局部符号表,常量表,函数表)

emalloc,efree(调用时向zend_mm_heap层要数据)

发表评论

邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据