誰動了我的記憶體之PHP記憶體溢位

2021-09-17 01:14:41 字數 1076 閱讀 4414

今天上午剛到公司,就有同事在公司群裡反映某個計畫任務出現問題了。我就懷著刨根問底的心,去檢視了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版本,載入的擴充套件不同...