亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

誰動(dòng)了我的內(nèi)存之PHP內(nèi)存溢出

wangshijun / 2766人閱讀

摘要:發(fā)現(xiàn)挺有意思的一個(gè)問題,內(nèi)存溢出導(dǎo)致腳本執(zhí)行失敗。那就一起來看個(gè)究竟吧首先查看了計(jì)劃任務(wù)的從報(bào)錯(cuò)信息字面意思可以看出,允許的的內(nèi)存已經(jīng)用盡,還要試圖分配內(nèi)存。給你當(dāng)前腳本分配的內(nèi)存你已經(jīng)用完了,你還想問系統(tǒng)要內(nèi)存。

今天上午剛到公司,就有同事在公司群里反映某個(gè)計(jì)劃任務(wù)出現(xiàn)問題了。我就懷著刨根問底的心,去查看了log。發(fā)現(xiàn)挺有意思的一個(gè)問題,PHP內(nèi)存溢出導(dǎo)致腳本執(zhí)行失敗。那就一起來看個(gè)究竟吧!

首先查看了計(jì)劃任務(wù)的Log

從報(bào)錯(cuò)信息字面意思可以看出,允許的134217728 bytes的內(nèi)存已經(jīng)用盡,還要試圖分配12961640 bytes內(nèi)存。
給你(當(dāng)前腳本)分配的內(nèi)存你已經(jīng)用完了,你還想問系統(tǒng)要內(nèi)存。系統(tǒng)這時(shí)想對(duì)你說:

地主家也沒有余糧啊(借用葛優(yōu)大爺?shù)囊痪湓?

模擬一下"案發(fā)現(xiàn)場(chǎng)"

新建一個(gè)mem_exhausted.php文件 copy過來一個(gè)2.4M的log文件做測(cè)試用

寫個(gè)簡(jiǎn)單的腳本重現(xiàn)"案發(fā)現(xiàn)場(chǎng)" 故意分配1M的內(nèi)存 來讀取2.4M的log

執(zhí)行腳本,"案發(fā)現(xiàn)場(chǎng)"重現(xiàn)

分析"事故"原因
腳本一次性讀取了大量的數(shù)據(jù)(可能是讀的文件,可能是讀取的數(shù)據(jù)庫)

如下圖: 往杯子(分配給當(dāng)前腳本的內(nèi)存)里面倒數(shù)水(log文件的數(shù)據(jù)),杯子容量(內(nèi)存)不夠用

解決方案

既然杯子小 就換個(gè)大杯子(增大給腳本分配的內(nèi)存)治標(biāo)不治本: ini_set("memory_limit","100M");

把水分批次倒入杯子中(循環(huán),分段讀取數(shù)據(jù),讀數(shù)據(jù)庫的話可以用limit)

看看結(jié)果

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

其他優(yōu)化方案

應(yīng)當(dāng)盡可能減少靜態(tài)變量的使用,在需要數(shù)據(jù)重用時(shí),可以考慮使用引用(&)。

數(shù)據(jù)庫操作完成后,要馬上關(guān)閉連接;

一個(gè)對(duì)象使用完,要及時(shí)調(diào)用析構(gòu)函數(shù)(__destruct())

用過的變量及時(shí)銷毀(unset())掉

可以使用memory_get_usage()函數(shù),獲取當(dāng)前占用內(nèi)存 根據(jù)當(dāng)前使用的內(nèi)存來調(diào)整程序

unset()函數(shù)只能在變量值占用內(nèi)存空間超過256字節(jié)時(shí)才會(huì)釋放內(nèi)存空間。(PHP內(nèi)核的gc垃圾回收機(jī)制決定)

有當(dāng)指向該變量的所有變量(如引用變量)都被銷毀后,才會(huì)釋放內(nèi)存
(PHP變量底層實(shí)現(xiàn)是一個(gè)_zval_struct結(jié)構(gòu)體,refcount_gc表示引用計(jì)數(shù) is_ref__gc表示是否為引用)

-------------------------我是分割線-------------------------

硬廣時(shí)間(對(duì)Nginx感興趣的童鞋可以看下)
Nginx系列課程索引

引子: WebServer與PHP通信姿勢(shì)
熟悉了解Nginx與PHP是怎么進(jìn)行通信的

起手式: PHP程序猿應(yīng)該知道的Nginx (上)
如何更好的使用Nginx和Nginx配置

進(jìn)階式: PHP程序猿應(yīng)該知道的Nginx (中)
深入理解Nginx內(nèi)核和Nginx運(yùn)行原理,剖析Nginx高性能的秘密

實(shí)戰(zhàn)篇: PHP程序猿應(yīng)該知道的Nginx (下)
百聞不如一run 一起來開發(fā)一個(gè)Nginx的拓展

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/22660.html

相關(guān)文章

  • 誰動(dòng)我的內(nèi)存PHP內(nèi)存溢出

    摘要:發(fā)現(xiàn)挺有意思的一個(gè)問題,內(nèi)存溢出導(dǎo)致腳本執(zhí)行失敗。那就一起來看個(gè)究竟吧首先查看了計(jì)劃任務(wù)的從報(bào)錯(cuò)信息字面意思可以看出,允許的的內(nèi)存已經(jīng)用盡,還要試圖分配內(nèi)存。給你當(dāng)前腳本分配的內(nèi)存你已經(jīng)用完了,你還想問系統(tǒng)要內(nèi)存。 今天上午剛到公司,就有同事在公司群里反映某個(gè)計(jì)劃任務(wù)出現(xiàn)問題了。我就懷著刨根問底的心,去查看了log。發(fā)現(xiàn)挺有意思的一個(gè)問題,PHP內(nèi)存溢出導(dǎo)致腳本執(zhí)行失敗。那就一起來看個(gè)...

    jlanglang 評(píng)論0 收藏0
  • PHPer、Laravel 面試可能會(huì)遇到的問題及答案

    摘要:如何實(shí)現(xiàn)持久化持久化,將在內(nèi)存中的的狀態(tài)保存到硬盤中,相當(dāng)于備份數(shù)據(jù)庫狀態(tài)。相當(dāng)于備份數(shù)據(jù)庫接收到的命令,所有被寫入的命令都是以的協(xié)議格式來保存的。 最近社區(qū)里面有一篇文章引起了最多程序猿的關(guān)注,Laravel、PHPer 面試可能會(huì)遇到的問題,看評(píng)論區(qū)不少小伙伴們被難倒,對(duì)于一些問題同樣難倒了我(其實(shí)有很多啦),趁著周末有空,又總結(jié)梳理了一遍,順便來答一波題。由于個(gè)人技術(shù)水平有限,答...

    fanux 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<