4

我正在使用SimplePie和 PHP 5.3(启用 gc)来解析我的 RSS 提要。这在执行以下操作时效果很好并且没有问题:

$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 提要):

不使用 get_permalink() 的 SimplePie

但是在使用 时$item->get_permalink(),我的内存调试看起来像这样超过 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 内存泄漏

我尝试过的事情

  • 使用get_link代替get_permalink
  • 使用这里__destroy提到的(即使它应该为 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

我能做些什么来解决这个问题?

4

1 回答 1

9

这实际上不是内存泄漏,而是没有被清理的静态函数缓存!

这是由于SimplePie_IRI::set_iri(and set_authority, and set_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 */

..etc 在以下功能中:

  • set_iri,
  • set_authority,
  • set_path,

并且添加一个析构SimplePie_IRI函数以使用静态缓存调用所有函数,参数为truein $clear_cache,将起作用:

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

现在,随着时间的推移,内存消耗不会增加:

SimplePie 已修复

Git问题

于 2013-01-15T12:56:22.213 回答