PHP 的底层实现 PHP 代码的执行过程: 编译型语言: 对于 C 语言,C++, 编译成机器码(二进制)来运行. java 语言, 把.java 编译成 .class,称为 bytecode, 由 jvm 来运行. 解释语言: 解释器解释执行. 典型的如 linux shell. 解释器逐行来执行命令. PHP 稍有特殊之处,虽然是一个脚本语言,但不是靠解释器解释. 而是 zend 虚拟机,屏蔽了操作系统的区别. php 代码编译成 opcode, 由 zend 虚拟机来执行 opcode. 但是---opcode, PHP 脚本一结束,opcode 就清除了. 思考:opcode 能否缓存? PHP 本身不支持,但是 apc,xcache 等加速器,实现了这样的效果. zend 编译器 (PHP--->opcode) zend 虚拟机 ( 执行 opcode) 操作系统层面 win/linux/mac PHP 底层用 C 语言来实现的,C 语言是强类型,而 PHP 是弱类型 语言. 是如何实现的呢? PHP 变量的底层实现: 我们解压 PHP 的源码包, 看到如下的目录 其中, 最 核 心 的 ---Zend 目 录, 这是 zend 虚拟的 实现. 包括栈,数据类 型,编译器等,都在这 实现. 最主要的 main --PHP 的一些内建函数,最 主要函数都在这里放 着. 最大的一个目录 ext -- PHP 的扩展. PHP 的大部分功能,都是以 extenstion 形式来完成的. 如果你开发了一个扩展,也放在 ext 目录下. Zend 对变量的表示: 答: zend 实现了 zval 结构体 { value: [联合体] ,联合体的内容可能是 C 语言中的 long,double,hashtable... type: 变量类型 , IS_NULL,IS_BOOL,IS_STRING...... IS_RESOURCE refcount_gc is_ref_gc } 如: $a = 3; { value : [long lval = 3] type: IS_LONG } $a = 3.5 { value: [double dval = 3.5] type:IS_DOUBLE } 疑问 : PHP 中有 8 种数据类型,为什么 zval->value 联合体中,只有 5 种? 答: 1: NULL,直接 zval->type = IS_NULL,就可以表示,不必设置 value 的值. 2: BOOL 型 , zval->type = IS_BOOL, 再设置 zval.value.lval = 1/0; 3: Resourc 型 ,资源型 往往是服务器上打开的一个接口,如果 文件读取接口. zval->type = IS_RESOURCE, zval->tyoe.lval = 服务器上打开的接口的编号 发现: PHP 中,字符串类型,长度是已经缓存的,调用 strlen 时,系统可以直接返回其长度,不必计算. 符号表 --- 变量的花名册 变量的赋值与引用 注意: 在传值赋值时, 以: $a = 3 ; $b = $a 为例, 并没有再次产生结构体,而是 2 个变量共用 1 个结构体. 此时,2 个变量,指向同 1 个结构体, refcount_gc 值为 2 思考: a, b 指向同一个 结构体, 那 么,修改 a, 或 b ,对方 会不会受干 扰? 答: 不会, 因为 2 者, 有一方修改 时,将会造 成结构体的 分裂. 结构体一开 始共用, 到某一方要修改值时,才分裂. 这种特点,称为 cow , copy on write , 如下图:
PHP的底层实现
编程开发 >
后端开发 >
PHP >
文档预览
9 页
11 下载
1565 浏览
0 评论
0 收藏
3.0分
温馨提示:如果当前文档出现乱码或未能正常浏览,请先下载原文档进行浏览。