天天看點

PHP--記憶體洩漏

一個PHP腳本。一般都不用考慮記憶體洩漏和垃圾回收的問題,因為腳本很快就執行完退出了,每個頁面處理結束,建立的simple_html_dom對象就會被銷毀。 

但當運作時間長,資料量大的時候,程式運作一段時間後,PHP腳本就占用了過多記憶體,然後報錯:

PHP Fetal error:Allowed memory size of 1342117728 bytes exhausted

1

PHP垃圾回收機制

PHP5.3之前使用的垃圾回收機制是單純的“引用計數”,也就是每個記憶體對象都配置設定了一個計數器,當記憶體對象被變量引用時,計數器+1,當變量引用撤掉時,計數器-1,當計數器等于0時,表明記憶體對象沒有被使用,該記憶體對象則進行銷毀,垃圾回收完成。 

“引用計數”存在問題是當兩個或多個對象互相引用形成環狀後,記憶體對象的計數器不會消減為0,這一組記憶體對象沒用時,不能進行回收,導緻記憶體洩漏。 

從PHP5.3開始,使用了新的垃圾回收機制,在引用計數的基礎上,實作了複雜的算法,來檢測記憶體對象中引用環的存在,以避免記憶體洩漏。

1
 2
 3
 記憶體洩漏執行個體
 class A{
     private $b;
     function __construct()
     {
         $this->b = new B($this);
     }
     function __destruct()
     {
         // TODO: Implement __destruct() method.
         echo "A destruct";
     }
 }class B {
     private $a;
     function __construct($a)
     {
         $this->a = $a;
     }
     function __destruct()
     {
         // TODO: Implement __destruct() method.
         echo "B destruct";
     }
 }for ($i = 0;;$i++) {
     $a = new A();
     echo memory_get_usage()."\n";