【发布时间】:2011-03-23 22:11:34
【问题描述】:
我有下面的函数,我在循环中非常频繁地调用它。
当内存从 1MB 上升到 156MB 时,我等了 5 分钟。 PHP的垃圾收集器不应该在某个时候出现并减少它吗?!
是因为我将内存限制设置为 256MB 吗?
在回显点 2、3、4 处,其内存使用量相当稳定。它在第 4 点下降了半兆。但第 1 点是主内存增加的地方。可能是因为file_get_html在内存中加载了html文件。
我虽然清除和取消设置变量 $html 会解决这个问题?
function get_stuff($link, $category ){
$html = file_get_html(trim("$link"));
$article = $html->find('div[class=searchresultsWidget]', 0);
echo '1 - > '.convert(memory_get_usage(true)).'<br />';
foreach($article->find('h4 a') as $link){
$next_url = 'http://new.mysite.com'.$link->href;
$font_name = trim($link->plaintext);
$html = file_get_html(trim("$next_url"));
$article = $html->find('form[class=addtags]', 0);
$font_tags = '';
foreach($article->find('ul[class=everyone_tags] li a span') as $link){
$font_tags .= trim($link->innertext).',';
}
echo '2 - > '.convert(memory_get_usage(true)).'<br />';
$font_name = mysql_real_escape_string($font_name);
$category = mysql_real_escape_string($category);
$font_tags = mysql_real_escape_string($font_tags);
$sql = "INSERT INTO tag_data (font_name, category, tags) VALUES ('$font_name', '$category', '$font_tags')";
unset($font_tags);
unset($font_name);
unset($category);
$html->clear();
mysql_query($sql);
unset($sql);
echo '3 - > '.convert(memory_get_usage(true)).'<br />';
}
unset($next_url);
unset($link);
$html->clear();
unset($html);
unset($article);
echo '4 - > '.convert(memory_get_usage(true)).'<br />';
}
如您所见,我尝试使用 unset 无力。尽管据我所知它并不好,但它不会在我调用它时立即“取消”记忆。
感谢大家对我如何减少这种向上的记忆力的帮助。
【问题讨论】:
-
我的问题被否定了?就像来自 stackoverflow 的有用通知一样。不要只是否定代表,如果你这样做了,请在评论后跟随它。
-
我觉得这是一个很好的问题。也许是“吸”这个词引起了这一切。赞成。
-
在 php 中,http 请求使用的所有内存在请求结束时都会被销毁。但是 gc 用于在处理请求时管理内存。我相信这是简单的参考计数。
-
@seand 大多数情况下(即,当使用
zval_ptr_dtor时)一个变量的引用计数减少并且它达到 0,PHP 会立即释放它。这是简单的参考计数。但是 PHP 5.3 还引入了一个不时运行以捕获循环引用的垃圾收集器。是的,当请求结束时,所有的非持久内存都会被释放。 -
你用的是什么版本的php?
标签: php memory garbage-collection