Memory overflow means that there is unrecoverable memory in the application system or too much memory is used, which ultimately causes the memory used to run the program to exceed the maximum memory that the virtual machine can provide.
There are many reasons for memory overflow. The common ones are as follows:
The amount of data loaded in the memory is too large Huge, such as retrieving too much data from the database at one time; (Recommended learning: PHP video tutorial)
There are references to objects in the collection class, which are not cleared after use;
There is an infinite loop in the code or the loop generates too many repeated object entities;
Bugs in the third-party software used;
The startup parameter memory value is set too small;
Assume that the number of records stored in the log is 500,000, then the solution is as follows:
ini_set('memory_limit','64M'); //Reset PHP can be used The memory size is 64M. Generally, the php.ini file cannot be modified on the remote host and can only be set through the program. Note: In safe_mode (safe mode), ini_set is invalid
set_time_limit(600);//设置超时限制为6分钟 $farr = $Uarr = $Marr = $IParr = $data = $_sub = array(); $spt = ”$@#!$”; $root = ”/Data/webapps/VisitLog”; $path = $dpath = $fpath = NULL; $path = $root.”/”.date(“Y-m”,$timestamp); $dpath = $path.”/”.date(“m-d”,$timestamp); for($j=0;$j<24;$j++){ $v = ($j < 10) ? ”0″.$j : $j; $gpath = $dpath.”/”.$v.”.php”; if(!file_exists($gpath)){ continue; } else { $arr = file($gpath);////将文件读入数组中 array_shift($arr);//移出第一个单元-》<?php exit;?> $farr = array_merge($farr,$arr); unset($arr); } } if(empty($this->farr)){ echo ”<p><center>没有相关记录!</center></p>”; exit; } while(!empty($farr)){ $_sub = array_splice($farr, 0, 10000); //每次取出$farr中1000个 for($i=0,$scount=count($_sub);$i<$scount;$i++){ $arr = explode($spt,$_sub[$i]); $Uarr[] = $arr[1]; //vurl $Marr[] = $arr[2]; //vmark $IParr[] = $arr[3].” |$nbsp;”.$arr[1]; //IP } unset($_sub);//用完及时销毁 } unset($farr);
Here, it is not difficult to see that on the one hand, we need to increase the available memory size of PHP. On the other hand, as long as we find a way to process the array in batches , divide and conquer, destroy (unset) used variables in time, and generally there will be no overflow problems.
In addition, in order to save PHP program memory consumption, we should reduce the use of static variables as much as possible. When data reuse is needed, you can consider using references (&). Another point is: after the database operation is completed, the connection must be closed immediately; after an object is used, the destructor (__destruct()) must be called promptly.
The above is the detailed content of Common causes of php memory overflow. For more information, please follow other related articles on the PHP Chinese website!