2013-01-15 60 views
4

我使用SimplePie與PHP 5.3(啓用gc)來解析我的RSS提要。使用$item->get_permalink()

SimplePie without using get_permalink()

但是,我的記憶:做類似以下時,這工作得很好,沒有任何問題:

$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(); 
} 

內存調試超過100次迭代(與不同 RSS源)調試看起來像100多次迭代(不同 RSS提要)。

代碼產生問題

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(); 
} 

SimplePie get_permalink memory leak

事情我已經試過

  • 使用get_link代替get_permalink
  • 使用__destroy提到here(即使它應該是固定的爲5.3)

當前的調試過程

我似乎已經查明問題到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截至目前。

我能做些什麼來解決這個問題?

回答

9

這實際上不是內存泄漏,而是沒有被清理的靜態函數緩存!

這是由於SimplePie_IRI::set_iri(和set_authorityset_path)。他們設置了一個靜態的$cache變量,但是當創建一個新的SimplePie實例時,它們不會取消設置或清除這個變量,這意味着變量只會變得越來越大。

這可以通過改變

public function set_authority($authority) 
{ 
    static $cache; 

    if (!$cache) 
     $cache = array(); 

    /* etc */ 

被固定到

public function set_authority($authority, $clear_cache = false) 
{ 
    static $cache; 
    if ($clear_cache) { 
     $cache = null; 
     return; 
    } 

    if (!$cache) 
     $cache = array(); 

    /* etc */ 

..等在下面的功能:

  • set_iri
  • set_authority
  • set_path

並增加了析構函數SimplePie_IRI使用靜態緩存調用所有功能,與true參數在$ clear_cache中,將工作:

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

現在將導致內存消耗不隨時間增益:

SimplePie fixed

Git Issue

+0

怎麼樣拉請求了SimplePie? – uzyn

+0

而當你在它的時候,從該函數中移除靜態變量並移動到該類,這樣就不需要向與此無關的函數引入另一個可選參數。如果您只希望能夠在類函數中重置它,則可以將其設置爲私有靜態。 +1查找原因。 – hakre

+0

嗨h2oooooo 你的解決方案似乎解決了我使用php 5.2.17時遇到的問題。但如果我使用5.3.28的服務器,它似乎無法正常工作。這是預期的嗎? (有沒有解決這個問題的另一種方法?) 謝謝! –

相關問題