日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > php >内容正文

php

php7 变量,PHP7变量结构分析

發布時間:2024/7/23 php 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 php7 变量,PHP7变量结构分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

PHP7相對于PHP5提升了將近一倍的性能,下面我將針對PHP7與PHP5的變量結構實現進行對比,分析為什么PHP7性能提升。當然變量結構修改只是PHP7性能提升中的一部分原因,還有很多原因比如HashTable結構變更、減少內存分配次數、多使用棧內存等等,本文只對變量結構進行分析。

本文源碼基于PHP7.2.3以及PHP5.6.34

PHP作為弱類型語言,所有變量都是zval結構體來保存,PHP7與PHP5的zval結構也不相同,下面將分析兩者zval結構的不同之處。

PHP5

PHP5的zval定義于Zend\zend.h

typedef struct _zval_struct zval; //此段代碼在Zend\zend_types.h中

...

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;

zend_ast *ast;

} zvalue_value;

struct _zval_struct {

/* Variable information */

zvalue_value value; /* value */

zend_uint refcount__gc;

zend_uchar type; /* active type */

zend_uchar is_ref__gc;

};

可以看到zval結構體有四個成員:

zvalue_value:共用體,儲存變量的值

refcount__gc:引用計數,用于垃圾回收,默認值1

type:變量的具體類型

is_ref__gc:是否引用,用于垃圾回收,默認值0

zvalue_value共用體用來儲存變量的值:

long lval成員用于儲存整型與布爾型。

double dval成員用于儲存 浮點型。

結構體str用于存儲字符串,之所以使用結構體是用來儲存字符串的長度,實時獲取字符串的長度的時間復雜度是O(n),在PHP中字符串的操作非常頻繁,這樣能節省大量的時間。

HashTable *ht用來存儲數組,PHP中的數組非常強大,這一切都基于哈希表結構。

zend_object_value obj用來存儲對象。在面向對象編程中,這也是非常重要的一部分。

zend_ast *ast zend抽象語法樹,zend內核使用。

zval結構體中的type成員有以下幾種類型(代碼位于Zend\zend.h):

/* data types */

/* All data types <= IS_BOOL have their constructor/destructors skipped */

#define IS_NULL 0 #define IS_LONG 1 #define IS_DOUBLE 2 #define IS_BOOL 3 #define IS_ARRAY 4 #define IS_OBJECT 5 #define IS_STRING 6 #define IS_RESOURCE 7 #define IS_CONSTANT 8 #define IS_CONSTANT_AST 9 #define IS_CALLABLE 10

PHP7

PHP7的zval定義于Zend\zend_types.h

typedef struct _zval_struct zval;

...

typedef union _zend_value {

zend_long lval;/* long value */

double dval;/* double value */

zend_refcounted *counted;

zend_string *str;

zend_array *arr;

zend_object *obj;

zend_resource *res;

zend_reference *ref;

zend_ast_ref *ast;

zval *zv;

void *ptr;

zend_class_entry *ce;

zend_function *func;

struct {

uint32_t w1;

uint32_t w2;

} ww;

} zend_value;

struct _zval_struct {

zend_value value;/* value */

union {

struct {

ZEND_ENDIAN_LOHI_4(

zend_uchar type,/* active type */

zend_uchar type_flags,

zend_uchar const_flags,

zend_uchar reserved) /* call info for EX(This) */

} v;

uint32_t type_info;

} u1;

union {

uint32_t next; /* hash collision chain */

uint32_t cache_slot; /* literal cache slot */

uint32_t lineno; /* line number (for ast nodes) */

uint32_t num_args; /* arguments number for EX(This) */

uint32_t fe_pos; /* foreach position */

uint32_t fe_iter_idx; /* foreach iterator index */

uint32_t access_flags; /* class constant access flags */

uint32_t property_guard; /* single property guard */

uint32_t extra; /* not further specified */

} u2;

};

可以看到PHP7的代碼相對PHP5的代碼更加符合規范,所以更便于理解。

在_zval_struct結構體中:

zend_value共用體用于儲存變量的值

u1共用體,用于存儲變量的類型,以及一些輔助值

u2共用體,輔助值,由于內存對齊,_zval_struct結構體總共16字節大小,zend_value為8字節,u1為4字節,剩下的4字節防止浪費,用來作為輔助值,具體輔助用來干嘛代碼的注釋已經說明了。

u2共用體的輔助值成員一直在增加,我記得當時PHP7剛發布的時候才4個輔助值,現在已經9個了。

zend_value共用體就不用解釋了,相比PHP5,PHP7的代碼結構更加清晰、規范,一眼就能看出共用體的成員都用來儲存什么類型的數據,我們可以發現PHP7 zend_value共用體大部分數據都是存儲的指針,由于指針占的內存小,所以PHP7的zend_value占的內存比PHP5的zend_value要小。

對比

我們可以看到雖然PHP7的變量結構看起來更復雜,但是由于使用共用體,所以其實內存占用并不多,PHP5中的zval占用24個字節,PHP7中的zval占用16個字節。內存占用減少了1/3,而且PHP中的代碼邏輯都是基于變量來實現的,所以對性能的影響非常大。可以看到PHP7中的代碼規范比PHP5好了很多,并且PHP7的變量結構中輔助值的使用充分利用了內存,同時提高了性能。

結語

PHP7主要是優化性能,其實這個和互聯網的發展也有關系。在之前,訪問量和性能并不是最主要的,PHP憑借敏捷開發能在編程語言中占據一席之地。然而隨著互聯網的發展,網民數量的增多,以及各種編程語言的出現,大多數大型網站追求的是高并發以及訪問速度,這個時候PHP的劣勢就展示出來了。當然可以感受到PHP社區對這門語言的熱情,包括PHP7的性能提升,swoole擴展的流行,以及正在開發中的PHP JIT版本,相信PHP會發展的越來越好。

總結

以上是生活随笔為你收集整理的php7 变量,PHP7变量结构分析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。