Tengo la siguiente función a la que llamo con mucha frecuencia en un bucle.PHP ¿La recolección de basura es una mierda o solo soy yo?
Esperé 5 minutos mientras la memoria ascendía de 1MB a 156MB. ¿No debería subir el recolector de garabatos de PHP y reducir esto en algún momento?
¿Es porque he configurado el límite de memoria en 256MB?
En el punto de eco 2,3,4 es bastante constante el uso de la memoria. Me baja medio mi mego en el punto 4. Pero el punto 1 es donde ocurre el aumento de la memoria principal. Probablemente debido a file_get_html
cargando el archivo html en la memoria.
Yo pensé que la variable $html
clara y no configurada se encargaría de esto?
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 />';
}
Como puede ver, intenté hacer uso de unset débilmente. Aunque no es bueno, como entiendo, no "desconectará" la memoria tan pronto como la llame.
Gracias a todos por cualquier ayuda sobre cómo puedo reducir este aumento de la memoria.
obtengo un representante de Negat por mi pregunta? Como dicen las notificaciones útiles de stackoverflow. No se limite a neg rep, si lo hace, sígalo por un comentario. – Abs
Encuentro una buena pregunta en realidad. Tal vez es la palabra 'chupar' lo que provocó esto. Upvoted. – Mchl
En php, toda la memoria utilizada por una solicitud http se anula al final de la solicitud. Sin embargo, el gc se usa para administrar la memoria mientras se procesa la solicitud. Creo que es simple conteo de ref. – seand