2012-06-29 80 views
0

我有一個使用了很多魔法__call的腳本。 該腳本有15 000個迭代並且對象更大。內存增長後,每次迭代之後。我使用unset或$ val = null;但內存繼續增長。Php5.3魔法__call和內存

我該怎麼辦?

個例:

$data = null; 
foreach ($field['method']['actions'] as $action) { 
    // si l'action ne concerne pas le name space principal 
    if (!array_key_exists('get', $action)) { 
     continue; 
    } 
    if (array_key_exists('begin', $action)) { 
     $data .= $action['begin']; 
    } 
    if (array_key_exists('action', $action)) { 
     $obj = $notice->__call('get' . ucfirst($action['action'])); 
     $notice->clear(); 
     if (is_object($obj)) { 
      $rsl = $obj->__call('get' . ucfirst($action['get'])); 
      $obj->clear(); 
      echo "\n" . 'get' . ucfirst($action['get']) . ' : ' . number_format(memory_get_usage()); 
      $data .= $rsl; 
      unset($rsl); 
     } else { 
      $data .=''; 
     } 
     $obj = null; 
    } else { 
     $data .= $notice->__call('get' . ucfirst($action['get'])); 
     $notice->clear(); 
     echo "\n" . 'get' . ucfirst($action['get']) . ' : ' . number_format(memory_get_usage()); 
    } 
    if (array_key_exists('end', $action)) { 
     $data .= $action['end']; 
    } 
} 
//-- 
class Notice{ 
    //-- 

    protected $instanceObj = null; 

    public function __call($name, $arguments = null) { 
     $this->instanceObj = $this->$name($arguments); 
     return $this->instanceObj; 
    } 

    public function clear(){ 
     $this->instanceObj = null; 
    } 

    //-- 
} 

日誌文件的爲例:

getField : 24,446,752 
getField : 24,447,352 
getField : 24,447,720 
getField : 24,448,096 
getField : 24,483,320 
getField : 24,483,336 
getField : 24,483,728 
... 
getField : 25,267,936 
... 
getField : 35,596,712 
... 

你可以看到內存從來沒有停下來的眉毛。

+0

如果您認爲您在PHP中發現了內存泄漏,您可以發佈錯誤報告並獲得「謝謝,但這不是錯誤」的答覆。這就是PHP通常會遇到的bug。否則,如果您可以創建一個仍然存在內存泄漏的簡單示例並將其發佈到此處,那麼我們可以看看是否有其他問題。 – lanzz

+0

我的問題已完成 – vinzcoco

+0

您的代碼不足以重現您的問題。你並沒有調用'Notice :: __ call()'作爲一種神奇的方法_at all_(你明確地調用它,所以沒有什麼不可思議的事情發生),你調用'__call()'方法內的其他'Notice'方法這在你的例子中沒有定義,並且沒有輸入數據('$ field ['method'] ['actions']'數組)來運行你的代碼。 – lanzz

回答

0

唯一的解決方案是對腳本執行幾次執行。問題不在於PHP Symfony,而是生成了太多的對象。所以我運行劇本Pacquet x。否則會導致內存飽和。