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 處理一下就可以找出瓶頸。

 

 

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

Fatal error: Allowed memory size of X bytes exhausted (tried to allocate Y bytes)

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

PHP默認的最大內存使用大小是32M, 如果你真的需要使用超過32M的內存可以修改php.ini配置文件的如下配置:

memory_limit = 32M

如果你無法修改php配置文件,如果你的PHP環境沒有禁用ini_set()函數,也可以動態的修改最大的內存占用大小:

<?php
ini_set("memory_limit", "128M");

既然我們能動態的調整最大的內存占用,那我們是否有辦法獲取目前的內存占用情況呢?答案是肯定的。

  1. memory_get_usage(),這個函數的作用是獲取目前PHP腳本所用的內存大小。
  2. memory_get_peak_usage(),這個函數的作用返回當前腳本到目前位置所占用的內存峰值,這樣就可能獲取到目前的腳本的內存需求情況。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM