Home >Backend Development >PHP Tutorial >PHP kernel (1) memory management, php kernel memory management_PHP tutorial
1. Basics of memory management
When developing in C language, developers must manually manage memory. PHP is often used as a module of 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). Restrictions)
In order to meet the above needs, 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 primarily 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. This will produce a warning if PHP is built with the --enable-debug configuration option
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 PHP official website)
2. Data persistence
Data persistence means that any data is expected to live longer than the current request. The memory manager without 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 persistent memory, system call allocators, like the main memory APIs, still do not return null pointers in most cases
Warning: Please note that the memory allocated for persistence is not optimized or tracked by the Zend engine. It is not limited by memory_limit. In addition, all variables created by the hacker must not be used for persistence. Memory.
(The translation is really bad!)