4

私はRSSフィードを解析するためにPHP5.3(gcが有効になっている)でSimplePieを使用しています。これは、次のようなことを行うときに問題なくうまく機能します。

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

SimplePieget_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(およびset_authority、および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 */

..以下の関数で:

  • 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 に答える