Home >Backend Development >PHP Problem >What happens when php memory leaks?
Situation 1. The program operation data is too large
Scenario restoration: One-time reading exceeds the upper limit of PHP's available memory The data causes the memory to run out
<?php ini_set('memory_limit', '128M'); $string = str_pad('1', 128 * 1024 * 1024);
Solution:
1. Problems that can be solved with money are not problems. If the program needs to read large files There are not many opportunities, and the upper limit is predictable, then use ini_set('memory_limit', '1G'); to set a larger value or memory_limit=-1. If you have enough memory, you can keep the program running.
2. If the program needs to be able to be used normally on a small memory machine, then the program needs to be optimized. As shown below, the code is much more complicated.
<?php //php7 以下版本通过 composer 引入 paragonie/random_compat ,为了方便来生成一个随机名称的临时文件 require "vendor/autoload.php"; ini_set('memory_limit', '128M'); //生成临时文件存放大字符串 $fileName = 'tmp'.bin2hex(random_bytes(5)).'.txt'; touch($fileName); for ( $i = 0; $i < 128; $i++ ) { $string = str_pad('1', 1 * 1024 * 1024); file_put_contents($fileName, $string, FILE_APPEND); } $handle = fopen($fileName, "r"); for ( $i = 0; $i <= filesize($fileName) / 1 * 1024 * 1024; $i++ ) { //do something $string = fread($handle, 1 * 1024 * 1024); } fclose($handle); unlink($fileName);
Situation 2, Copies are generated when the program operates on big data
Scenario restoration: large variables during execution A copy was made, resulting in insufficient memory.
<?php ini_set("memory_limit",'1M'); $string = str_pad('1', 1* 750 *1024); $string2 = $string; $string2 .= '1';
Solution:
Release useless variables early, or operate the original data in the form of references.
<?php ini_set("memory_limit",'1M'); $string = str_pad('1', 1* 750 *1024); $string2 = $string; unset($string); $string2 .= '1';
Scenario 3. Unreasonable configuration and system resource exhaustion
Scenario restoration: insufficient memory due to unreasonable configuration, 2G memory machine The above setting can start up to 100 php-fpm sub-processes, but after actually starting 50 php-fpm sub-processes, no more processes can be started.
Solution:
Reasonably set parameters such as post_max_size, max_file_uploads, upload_max_filesize, max_input_vars, max_input_nesting_level and tune php-fpm related parameters.
Situation 4. Useless data is not released in time
Scenario restoration: This problem is not logical from the program logic Problem, but useless data takes up a lot of memory and leads to insufficient resources. Targeted code optimization should be done.
The following code is used to monitor database operations in Laravel development:
DB::listen(function ($query) { // query−>sql//query−>sql//query->bindings // $query->time });
Solution:
In this case, pass DB The ::listen method obtains records of all executed SQL statements and writes them to the log. However, this method has a memory leak problem. It does not matter in the development environment. In the production environment, it should be disabled and other methods are used to obtain the executed SQL statements and write them. log.
Recommended tutorial;PHP video tutorial
The above is the detailed content of What happens when php memory leaks?. For more information, please follow other related articles on the PHP Chinese website!