這個(gè)報(bào)錯(cuò)在php報(bào)錯(cuò)司空見慣,就是memory_limti值超出了限制導(dǎo)致的報(bào)錯(cuò),簡單粗暴不負(fù)責(zé)任就是改php.ini設(shè)置,或者稍微好點(diǎn)就是init_set("memory_limit","2048M"),但是這兩種都是治標(biāo)不治本,沒有從根本上解決這個(gè)報(bào)錯(cuò),如果數(shù)據(jù)20萬通過改memory_limit可以稍微控制,但是50萬,100萬咧這樣就是無限的擴(kuò)大這個(gè)值導(dǎo)致服務(wù)器隨時(shí)出現(xiàn)問題。
成都創(chuàng)新互聯(lián)公司主要從事成都網(wǎng)站建設(shè)、網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)肥西,10年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):18982081108
redis能不能有效要看程序能否優(yōu)化
確實(shí)需要占用大量內(nèi)存的話 建議不常用的數(shù)據(jù)使用硬盤存儲(chǔ)
使用mysql_unbuffered_query(), 可以避免內(nèi)存的立即占用, 如果返回的結(jié)果存放到array中也是完全沒有問題的, 也不會(huì)出現(xiàn)php查詢mysql數(shù)據(jù)量過大時(shí)導(dǎo)致內(nèi)存溢出問題.
這種情況一般會(huì)在單表數(shù)據(jù)表數(shù)據(jù)庫比較大的時(shí)候出現(xiàn),建議在使用的過程中限制單次讀取數(shù)據(jù)條數(shù),或者對數(shù)據(jù)表進(jìn)行分表
后臺(tái)腳本占用的內(nèi)存是有個(gè)上限的,不是你想用多少就有多少的。
你把文件數(shù)據(jù)用追加的方式寫入文件,而不是把所有數(shù)據(jù)拼接為字符串再一次性寫入文件,就不會(huì)造成內(nèi)存溢出了:
file_put_contents('文件路徑', '要寫入的數(shù)據(jù)', FILE_APPEND);
當(dāng)查詢類容過多時(shí)會(huì)導(dǎo)致php內(nèi)存溢出,建議加limit分段查詢,或著修改php.ini文件的
memory_limit 字段,默認(rèn)是128M,改成你需要的大小
你看看你的程序里面有沒有用到遞歸,或者有沒有死循環(huán)。
另外解決此類問題的主要思想就是分而治之
我覺得是foreach的機(jī)制的問題
foreach($arr as $key=$value){}這里面的$value是每次循環(huán)是把數(shù)組中元素的值賦值給$value
而foreach($arr as $key=$value){}這里的$value是引用賦值。
兩者有什么區(qū)別呢?帶引用的$value可以$value='aaa';直接改變元素的值;還有一個(gè)重要的,就是最后一次循環(huán)之后$value的值還會(huì)保留;
你這里是foreach($obj as $value){}對象默認(rèn)是引用傳值;所以循環(huán)過后要unset($obj);
php里還有一個(gè)函數(shù)clearstatcache(true)清楚文件狀態(tài)緩存,雖然受影響的函數(shù)沒有simplexml_load_file(),不過還是可以試試;
還有mysql系列的函數(shù)很多也不是很穩(wěn)定,有時(shí)候不知道會(huì)出什么問題;建議用PDO;
深感php里面的坑太多了,稍不注意就跳進(jìn)去了。