人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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 は試してみました。

●質問者: snaa1d_1
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:MediaWiki Pear PHP Singleton Wiki
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● pahoo
●100ポイント ベストアンサー

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

...

}

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

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

うまくいきそうです。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ