PHP variable copy-on-write mechanism

不言
Release: 2023-03-23 20:14:01
Original
1371 people have browsed it

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;
Copy after login

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所在的栈区空间的数据进行修改
Copy after login

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
Copy after login

I discovered several important points from this place.

  1. 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

  2. Why is php slower than C. You have done so much more, can you not be slow?

  3. 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.

Additional details, when the PHP kernel finds that the value of int When it overflows, that is, when it exceeds the range of the integer type, it is automatically converted to float. Interested readers can write a large integer type themselves, but it cannot exceed the float value range and see what the var_dump data type is.

The last part: The PHP object part is in reference mode by default, so even if the assignment is completed and the member variables of the object are changed, copy-on-write will not be enabled, as related to the following

class Test {
     public $var = 999;
}$test1 = new Test();$test2 = $test1;  //只是引用计数加1而己,没有开辟新的内存空间
$test2->var = 1000;echo $test1->var;  //此时的值也为1000
$test3 = clone $test1;  //这个才是正在重新开辟新的内存空间
Copy after login
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!

Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!