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:
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 deget_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?