PHP記憶體溢位

2021-09-13 15:02:06 字數 859 閱讀 7938

今天上午剛到公司,就有同事在公司群裡反映某個計畫任務出現問題了。我就懷著刨根問底的心,去檢視了log。發現挺有意思的乙個問題,php記憶體溢位導致指令碼執行失敗。那就一起來看個究竟吧!

首先檢視了計畫任務的log

log_error.png

從報錯資訊字面意思可以看出,允許的134217728 bytes的記憶體已經用盡,還要試圖分配12961640 bytes記憶體。

給你(當前指令碼)分配的記憶體你已經用完了,你還想問系統要記憶體。系統這時想對你說:

地主家也沒有餘糧啊(借用葛優大爺的一句話)

geyou.png

模擬一下"案發現場"

log_size.png

test_mem_1.png

test_run_res.png

分析"事故"原因

指令碼一次性讀取了大量的資料(可能是讀的檔案,可能是讀取的資料庫)

如下圖: 往杯子(分配給當前指令碼的記憶體)裡面倒數水(log檔案的資料),杯子容量(記憶體)不夠用

解決方案

a. 既然杯子小 就換個大杯子(增大給指令碼分配的記憶體)治標不治本: ini_set('memory_limit','100m');

new_1.png

b. 把水分批次倒入杯子中(迴圈,分段讀取資料,讀資料庫的話可以用limit)

code_1.png

看看結果

run_res_new.png

分段讀取也是可以解決問題滴

其他優化方案

(php變數底層實現是乙個_zval_struct結構體,refcount_gc表示引用計數 is_ref__gc表示是否為引用)

PHP記憶體溢位解決方案

一 記憶體溢位解決方案 在做資料統計分析時,經常會遇到大陣列,可能會發生記憶體溢位,這裡分享一下我的解決方案。還是用例子來說明這個問題,如下 假定日誌中存放的記錄數為500000條,那麼解決方案如下 ini set memory limit 64m 重置php可以使用的記憶體大小為 64m,一般在遠...

PHP記憶體溢位解決方案

一 記憶體溢位解決方案 在做資料統計分析時,經常會遇到大陣列,可能會發生記憶體溢位,這裡分享一下我的解決方案。還是用例子來說明這個問題,如下 假定日誌中存放的記錄數為500000條,那麼解決方案如下 ini set memory limit 64m 重置php可以使用的記憶體大小為 64m,一般在遠...

棧溢位,記憶體溢位

對於一台伺服器而言,每乙個使用者請求,都會產生乙個執行緒來處理這個請求,每乙個執行緒對應著乙個棧,棧會分配記憶體,此時如果請求過多,這時候記憶體不夠了,就會發生棧記憶體溢位。棧溢位是指不斷的呼叫方法,不斷的壓棧,最終超出了棧允許的棧深度,就會發生棧溢位,比如遞迴操作沒有終止,死迴圈。可以把記憶體比作...