1

そのため、メモリに依存するデータ (大量のデータ) を処理する長時間実行スクリプトを実行しています。私は、メモリを節約するために、長時間実行されるプロセス全体で大きなオブジェクトを適切に破棄するという良い仕事をしていると思います。

現在のメモリ使用量を (memory_get_usage() を使用して) 継続的に出力するログがあり、メモリ使用量の増減 (重要なもの) に気づきません。これは、おそらくメモリ管理で正しいことをしていることを示しています。

ただし、サーバーにログオンして top コマンドを実行すると、このスクリプトを処理している apache プロセスがメモリの割り当てを解除しないことに気付きます (少なくとも top コマンドを介して目に見えるように)。PHPによって報告された現在のメモリ使用量がはるかに低い場合でも、メモリ使用量は最高のままです。

だから、私の質問は、メモリが実際にサーバーに解放されていない場合、メモリを節約しようとする試みは無駄ですか? それとも、ここで何かが欠けていますか。

ありがとうございました。

ps。Linuxでphp 5.4を使用する

pps。コードが必要な人のために、これは基本的な表現です:

function bigData()
{
    $obj = new BigDataObj();
    $obj->loadALotOfData();

    $varA = $obj->getALotOfData();

    //all done
    $obj = NULL;
    $varA = NULL;
    unset($obj,$varA);
}

更新: hek2mgl が推奨するように、debug_zval_dump() を実行したところ、出力は正しいようです。

function bigData()
{
    $obj = new BigDataObj();
    $obj->loadALotOfData();

    //all done
    $obj = NULL;

    debug_zval_dump($obj);

    unset($obj);

    debug_zval_dump($obj);
}

出力:

NULL refcount(2)

NULL refcount(1)
4

1 に答える 1

3

PHP にはガベージ コレクタがあります。参照カウントが に設定されている変数コンテナーのメモリを解放します0。つまり、ユーザーランドの参照はもう存在しません。

クリーンアップしたと思われる変数への参照がまだあると思います。何が問題なのかを示すために、コードを表示する必要があります。

于 2013-07-23T17:18:50.287 に答える