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
...
你可以看到內存從來沒有停下來的眉毛。
如果您認爲您在PHP中發現了內存泄漏,您可以發佈錯誤報告並獲得「謝謝,但這不是錯誤」的答覆。這就是PHP通常會遇到的bug。否則,如果您可以創建一個仍然存在內存泄漏的簡單示例並將其發佈到此處,那麼我們可以看看是否有其他問題。 – lanzz
我的問題已完成 – vinzcoco
您的代碼不足以重現您的問題。你並沒有調用'Notice :: __ call()'作爲一種神奇的方法_at all_(你明確地調用它,所以沒有什麼不可思議的事情發生),你調用'__call()'方法內的其他'Notice'方法這在你的例子中沒有定義,並且沒有輸入數據('$ field ['method'] ['actions']'數組)來運行你的代碼。 – lanzz