gpt4 book ai didi

php - 使用分层对象结构时如何保持低内存

转载 作者:可可西里 更新时间:2023-11-01 13:21:19 26 4
gpt4 key购买 nike

我有一个简单的对象,它可以拥有相同类型的 child 。

这个对象有一个 toHTML 方法,它做类似的事情:

$html  = '<div>' . $this->name . '</div>';
$html .= '<ul>';

foreach($this->children as $child)
$html .= '<li>' . $child->toHTML() . '</li>';

$html .= '</ul>';

return $html;

问题是,当对象很复杂时,比如很多 child 和 child 等等,内存使用量会猛增。

如果我简单地 print_r 为这个对象提供数据的多维数组,我会得到大约 1 MB 的内存使用量,但是在我将数组转换为我的对象并执行 print $root->toHtml( ) 需要 10 MB !!

我该如何解决这个问题?

====================================

制作了一个与我的真实代码相似的简单类(但更小):

class obj{
protected $name;
protected $children = array();
public function __construct($name){
$this->name = $name;
}
public static function build($name, $array = array()){
$obj = new self($name);
if(is_array($array)){
foreach($array as $k => $v)
$obj->addChild(self::build($k, $v));
}
return $obj;
}
public function addChild(self $child){
$this->children[] = $child;
}
public function toHTML(){
$html = '<div>' . $this->name . '</div>';
$html .= '<ul>';
foreach($this->children as $child)
$html .= '<li>' . $child->toHTML() . '</li>';
$html .= '</ul>';

return $html;
}
}

和测试:

$big = array_fill(0, 500, true);
$big[5] = array_fill(0, 200, $big);

print_r($big);
// memory_get_peak_usage() shows 0.61 MB

$root = obj::build('root', $big);
// memory_get_peak_usage() shows 18.5 MB wtf lol

print $root->toHTML();
// memory_get_peak_usage() shows 24.6 MB

最佳答案

问题是您在内存中缓冲了所有数据,实际上您并不需要这样做,因为您只是在输出数据,而不是实际处理数据。

与其在内存中缓冲所有内容,如果你只想输出它,你应该将它输出到它要去的任何地方:

public function toHTMLOutput($outputStream){
fwrite($outputStream, '<div>' . $this->name . '</div>';
fwrite($outputStream, '<ul>');

foreach($this->children as $child){
fwrite($outputStream, '<li>');
$child->toHTMLOutput($outputStream);
fwrite($outputStream, '</li>');}
}

fwrite($outputStream, '</ul>');
}

$stdout = fopen('php://stdout', 'w');
print $root->toHTMLOutput($stdout);

或者如果你想将输出保存到文件中

$stdout = fopen('htmloutput.html', 'w');
print $root->toHTMLOutput($stdout);

很明显,我只为 toHTML() 函数实现了它,但同样的原则应该为 build 函数实现,这可能会导致你跳过一个单独的toHTML 函数。

关于php - 使用分层对象结构时如何保持低内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17252825/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com