1

Apache アクセス ログを読み取って処理する PHP コード スニペットがあります。コードをこれらの数行に減らしましたが、まだリークが見つかります。echo memory_get_usage() は毎回 11Mb を報告し続けますが、PHP プロセスはますます多くのメモリを消費し続けます。

Ubuntu 12 マシンで PHP 5.3.6 を実行しています。Ubuntu で PHP 5.2 を使用すると、問題が解消されます。

$logDir = opendir(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'tempLog');
while (($file = readdir($logDir)) !== false) {
    echo($file . PHP_EOL);

    $filePath = dirname(__FILE__) . DIRECTORY_SEPARATOR . 'tempLog' . DIRECTORY_SEPARATOR . $file;
    $fhandle = fopen($filePath, 'r');
    fseek($fhandle, 0);

    while(!feof($fhandle)) {
        $line = fgets($fhandle);
    }

    fclose($fhandle);
    echo('Finished reading!' . PHP_EOL);
    echo('Memory usage: ' . memory_get_usage() . PHP_EOL . PHP_EOL);
    system('cat /proc/' . getmypid() . '/status | grep VmSize');
}

EDIT: このスクリプトからのサンプル出力を追加しました: EDIT2: VM サイズを追加しました

access.log.2
Finished reading!
Memory usage: 11303616
VmSize:       54972 kB

access.log.19
Finished reading!
Memory usage: 11303616
VmSize:       55896 kB

access.log.23
Finished reading!
Memory usage: 11303616
VmSize:       81372 kB

access.log.41
Finished reading!
Memory usage: 11303616
VmSize:       93120 kB

access.log.31
Finished reading!
Memory usage: 11303616
VmSize:      107508 kB

access.log.28
Finished reading!
Memory usage: 11303616
VmSize:      112128 kB

access.log.5
Finished reading!
Memory usage: 11303616
VmSize:      112920 kB

..
Finished reading!
Memory usage: 11303592
VmSize:      112920 kB

.
Finished reading!
Memory usage: 11303592
VmSize:      112920 kB

メモリリークが発生している可能性のあるアイデアはありますか? どうすればそれを回避できますか?

4

1 に答える 1

0

PHP はデフォルトではガベージ コレクションを実行しません (マニュアルをざっと読んだだけのようです)。できることがいくつかあります。

1) で GC を有効にしgc_enable()ます。を使用して GC パスを強制できますgc_collect_cycles()

2) を使用して明示的に破棄$lineunset($line)ます。

于 2013-02-22T18:53:52.677 に答える