天天看點

php 記憶體洩漏

所謂記憶體洩漏是指進稱在執行過程中,記憶體的占有率逐漸升高,不釋放, 系統所擁有的可用記憶體越來越少的現象。

php-fpm耗光記憶體,不釋放,就是所謂的記憶體洩漏,記憶體洩漏對長期運作的程式有威脅,是以應該定期重新開機程序,例如php-fpm裡面有個配置,max-request,就是控制fast-cgi程序處理多少個請求後重新開機,這樣系統可用釋放記憶體,但是如果記憶體占用率增長速度非常快,頻繁重新開機程序,就會影響服務的穩定性,是以這個問題必須正面解決。

後來,我才發現其實不需要去修改php的源代碼,php.ini配置檔案裡面有兩個配置項: auto_append_file,auto_prepend_file,可以在請求前後注入代碼 ....

真是悲劇

web程式做性能優化也是這個思路,但是要簡單很多,無需寫代碼,在nginx log裡面加上$request_time ,用awk/sort 處理一下就可以找出瓶頸。

可能有很多的讀者碰到過類似下面的錯誤吧:

這個錯誤的資訊很明确,PHP已經達到了允許使用的最大記憶體了,通常上來說這很有可能是我們的程式編寫的有些問題。比如:一次性讀取超大的檔案到記憶體中,或者出現超大的數組,或者在大循環中的沒有及時是放掉不再使用的變量,這些都有可能會造成記憶體占用過大而被終止。

PHP預設的最大記憶體使用大小是32M, 如果你真的需要使用超過32M的記憶體可以修改php.ini配置檔案的如下配置:

如果你無法修改php配置檔案,如果你的PHP環境沒有禁用ini_set()函數,也可以動态的修改最大的記憶體占用大小:

既然我們能動态的調整最大的記憶體占用,那我們是否有辦法擷取目前的記憶體占用情況呢?答案是肯定的。

memory_get_usage(),這個函數的作用是擷取目前PHP腳本所用的記憶體大小。

memory_get_peak_usage(),這個函數的作用傳回目前腳本到目前位置所占用的記憶體峰值,這樣就可能擷取到目前的腳本的記憶體需求情況。