我正在使用 simple_html_dom。
我发现在"parse"
函数中运行的"load"
函数会导致似乎找不到原因的内存泄漏。
我已经尝试过"$html->clear"
,"unset($html)"
也"clean_all"
来自Flash Thunder的回答。
经过所有这些工作,记忆仍然没有清理干净。
我在这里的结果:http: //i.stack.imgur.com/CYFeS.jpg
所以,我想知道我该怎么做才能清除那个幽灵记忆?
这是我的测试代码:
<?
include('include/simple_html_dom.php');
ini_set('memory_limit', '128M');
echo 'memory =',round(memory_get_usage()/1000),' KB<br>';
$url = 'http://www.marketwatch.com/';
$html = file_get_html($url);
foreach($html->find('div#mostpopular img') as $images){
if($images->src !='')echo $images-> outertext ;
}
echo '<br>';
echo 'memory before clear =',round(memory_get_usage()/1000),' KB<br>';
$html->clear;
$images->clear;
unset($html);
unset($images);
echo 'memory after clear =',round(memory_get_usage()/1000),' KB<br>';
echo 'memory before clean_all =',round(memory_get_usage()/1000),' KB<br>';
clean_all($GLOBALS);
echo 'memory after clean_all =',round(memory_get_usage()/1000),' KB<br>';
function clean_all(&$items,$leave = ''){
foreach($items as $id => $item){
if($leave && ((!is_array($leave) && $id == $leave) || (is_array($leave) && in_array($id,$leave)))) continue;
if($id != 'GLOBALS'){
if(is_object($item) && ((get_class($item) == 'simple_html_dom') || (get_class($item) == 'simple_html_dom_node'))){
$items[$id]->clear();
unset($items[$id]);
}else if(is_array($item)){
$first = array_shift($item);
if(is_object($first) && ((get_class($first) == 'simple_html_dom') || (get_class($first) == 'simple_html_dom_node'))){
unset($items[$id]);
}
unset($first);
}
}
}
}
?>
另外,我在 simple_html_dom.php 中放了一些代码(echo memory_get_usage)。经过几次尝试,我发现事情发生在“加载”函数中(大约在第 818 行):
// load html from string
function load($str, $lowercase=true, $stripRN=true, $defaultBRText=DEFAULT_BR_TEXT) {
global $debugObject;
// prepare
$this->prepare($str, $lowercase, $stripRN, $defaultBRText);
// strip out comments
$this->remove_noise("'<!--(.*?)-->'is");
// strip out cdata
$this->remove_noise("'<!\[CDATA\[(.*?)\]\]>'is", true);
// Per sourceforge http://sourceforge.net/tracker/?func=detail&aid=2949097&group_id=218559&atid=1044037
// Script tags removal now preceeds style tag removal.
// strip out <script> tags
$this->remove_noise("'<\s*script[^>]*[^/]>(.*?)<\s*/\s*script\s*>'is");
$this->remove_noise("'<\s*script\s*>(.*?)<\s*/\s*script\s*>'is");
// strip out <style> tags
$this->remove_noise("'<\s*style[^>]*[^/]>(.*?)<\s*/\s*style\s*>'is");
$this->remove_noise("'<\s*style\s*>(.*?)<\s*/\s*style\s*>'is");
// strip out preformatted tags
$this->remove_noise("'<\s*(?:code)[^>]*>(.*?)<\s*/\s*(?:code)\s*>'is");
// strip out server side scripts
$this->remove_noise("'(<\?)(.*?)(\?>)'s", true);
// strip smarty scripts
$this->remove_noise("'(\{\w)(.*?)(\})'s", true);
// parsing
echo 'memory before parsing() =',round(memory_get_usage()/1000),' KB<br>';
while ($this->parse());
echo 'memory after parsing() =',round(memory_get_usage()/1000),' KB<br>';
// end
$this->root->_[HDOM_INFO_END] = $this->cursor;
$this->parse_charset();
}