PHPのメモリリークに関する質問です。

コマンドラインより以下のプログラムを実行すると、毎秒4~5Mずつメモリ使用量が増加します。

<?php
require_once("Text/Wiki/Mediawiki.php");
$d = <<< EOF
aaaabbbb
EOF;

while(1){
$wiki=new Text_Wiki_Mediawiki();
$wiki->deleteRule( 'Wikilink' ); // remove a rule for auto-linking
$wiki->setFormatConf( 'Xhtml' , 'translate' , false ) ; // remove HTML_ENTITIES
$result = $wiki->transform($d,'xhtml');
}
?>

Pear::Text_wiki_mediawiki を確認した所、スーパークラスであるText_wikiは
singleton でしたので、オブジェクトのメンバー変数の一部がキチンと破棄されて
いないのがメモリ増加の原因ではないかと推測しています。(コードをキチンと読んだわけではないですが)
コマンドラインからPHPを実行する前提で、このシングルトンオブジェクトの破棄を行うには
どのようにしたらいいでしょうか?因みに、unset は試してみました。

回答の条件
  • 1人5回まで
  • 登録:2009/01/27 12:35:29
  • 終了:2009/01/27 19:02:46

ベストアンサー

id:pahoo No.1

pahoo回答回数5960ベストアンサー獲得回数6332009/01/27 12:59:11

ポイント100pt

Text_wiki の性質というより、while ループの中で立て続けに new するのは避けるべきでしょう。

ご質問のコードを見た感じでは、オブジェクト $wiki を保持する必要性は感じられないので、下記のようにオブジェクト生成を外側に出すことはできませんか。

$wiki=new Text_Wiki_Mediawiki();
while(1){
    $wiki->deleteRule( 'Wikilink' ); // remove a rule for auto-linking
    $wiki->setFormatConf( 'Xhtml' , 'translate' , false ) ; // remove HTML_ENTITIES
    $result = $wiki->transform($d,'xhtml');
}

なお、強制的にオブジェクトを廃棄したいなら、__destruct メソッドを利用します。

id:snaa1d_1

大変失礼しました。確かに不用意に生成する必要ないですね。

元々が

// -- main

while(1)

{

func()

}

function func()

{

$wiki=new Text_Wiki_Mediawiki();

...

}

のような構造のプログラムだったので、全然気がついてませでした・・

ありがとうございます。サンプルの状態では増えない事を確認できましたので

うまくいきそうです。

2009/01/27 19:02:30
  • id:kn1967
    ループ処理中に確保された領域はループから抜けない限り開放はされない。
    すなわち、メモリリークではなくて正常な状態。

    どのような回答かと思って回答を控えていたのだが
    肝心の点について書かれていないのは残念。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません