Home >Backend Development >PHP Tutorial >PHP kernel-memory management
1. Basics of memory management
When developing in C language, developers must manually manage memory. PHP is often used as a module for web servers, and memory management is closely related to preventing memory leaks. In addition, PHP may be used in a threaded environment, so global variables may cause race conditions. In addition, the Zend engine faces a very special usage pattern: within a relatively short period of time, many zval structure-sized memory blocks and other small memory blocks are applied for and then released. PHP's memory management also attaches great importance to memory_limit (memory_limit). Limitations)
In order to meet the above requirements, Zend engine provides a special memory manager for processing request-related data. Request-related data refers to data that only needs to serve a single request and is released at the end of the request at the latest. Extension developers are mainly exposed to the conventions listed in the table below. Although some of the convenience functions provided are implemented using macros, they will be treated like functions in this article.
As mentioned above, preventing memory leaks and releasing all memory as quickly as possible is an important part of memory management. For security reasons, Zend Engine releases all memory allocated by the API mentioned above at the end of the request. If PHP is built with the --enable-debug configuration option, this will generate a warning
When using PHP variables, you need to confirm that the memory of the variable is allocated using emalloc, and pay attention to the reference count.
Memory leak detection can only find leaks caused by emalloc allocated memory blocks. For in-depth analysis, it is recommended to use a memory detector such as valgrind or libumem, etc. To simplify this analysis, disable PHP's memory manager by setting the environment variable USE_ZEND_ALLOC=0 when PHP starts.
(The above is the Chinese content of the PHP official website)
2. Data persistence
Data persistence means that any data is expected to survive longer than the current request. The memory manager without the Zend engine is very focused on request-bound allocation, but This is usually not practical or appropriate. Persistent memory is sometimes needed to meet the requirements of external class libraries, and it is also a useful "black technology".
Persistent memory is usually used for persistent database connections. Although it is not good in practice, it is still the most commonly used feature.
Note: All functions below that take additional persistence parameters should be false, the engine will use the regular allocator (emalloc), and the memory should not be considered persistent (will not be translated!). As for persistent memory, system call allocators, like the main memory APIs, still do not return null pointers in most cases
Warning: Be aware that memory allocated for persistence is not optimal or is Tracked by the Zend engine, it is not limited by memory_limit. In addition, all variables created by the hacker must not be used to persist memory.
(The translation is really bad!)
The above has introduced the PHP kernel and memory management, including aspects of it. I hope it will be helpful to friends who are interested in PHP tutorials.