ホームページ  >  記事  >  バックエンド開発  >  PHPのメモリ解放問題について(2)_PHPチュートリアル

PHPのメモリ解放問題について(2)_PHPチュートリアル

WBOY
WBOYオリジナル
2016-07-13 10:00:32667ブラウズ

PHPのメモリ解放問題について(2)

今日は午前中ずっと、以前にメモリの問題を解決したコードを確認しましたが、一度に 40,000 個のデータをインポートするコードの最適化プログラムには非常に不満があります。これが根本的な解決策だと思います。オンライン検索を通じて、問題をさらに分析できます:

PHP のメモリ オーバーフローの問題では、最初の 2 つの方法については言及しません (エキスポの「About PHP Memory Release Issues」を参照してください)。実際、問題の鍵が にあることを分析するのは難しくありません。ループ内でメモリを同期的に解放する方法については、数百行をループして一度に解放するのではなく、ループ内の再利用性の高いコードを関数にカプセル化し、サブ関数を呼び出す形式を使用すればよいことがわかります。 、プログラムの実行速度は約数十倍に低下しますが、この低下はデータ量によって変化します。

ループのネストの形式では、大量のデータを含む配列を処理する場合、多くの場合、時間内にメモリを解放するために unset($a) が使用されますが、実際には、そうすることは無意味です。次の分析を引用します。

「エンジンでは、変数名とその値は実際には 2 つの異なる概念です。値自体は名前のない zval* ストレージ (この場合は文字列値) であり、zend_hash_add() 変数 $a を介して割り当てられます。何が起こるか両方の変数名が同じ値を指している場合は?


{
zval *こんにちは;

MAKE_STD_ZVAL(ハローヴァル);
ZVAL_STRING(helloval, "Hello World", 1);
zend_hash_add(EG(active_symbol_table), "a", sizeof("a"), &helloval, sizeof(zval*), NULL);
zend_hash_add(EG(active_symbol_table), "b", sizeof("b"), &helloval, sizeof(zval*), NULL);
}

この時点で、実際に $a または $b を確認すると、どちらにも文字列「Hello World」が含まれていることがわかります。残念ながら、次に、コードの 3 行目「unset($a);」の実行を続けます。現時点では、unset() は $a 変数が指すデータが別の変数でも使用されていることを知らないため、ただ盲目的にメモリを解放します。それ以降の変数 $b へのアクセスは、メモリ領域が解放されたものとして解釈されるため、エンジンがクラッシュします。


この問題は、zval の 4 番目のメンバー refcount (いくつかの形式があります) を利用して解決できます。変数が最初に作成されて値が割り当てられると、その refcount は 1 に初期化されます。これは、変数が最初に作成されたときに対応する変数によってのみ使用されると想定されるためです。コード スニペットが $b への helloval の割り当てを開始するとき、refcount の値を 2 に増やす必要があるため、値は 2 つの変数によって参照されるようになります。

{
zval *こんにちは;
MAKE_STD_ZVAL(ハローヴァル);

ZVAL_STRING(helloval, "Hello World", 1);
zend_hash_add(EG(active_symbol_table), "a", sizeof("a"), &helloval, sizeof(zval*), NULL);
ZVAL_ADDREF(ハローヴァル);
zend_hash_add(EG(active_symbol_table), "b", sizeof("b"), &helloval, sizeof(zval*), NULL);
}

ここで、unset() が $a の対応するコピーを削除すると、refcount パラメーターから、そのデータに関心のあるユーザーが他にいることを確認できるため、refcount をデクリメントして、そのままにしておく必要があります。 「


要約すると、実際に最も行う必要があるのは、データが最初に格納される配列を減らすことです。上記の例では、配列内の処理された要素がループ中に適時に解放されるため、ループが継続するにつれて、メモリ使用量は変動し続けますが (メモリのリサイクル メカニズムの問題)、増加し続けることはなく、これにより本来の目的は達成されます。もちろん、一度に処理されるデータの最大量は、サーバーによって PHP に割り当てられるメモリに依存します。一度に配列に読み込むデータ量は、神でも制限を超えることになります。はは

http://www.bkjia.com/PHPjc/973373.html

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/973373.html技術記事 PHPのメモリ解放問題について(2) 今日は、以前メモリ問題を解決したコードを午前中丸々見て、自分のコードの最適化プログラムに非常に不満がありました…
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。