Php5.3魔法__call和Memory

时间:2012-06-29 09:49:53

标签: memory call php-5.3

我有一个使用大量Magic方法__call的脚本。 该脚本有15 000次迭代,对象更大。 每次迭代后,内存都会增长。我使用unset或$ val = null;但记忆力继续增长。

我该怎么办?

一个例子:

$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
...

你可以看到记忆永远不会停留在眉毛上。

1 个答案:

答案 0 :(得分:0)

唯一的解决方案是对脚本进行多次执行。问题不是PHP Symfony,而是生成太多对象。所以我运行了Pacquet x脚本。否则会导致内存饱和。