今天一上班雹拄,發(fā)現(xiàn)維護(hù)的網(wǎng)站除了問(wèn)題蹋辅,看了debug之后送丰,總是出現(xiàn)
Fatal error: Out of memory (allocated 243007488) (tried to allocate 36 bytes)
上網(wǎng)查了后看到是php在執(zhí)行代碼時(shí)怒详,內(nèi)存不夠。隨機(jī)修改php.ini中的memory_limit的值烙懦,設(shè)置成512驱入。
重啟php,測(cè)試還是失敗氯析,程序還是報(bào)之前的錯(cuò)亏较。之后查看了代碼和數(shù)據(jù)庫(kù),發(fā)現(xiàn)在控制器的方法有一個(gè)全表查詢的代碼掩缓,導(dǎo)致內(nèi)存溢出雪情。
$ret = Db::name('locus') -> select();
$time = array();
foreach ($ret as $key => $value){
$time[] = $value['time'];
if(strtotime($time[$key]) == false){
Db::name('locus') ->where('time','=',"$time[$key]") ->delete();
}
}
上面這個(gè)代碼完全是從全表來(lái)查,數(shù)據(jù)量很大拾因。
刪除這一段代碼,測(cè)試成功旷余。
從以上可以得出绢记,代碼中一定要避免大數(shù)據(jù)量的查詢,在條件允許的條件下可以執(zhí)行正卧。要么做嚴(yán)謹(jǐn)?shù)膖ry catch蠢熄,要么去分表,這樣保證數(shù)據(jù)的正常使用炉旷。