今天上午剛到公司,就有同事在公司群裡反映某個計畫任務出現問題了。我就懷著刨根問底的心,去檢視了log。發現挺有意思的乙個問題,php記憶體溢位導致指令碼執行失敗。那就一起來看個究竟吧!
首先檢視了計畫任務的log
從報錯資訊字面意思可以看出,允許的134217728 bytes
的記憶體已經用盡,還要試圖分配12961640 bytes
記憶體。
給你(當前指令碼)分配的記憶體你已經用完了,你還想問系統要記憶體。系統這時想對你說:
地主家也沒有餘糧啊(借用葛優大爺的一句話)模擬一下"案發現場"
分析"事故"原因
指令碼一次性讀取了大量的資料(可能是讀的檔案,可能是讀取的資料庫)
如下圖: 往杯子(分配給當前指令碼的記憶體)裡面倒數水(log檔案的資料),杯子容量(記憶體)不夠用
解決方案
既然杯子小 就換個大杯子(增大給指令碼分配的記憶體)治標不治本:ini_set('memory_limit','100m');
把水分批次倒入杯子中(迴圈,分段讀取資料,讀資料庫的話可以用limit)
看看結果
分段讀取也是可以解決問題滴
其他優化方案
-------------------------我是分割線-------------------------
硬廣時間(對nginx感興趣的童鞋可以看下)
引子: webserver與php通訊姿勢熟悉了解nginx與php是怎麼進行通訊的
起手式: php程式猿應該知道的nginx (上)
如何更好的使用nginx和nginx配置
高階式: php程式猿應該知道的nginx (中)
深入理解nginx核心和nginx執行原理,剖析nginx高效能的秘密
實戰篇: php程式猿應該知道的nginx (下)
百聞不如一run 一起來開發乙個nginx的拓展
深入理解PHP記憶體管理之誰動了我的記憶體
首先讓我們看乙個問題 如下 的輸出,var dump memory get usage a laruence var dump memory get usage unset a var dump memory get usage 輸出 在我的個人電腦上,可能會因為系統,php版本,載入的擴充套件不同...
深入理解PHP記憶體管理之誰動了我的記憶體
首先讓我們看乙個問題 如下 的輸出,var dump memory get usage a laruence var dump memory get usage unset a var dump memory get usage 輸出 在我的個人電腦上,可能會因為系統,php版本,載入的擴充套件不同...
深入理解PHP記憶體管理之誰動了我的記憶體
首先讓我們看乙個問題 如下 的輸出,var dump memory get usage a laruence var dump memory get usage unset a var dump memory get usage 輸出 在我的個人電腦上,可能會因為系統,php版本,載入的擴充套件不同...