首頁  >  文章  >  後端開發  >  關於PHP進程防止記憶體溢出的排查

關於PHP進程防止記憶體溢出的排查

藏色散人
藏色散人轉載
2020-06-24 13:42:112392瀏覽

PHP進程記憶體大小是可以設定的,預設在設定檔memory_limit=128M

也可以在程式中動態設置ini_set('memory_limit', '1024M');這樣就設定成1G了。但是一般不會這樣設置,畢竟會影響到機器的其他服務。有時候可以排查一下程式碼,很多時候記憶體溢位是因為php變數沒有及時釋放,或是遍歷比較大的陣列時出現。

1.檢查

memory_get_usage() php有這個系統函數,可以得到目前行程使用了多少記憶體空間。返回是字節單位round(memory_get_usage()/1024/1024, 2).'MB',轉換為MB.

#可以追蹤程式碼執行過程中內存的變化。

2.常見記憶體溢出的案例

遍歷大型數組,修改數組的某些值,導致遍歷過程數組複製一份。

php變數的特徵是“寫入時複製”,

當涉及$arr數組賦值時,會產生分裂,產生新的HashTable結構體,導致記憶體佔用瞬間變大

3.遍歷賦值其他變數

$arr = range(0, 599999);
echo &#39;foreach前内存:&#39;.round(memory_get_usage()/1024/1024, 2).&#39;MB&#39;, &#39;<br/>&#39;;
foreach($arr as $key => $item) {
    $arr[$key] = $item + 1;
    if($item % 100000 == 0) {
        echo &#39;foreach中内存:&#39;.round(memory_get_usage()/1024/1024, 2).&#39;MB&#39;, &#39;<br/>&#39;;
    }
}
echo &#39;foreach后内存:&#39;.round(memory_get_usage()/1024/1024, 2).&#39;MB&#39;, &#39;<br/>&#39;;

//输出
/*
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 &#39;foreach前内存:&#39;.round(memory_get_usage()/1024/1024, 2).&#39;MB&#39;, &#39;<br/>&#39;;

foreach($arr as $key => &$item) {
    $arr[$key] = $item + 1;
    if($item % 100000 == 0) {
        echo &#39;foreach中内存:&#39;.round(memory_get_usage()/1024/1024, 2).&#39;MB&#39;, &#39;<br/>&#39;;
    }
}unset($key);unset($item);

遍歷完成後記得unset($key);unset($item);  因為$item是對數組最後一個元素的引用,後面如果修改這個變量,就會直接修改到數組。

推薦:《PHP影片教學

以上是關於PHP進程防止記憶體溢出的排查的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:csdn.net。如有侵權,請聯絡admin@php.cn刪除