今天要用php代碼來處理一個580M的日志文件,總共有219萬多行記錄,因為是.log的文件,在windows下面很難將文件按照條數來分割,于是在linux下用split -l 10000 filename 前綴名 將整個文件按10000行一個分割成了200多個小文件,之后用php來循環處理這200多個文件,可是執行到后來就出現了題目上面的錯誤:
去百度了一下,原來是php.ini中的內存分配的問題,默認php代碼能夠申請到的最大內存字節數就是134217728 bytes,如果代碼執行的時候再需要更多的內存,就會報錯了,于是就將php.ini文件中的配置改了一下:
究其原因,是我在在編碼時,僅僅對變量賦值,卻從來沒有 unset ($var) 過。導致了內存占用越來越多,所以以后一個變量不再使用之后,一定要記得unset掉它。
<?php
set_time_limit(1800) ;
/**
* 獲取日志中發送失敗的郵箱地址
* @param $directory log日志的目錄
* @param $name 失敗郵箱保存的文件名
*/
function getmail($directory,$name){
//遍歷目錄下的.log文件
$files=scandir("$directory");
foreach($files as $v){
if(preg_match_all("|mail/.log/D+|",$v,$log)){
$logs[]=$log[0][0];
}
}
//將所有.log文件中發送失敗郵箱提取出來
foreach($logs as $v){
$row=file("$v");
echo "讀取".$v."文件<br />";
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 "獲取發送失敗的郵箱地址".$matches[0]."<br />";
}else{
echo "無法獲取日志中發送失敗的郵箱,請檢查";
}
}
}
unset($row);
}
//將提取出來的發送失敗郵箱寫入到mail.txt文件中
$mailurl=fopen("$name","a");
foreach($mail as $line)
{
fwrite($mailurl,$line."/r/n");
}
echo "將所有發送失敗的郵箱地址寫入".$name."<br />";
fclose($mailurl);
}
getmail(".","mail.txt");
?>