コマンドラインより以下のプログラムを実行すると、毎秒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 は試してみました。
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 メソッドを利用します。
大変失礼しました。確かに不用意に生成する必要ないですね。
元々が
// -- main
while(1)
{
func()
}
function func()
{
$wiki=new Text_Wiki_Mediawiki();
...
}
のような構造のプログラムだったので、全然気がついてませでした・・
ありがとうございます。サンプルの状態では増えない事を確認できましたので
うまくいきそうです。