0

我有一个使用大量魔术方法__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
...

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

4

1 回答 1

0

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

于 2013-01-25T08:59:20.300 回答