php底层学习-代码执行和变量的存储
本文是学习燕十八老师的视频总结
php代码执行流程
php有zend引擎编译为opcode,然后由zend虚拟机来执行opcode,但是一执行结束,opcode就会被清除
可以安装第三方加速器(apc,xcache)来缓存opcode,zend自身不支持
流程展示
zend编译器(执行opcode)
↑
zend虚拟机(编译opcode)
↑
操作系统
php是c开发的,c是强类型语言,而php是弱类型语言,是怎么实现的呢?
php的一个变量,在c中是由下面的结构体来描述的
………………………………………
typedef struct _zval_struct zval;
…
struct _zval_struct {
/* Variable information */
zvalue_value value; /* value */
zend_uint refcount__gc; /引用次数/
zend_uchar type; /* active type 活动(值)的类型 */
zend_uchar is_ref__gc; /* 是否引用标识*/
};
zend_uchar type 根据语句情景,当时的数据类型
例如: echo 2 + ‘3’ 此时’3’活动类型为int型
zvalue 的取值(_zvalue_value 联合体) 提供了五种结构类型
typedef union _zvalue_value {
long lval; /* long value */
double dval; /* double value */
struct {
char *val;
int len;
} str;
HashTable ht; / hash table value */
zend_object_value obj;
} zvalue_value;
type的取值(8种)
IS_NULL , IS_BOOL.IS_LONG,IS_DOUBLE,IS_STRING,IS_ARRAY,IS_RESOURCE,IS_OBJECT
例如
a = ‘hello,world’;
产生了一个结构体
{
{
char:’hello,world’
length:11,
}
type:IS_STRING,
refcount_gc:1
is_ref_gc:0
}
在这个结构体中可以看到,strlen的速度很快,因为在联合体中直接维护这字符串的长度,所以进行strlen时能够直接读出字符串的长度,时间复杂度为O(1)
问题:在结构体中提供了8中数据类型,为什么在联合体中值提供了五种
type为 IS_NULL 时,值中没有必要再存储
type为IS_BOOL时,值中用1或0标识
type为IS_RESOURCE时,值为服务端打开资源的编号,其实值也是用整型来标识
变量名的处理
HashTable Symbol_table 全局符号表
symbol_table存放了变量名和结构体所在的地址
例如:
b = 1.1;
$c = ‘1’
不仅产生了三个结构体,还在全局的symbol_table中存储了这三个变量名和相应的内存中的地址
a —-> 0x123(结构体1的地址)
b—–> 0x112(结构体1.1的地址)
c—–> 0x132(结构体’1’的地址)
未完继续…
另外推荐一篇博客https://www.cnblogs.com/tangchuanyang/p/6185655.html