php memory-leaks simplepie

php - ¿Por qué obtengo fugas de memoria en SimplePie cuando uso $ item-> get_permalink()?



memory-leaks (1)

En realidad, esto no es una pérdida de memoria, sino cachés de funciones estáticas que no se limpian.

Esto se debe a SimplePie_IRI::set_iri (y set_authority , y set_path ). Establecen una variable estática de $cache , pero no la desarman ni la limpian cuando se crea una nueva instancia de SimplePie , lo que significa que las variables solo se hacen más y más grandes.

Esto se puede arreglar cambiando

public function set_authority($authority) { static $cache; if (!$cache) $cache = array(); /* etc */

a

public function set_authority($authority, $clear_cache = false) { static $cache; if ($clear_cache) { $cache = null; return; } if (!$cache) $cache = array(); /* etc */

..etc en las siguientes funciones:

  • set_iri ,
  • set_authority ,
  • set_path ,

Y agregar un destructor a SimplePie_IRI llamando a todas las funciones usando un caché estático, con un parámetro de true en $ clear_cache, funcionará:

/** * Clean up */ public function __destruct() { $this->set_iri(null, true); $this->set_path(null, true); $this->set_authority(null, true); }

Lo que ahora no generará ninguna ganancia en el consumo de memoria a lo largo del tiempo:

Git Issue

Estoy usando SimplePie con PHP 5.3 (con gc habilitado) para analizar mis feeds RSS. Esto funciona bien y sin problemas al hacer algo como lo siguiente:

$simplePie = new SimplePie(); $simplePie->set_feed_url($rssURL); $simplePie->enable_cache(false); $simplePie->set_max_checked_feeds(10); $simplePie->set_item_limit(0); $simplePie->init(); $simplePie->handle_content_type(); foreach ($simplePie->get_items() as $key => $item) { $item->get_date("Y-m-d H:i:s"); $item->get_id(); $item->get_title(); $item->get_content(); $item->get_description(); $item->get_category(); }

Depuración de memoria de más de 100 iteraciones (con diferentes fuentes RSS):

Pero cuando $item->get_permalink() , la depuración de mi memoria se ve así en más de 100 iteraciones (con diferentes fuentes RSS).

Código para producir un problema :

foreach ($simplePie->get_items() as $key => $item) { $item->get_date("Y-m-d H:i:s"); $item->get_id(); $item->get_title(); $item->get_permalink(); //This creates a memory leak $item->get_content(); $item->get_description(); $item->get_category(); }

Cosas que he intentado :

  • Usando get_link lugar de get_permalink
  • Usando __destroy como se menciona aquí (aunque debería ser reparado para 5.3)

Proceso actual de depuración :

Parece que he rastreado el problema hasta SimplePie_Item::get_permalink -> SimplePie_Item::get_link -> SimplePie_Item::get_links -> SimplePie_Item::sanitize -> SimplePie::sanitize -> SimplePie_Sanitize::sanitize -> SimplePie_Registry::call - > SimplePie_IRI::absolutize partir de ahora.

¿Qué puedo hacer para arreglar esto?