本篇文章展示了PHP防止內存溢出的具體操作,代碼簡明扼要容易理解,絕對能讓你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
站在用戶的角度思考問題,與客戶深入溝通,找到沂南網(wǎng)站設計與沂南網(wǎng)站推廣的解決方案,憑借多年的經驗,讓設計與互聯(lián)網(wǎng)技術結合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:做網(wǎng)站、成都做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣、域名注冊、虛擬主機、企業(yè)郵箱。業(yè)務覆蓋沂南地區(qū)。
內存溢出(Out Of Memory,簡稱OOM)是指應用系統(tǒng)中存在無法回收的內存或使用的內存過多,最終使得程序運行要用到的內存大于能提供的最大內存。此時程序就運行不了,系統(tǒng)會提示內存溢出,有時候會自動關閉軟件,重啟電腦或者軟件后釋放掉一部分內存又可以正常運行該軟件,而由系統(tǒng)配置、數(shù)據(jù)流、用戶代碼等原因而導致的內存溢出錯誤,即使用戶重新執(zhí)行任務依然無法避免。
PHP進程內存大小是可以設置的,默認在配置文件 memory_limit=128M
也可以在程序中動態(tài)設置 ini_set('memory_limit', '1024M');
這樣就設置成1G了。但是一般不會這樣設置,畢竟會影響到機器的其他服務。有時候可以排查一下代碼,很多時候內存溢出是因為php變量沒有及時釋放,或者遍歷比較大的數(shù)組時出現(xiàn)。
1.排查
memory_get_usage()
php有這個系統(tǒng)函數(shù),可以得到當前進程使用了多少內存空間。返回是字節(jié)單位round(memory_get_usage()/1024/1024, 2).'MB'
,轉換為MB
.
可以追蹤代碼執(zhí)行過程中內存的變化。
2.常見內存溢出的案例
遍歷大型數(shù)組,修改數(shù)組的某些值,導致遍歷過程數(shù)組復制一份。
php變量的特點是“寫時復制”,
當涉及$arr數(shù)組賦值時,會產生分裂,生成新的HashTable結構體,導致內存占用瞬間變大
3.遍歷賦值其他變量
$arr = range(0, 599999); echo 'foreach前內存:'.round(memory_get_usage()/1024/1024, 2).'MB', '
'; foreach($arr as $key => $item) { $arr[$key] = $item + 1; if($item % 100000 == 0) { echo 'foreach中內存:'.round(memory_get_usage()/1024/1024, 2).'MB', '
'; } } echo 'foreach后內存:'.round(memory_get_usage()/1024/1024, 2).'MB', '
'; //輸出 /* foreach前內存:49.9MB foreach中內存:81.36MB foreach中內存:84.42MB foreach中內存:87.47MB foreach中內存:90.52MB foreach中內存:93.57MB foreach中內存:96.62MB foreach后內存:49.9MB */
解決方法,采用引用遍歷
$arr = range(0, 599999); echo 'foreach前內存:'.round(memory_get_usage()/1024/1024, 2).'MB', '
'; foreach($arr as $key => &$item) { $arr[$key] = $item + 1; if($item % 100000 == 0) { echo 'foreach中內存:'.round(memory_get_usage()/1024/1024, 2).'MB', '
'; } }unset($key);unset($item);
遍歷完成后記得unset($key);unset($item); 因為$item是對數(shù)組最后一個元素的引用,后面如果修改這個變量,會直接修改到數(shù)組。
看完上述內容,你們掌握PHP防止內存溢出的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!