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; //这个才是正在重新开辟新的内存空间
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!

Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

Hot Topics

PHP 8.4 brings several new features, security improvements, and performance improvements with healthy amounts of feature deprecations and removals. This guide explains how to install PHP 8.4 or upgrade to PHP 8.4 on Ubuntu, Debian, or their derivati

Visual Studio Code, also known as VS Code, is a free source code editor — or integrated development environment (IDE) — available for all major operating systems. With a large collection of extensions for many programming languages, VS Code can be c

JWT is an open standard based on JSON, used to securely transmit information between parties, mainly for identity authentication and information exchange. 1. JWT consists of three parts: Header, Payload and Signature. 2. The working principle of JWT includes three steps: generating JWT, verifying JWT and parsing Payload. 3. When using JWT for authentication in PHP, JWT can be generated and verified, and user role and permission information can be included in advanced usage. 4. Common errors include signature verification failure, token expiration, and payload oversized. Debugging skills include using debugging tools and logging. 5. Performance optimization and best practices include using appropriate signature algorithms, setting validity periods reasonably,

A string is a sequence of characters, including letters, numbers, and symbols. This tutorial will learn how to calculate the number of vowels in a given string in PHP using different methods. The vowels in English are a, e, i, o, u, and they can be uppercase or lowercase. What is a vowel? Vowels are alphabetic characters that represent a specific pronunciation. There are five vowels in English, including uppercase and lowercase: a, e, i, o, u Example 1 Input: String = "Tutorialspoint" Output: 6 explain The vowels in the string "Tutorialspoint" are u, o, i, a, o, i. There are 6 yuan in total

This tutorial demonstrates how to efficiently process XML documents using PHP. XML (eXtensible Markup Language) is a versatile text-based markup language designed for both human readability and machine parsing. It's commonly used for data storage an

Static binding (static::) implements late static binding (LSB) in PHP, allowing calling classes to be referenced in static contexts rather than defining classes. 1) The parsing process is performed at runtime, 2) Look up the call class in the inheritance relationship, 3) It may bring performance overhead.

What are the magic methods of PHP? PHP's magic methods include: 1.\_\_construct, used to initialize objects; 2.\_\_destruct, used to clean up resources; 3.\_\_call, handle non-existent method calls; 4.\_\_get, implement dynamic attribute access; 5.\_\_set, implement dynamic attribute settings. These methods are automatically called in certain situations, improving code flexibility and efficiency.

PHP and Python each have their own advantages, and choose according to project requirements. 1.PHP is suitable for web development, especially for rapid development and maintenance of websites. 2. Python is suitable for data science, machine learning and artificial intelligence, with concise syntax and suitable for beginners.
