Home > Article > Backend Development > PHP variable copy-on-write mechanism
This article mainly introduces the copy-on-write mechanism using PHP variables. It has a certain reference value. Now I share it with everyone. Friends in need can refer to it
Reprinted from LYC's blog
Although programming ideas can be shared, the differences between languages are still relatively obvious, but users are not aware of them. Understanding the differences is still good for writing programs and controlling performance. Let's introduce copy on write, a very important mechanism of PHP. Let's first introduce this mechanism using the simplest variables. Before talking about this, the author first introduces how weak types are implemented.
Everyone knows that PHP is implemented in C, but C is a strongly typed language. How can PHP become a weakly typed language. Let’s take a look at the code of PHP variables in the bottom layer of C language.
typedef struct _zval_struct zval; typedef unsigned int zend_uint; ypedef unsigned char zend_uchar; struct _zval_struct { zvalue_value value; /*注意这里,这个里面存的才是变量的值*/ zend_uint refcount__gc; /*引用计数*/ zend_uchar type; /* 变量当前的数据类型 */ zend_uchar is_ref__gc; /*变量是否引用*/};typedef union _zvalue_value { long lval; /*PHP中整型的值*/ double dval; /*PHP的浮点数值*/ struct { char *val; int len; } str; /*PHP的字符串*/ HashTable *ht; /*数组*/ zend_object_value obj; /*对象*/} zvalue_value;
I have added some comments. You can find that in fact, the variables we use in PHP, the lower layer is a structure zval, inside The zvalue_value structure is actually a union. This union actually stores the variable values of PHP. Below we use actual PHP code examples to represent the entire working process. Pay attention to the reference count above. Let’s look at the C language first. The first is the non-functional part. The functional part will be discussed in the next chapter.
int i = 4; //alloca方式在内存中分配空间,这个变量在内存中的栈区 int j = i; //alloca方式在内存中分配空间,并且将原先内存空间里面的数据复制到新的内存空间中,这个变量在内存的栈区 int j = 5; //不分配内存空间,对变量j所在的栈区空间的数据进行修改
Let’s look at the PHP part.
$i = 4; //内核创建一个zval指针,并且为其以堆的方式开辟空间,让指针指向这个空间,将zval中的成员引用计数置为1,类型标记为整形, 并且申请一个zvalue_value指针,同样以堆的方式以其开辟空间,同时将该联合体中的lval赋值为4,并且在symbal_table的hash表中记录变量i和zval指针的映射关系 $j = $i; //没有在申请内存空间,在zval的成员中引用计数标记为 2$j = 5; //内核重新创建zval指针,重复下上面的步骤,我就不重复说明了,重点是将旧的zval引用计数标记为1
I discovered several important points from this place.
The memory space opened by all PHP variables is in the heap, whether it is a temporary variable or a global variable, but PHP's temporary variables are recorded in the active_symbal_table table, and the global variables are recorded in the symbal_table table
Why is php slower than C. You have done so much more, can you not be slow?
When PHP assigns values to variables like
##i, there is no memory overhead Yes, that is, if you assign tens of thousands of values, the reference count will only become tens of thousands. This is different from the C language. When the value of the variable changes, the memory space will be re-opened. This mechanism is called the copy-on-write mechanism.class Test { public $var = 999; }$test1 = new Test();$test2 = $test1; //只是引用计数加1而己,没有开辟新的内存空间 $test2->var = 1000;echo $test1->var; //此时的值也为1000 $test3 = clone $test1; //这个才是正在重新开辟新的内存空间Recommended:
Performance comparison between PHP variable references and non-references
Summary of examples of PHP variable substitution methods
The above is the detailed content of PHP variable copy-on-write mechanism. For more information, please follow other related articles on the PHP Chinese website!