PHP程序防止內測溢位的排查

2021-09-28 10:36:12 字數 1284 閱讀 3674

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.3. 遍歷賦值其他變數

$arr = range(0, 599999);

echo 'foreach前記憶體:'.round(memory_get_usage()/1024/1024, 2).'mb', '

';foreach($arr as $key => $item)

}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

*/

3.解決方法,採用引用遍歷

$arr = range(0, 599999);

echo 'foreach前記憶體:'.round(memory_get_usage()/1024/1024, 2).'mb', '

';foreach($arr as $key => &$item)

}unset($key);unset($item);

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

php多程序防止出現殭屍程序

對於用php進行多程序併發程式設計,不可避免要遇到殭屍程序的問題。殭屍程序是指的父程序已經退出,而該程序dead之後沒有程序接受,就成為殭屍程序 zombie 程序。任何程序在退出前 使用exit退出 都會變成殭屍程序 用於儲存程序的狀態等資訊 然後由init程序接管。如果不及時 殭屍程序,那麼它在...

PHP多程序中如何防止僵死程序

根據 unix環境高階程式設計 中的定義,僵死程序指的是 乙個已經終止 但是其父程序尚未對其進行善後處理 獲取終止子程序的有關資訊,釋放它仍占用的資源 的程序被稱為僵死程序 zombie 一旦某個程序fork了很多子程序,那麼除非父程序等待取得子程序的終止狀態,否則這些子程序終止後就會變成僵死程序。...

Tweenlite防止記憶體溢位的寫法

對於一些老鳥來說也會出現莫名其妙的記憶體溢位問題,有時候這種 偷襲 會讓我們不知所措,此時可能只有flash builder的profile能告訴我們是哪個狗東西搞得鬼。我們敬愛的導師moonspirit在使用tweenlite時就有過記憶體溢位的經驗,tweenlite是乙個flash動畫補間引擎...