Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 2611816 bytes)
今天要用php代碼來(lái)處理一個(gè)580M的日志文件,總共有219萬(wàn)多行記錄,因?yàn)槭?log的文件,在windows下面很難將文件按照條數(shù)來(lái)分割,于是在linux下用split -l 10000 filename 前綴名 將整個(gè)文件按10000行一個(gè)分割成了200多個(gè)小文件,之后用php來(lái)循環(huán)處理這200多個(gè)文件,可是執(zhí)行到后來(lái)就出現(xiàn)了題目上面的錯(cuò)誤:
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 2611816 bytes)
去百度了一下,原來(lái)是php.ini中的內(nèi)存分配的問(wèn)題,默認(rèn)php代碼能夠申請(qǐng)到的最大內(nèi)存字節(jié)數(shù)就是134217728 bytes,如果代碼執(zhí)行的時(shí)候再需要更多的內(nèi)存,就會(huì)報(bào)錯(cuò)了,于是就將php.ini文件中的配置改了一下:
memory_limit = 128M;//將128M改成了256M
但是之后一想,一個(gè)php腳本一次請(qǐng)求的內(nèi)存空間就要超過(guò)128M,那不管你以后將memory_limit設(shè)置成多大,以后肯定有出問(wèn)題的時(shí)候。
究其原因,是我在在編碼時(shí),僅僅對(duì)變量賦值,卻從來(lái)沒(méi)有 unset ($var) 過(guò)。導(dǎo)致了內(nèi)存占用越來(lái)越多,所以以后一個(gè)變量不再使用之后,一定要記得unset掉它。
下面附上我今天處理這個(gè)日志文件的代碼:
<?php
set_time_limit(1800) ;
/**
* 獲取日志中發(fā)送失敗的郵箱地址
* @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文件中發(fā)送失敗郵箱提取出來(lái)
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 "獲取發(fā)送失敗的郵箱地址".$matches[0]."<br />";
}else{
echo "無(wú)法獲取日志中發(fā)送失敗的郵箱,請(qǐng)檢查";
}
}
}
unset($row);
}
//將提取出來(lái)的發(fā)送失敗郵箱寫(xiě)入到mail.txt文件中
$mailurl=fopen("$name","a");
foreach($mail as $line)
{
fwrite($mailurl,$line."\r\n");
}
echo "將所有發(fā)送失敗的郵箱地址寫(xiě)入".$name."<br />";
fclose($mailurl);
}
getmail(".","mail.txt");
?>
- 解決fatal:remote error:You can''t push to git://github.com/username/*.git問(wèn)題的辦法
- 解決PHP程序運(yùn)行時(shí):Fatal error: Maximum execution time of 30 seconds exceeded in的錯(cuò)誤提示
- PHP中使用register_shutdown_function函數(shù)截獲fatal error示例
- ThinkPHP提示錯(cuò)誤Fatal error: Allowed memory size的解決方法
- php運(yùn)行提示:Fatal error Allowed memory size內(nèi)存不足的解決方法
- php使用ZipArchive提示Fatal error: Class ZipArchive not found in的解決方法
- Windows平臺(tái)的 PHP 報(bào)錯(cuò) Fatal error: Class COM not found in 的解決方法
- PHP中Fatal error session_start()錯(cuò)誤解決步驟
- PHP捕獲Fatal error錯(cuò)誤的方法
- Fatal: the Postfix mail system is already running 解決辦法
相關(guān)文章
PHP內(nèi)核介紹及擴(kuò)展開(kāi)發(fā)指南—基礎(chǔ)知識(shí)
本章簡(jiǎn)要介紹一些Zend引擎的內(nèi)部機(jī)制,這些知識(shí)和Extensions密切相關(guān),同時(shí)也可以幫助我們寫(xiě)出更加高效的PHP代碼。2011-09-09
php setcookie(name, value, expires, path, domain, secure) 參數(shù)
本篇文章是對(duì)php setcookie(name, value, expires, path, domain, secure) 參數(shù)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06
PHP 檢查擴(kuò)展庫(kù)或函數(shù)是否可用的代碼
隨著版本的升高,PHP的功能也越來(lái)越完善,可用的擴(kuò)展庫(kù)和函數(shù)也越來(lái)越多,因此,我們寫(xiě)程序時(shí)也要考慮版本的兼容問(wèn)題,同時(shí)還要考慮服務(wù)器(特別是虛擬主機(jī))是否安裝了擴(kuò)展庫(kù)。2010-04-04
原生JS實(shí)現(xiàn)Ajax通過(guò)GET方式與PHP進(jìn)行交互操作示例
這篇文章主要介紹了原生JS實(shí)現(xiàn)Ajax通過(guò)GET方式與PHP進(jìn)行交互操作,涉及javascript ajax交互及php數(shù)據(jù)接收、處理與數(shù)據(jù)庫(kù)查詢(xún)相關(guān)操作技巧,需要的朋友可以參考下2018-05-05
PHP+MySQL統(tǒng)計(jì)該庫(kù)中每個(gè)表的記錄數(shù)并按遞減順序排列的方法
這篇文章主要介紹了PHP+MySQL統(tǒng)計(jì)該庫(kù)中每個(gè)表的記錄數(shù)并按遞減順序排列的方法,涉及PHP基于PDO操作MySQL數(shù)據(jù)庫(kù)的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2016-02-02

