Home  >  Article  >  Backend Development  >  Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 2611816 bytes),allocate2611816_PHP教程

Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 2611816 bytes),allocate2611816_PHP教程

WBOY
WBOYOriginal
2016-07-13 10:14:411062browse

Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 2611816 bytes), allocate2611816

Today I need to use PHP code to process a 580M log file with a total of more than 2.19 million lines of records. Because it is a .log file, it is difficult to split the file according to the number of entries under Windows, so I use split under Linux The -l 10000 filename prefix split the entire file into more than 200 small files based on 10,000 lines, and then used PHP to loop through these 200 files. However, after execution, the error above appeared:

Copy code The code is as follows:

Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 2611816 bytes)

I went to Baidu and found out that it was a memory allocation problem in php.ini. By default, the maximum number of memory bytes that the PHP code can apply for is 134217728 bytes. If more memory is needed when the code is executed, it will An error was reported, so I changed the configuration in the php.ini file:

Copy code The code is as follows:

memory_limit = 128M;//Change 128M to 256M

But then I thought about it, the memory space requested by a php script at one time will exceed 128M, so no matter how big you set the memory_limit in the future, there will definitely be problems in the future.

The reason is that when I was coding, I only assigned values ​​to variables, but never unset ($var). This leads to more and more memory usage, so after a variable is no longer used, you must remember to unset it.

Attached below is the code I used to process this log file today:

Copy code The code is as follows:

set_time_limit(1800) ;
/**
* Get the email addresses that failed to be sent in the log
* @param $directory log directory
* @param $name The file name saved in the failed mailbox
​*/
function getmail($directory,$name){
//Traverse the .log files in the directory
$files=scandir("$directory");
foreach($files as $v){
If(preg_match_all("|mail.logD+|",$v,$log)){
              $logs[]=$log[0][0];
}
}
//Extract the failed emails from all .log files
foreach($logs as $v){
         $row=file("$v");
              echo "Read ".$v." file
";
          foreach($row as $key => $value)
           {
If(eregi("host name lookup failure|Connection timed out with|Connection refused by|cannot find your reverse hostname", $value)){
if(preg_match("|w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*|", $row[$key],$matches)) {
$mail[] = trim($matches[0]);
echo "Get the email address that failed to send".$matches[0]."
";
                    }else{
echo "Unable to obtain the email address that failed to be sent in the log, please check";
                }
            }
}
          unset($row);
}
//Write the extracted email address that failed to be sent into the mail.txt file
$mailurl=fopen("$name","a");
foreach($mail as $line)
{
           fwrite($mailurl,$line."rn");
}
echo "Write all email addresses that failed to be sent to ".$name."
";
fclose($mailurl);
}

getmail(".","mail.txt");
?>

www.bkjia.comtruehttp: //www.bkjia.com/PHPjc/908177.htmlTechArticleFatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 2611816 bytes), allocate2611816 I will use php code today To process a 580M log file, a total of...
Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn