摘要:PHP是一種適用于web開發的動態語言。具體點說,就是一個用C語言實現包含大量組件模塊的軟件框架。是一個強大的UI框架。簡言之;PHP動態語言執行過程:拿到一段代碼后,經過詞法解析、語法解析等階段后,...
PHP是一種適用于web開發的動態語言。具體點說,就是一個用C語言實現包含大量組件模塊的軟件框架。是一個強大的UI框架。
簡言之;PHP動態語言執行過程:拿到一段代碼后,經過詞法解析、語法解析等階段后,源程序會被翻譯成一個個指令(opcodes),然后ZEND虛擬機順次執行這些指令完成操作。PHP本身是用C實現的,因此最終調用的也是C的函數,實際上,我們可以把PHP看做一個C開發的軟件。
一、PHP代碼的執行過程:
編譯型語言:
對于C語言,C++, 編譯成機器碼(二進制)來運行.
java語言, 把.java編譯成 .class,稱為bytecode, 由jvm來運行.
解釋語言:
解釋器解釋執行. 典型的如 linux shell.
解釋器逐行來執行命令.
PHP稍有特殊之處,雖然是一個腳本語言,但不是靠解釋器解釋,而是 zend 虛擬機,屏蔽了操作系統的區別.php代碼編譯成opcode, 由zend虛擬機來執行opcode.
但是---opcode, PHP腳本一結束,opcode就清除了.
思考:opcode能否緩存?
PHP本身不支持,但是apc,xcache等加速器,實現了這樣的效果.
二、PHP變量的底層實現:
下載PHP的源碼包,看到如下的目錄:
其中,最核心的---Zend目錄, 這是zend虛擬的實現. 包括棧,數據類型,編譯器等,都在這實現.
最主要的main --PHP的一些內建函數,最主要函數都在這里放著.最大的一個目錄 ext -- PHP的擴展.
PHP的大部分功能,都是以extenstion形式來完成的,如果你開發了一個擴展,也放在ext目錄下.
在zend中,PHP變量是怎么實現的?
找到文件Zend/zend.h的第316行,PHP中的一個變量就是zval中的一個結構體來描述的,如圖:
結構體的字段解釋:
struct _zval_struct { /* Variable information */ zvalue_value value; /*變量的值,是個聯合體*/ zend_uint refcount__gc; /*指向次數*/ zend_uchar type; /* 變量類型 */ zend_uchar is_ref__gc; /*是否引用*/ };
type字段的值為以下常量:
IS_NULL,IS_BOOL,IS_LONG,IS_DOUBLE,IS_STRING,IS_ARRAY,IS_OBJECT,IS_RESOURCE.
那具體的一個變量的值(上圖中的zvalue_value)是如何存放的,在第305行找到:
我們發現在PHP中,字符串類型,長度是已經緩存的,調用strlen時,系統可以直接返回其長度,不必計算.
疑問:
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 = 服務器上打開的接口的編號
//如我們聲明一個變量,那么一個結構體就產生了: $a = 3; { value : [long lval = 3] type: IS_LONG } $a = 3.5 { value: [double dval = 3.5] type:IS_DOUBLE }