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

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

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

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

今日は午前中ずっと、以前にメモリの問題を解決したコードを確認しましたが、一度に 40,000 個のデータをインポートするコードの最適化プログラムには非常に不満があります。これが根本的な解決策だと思います。オンライン検索を通じて、問題をさらに分析できます。
PHP のメモリ オーバーフローの問題では、最初の 2 つの方法については言及しません (Expo の「PHP のメモリ解放の問題について」を参照してください)。問題の鍵はどのようにするかにあると分析するのは難しくありません。数百行をループして一度に解放するのではなく、ループ内でメモリを同期的に解放します。これは、ループ内の再利用性の高いコードを関数にカプセル化し、サブ関数を呼び出す形式を使用するとわかるためです。の場合、プログラムの実行速度は数十倍程度低下しますが、この低下はデータ量によって変化します。
ネストされたループの形式で、大量のデータを含む配列を処理する場合、多くの場合、時間内にメモリを解放するために unset($a) が使用されますが、実際には、そうすることには意味がありません。次の分析を引用します。
"エンジンでは、変数名とその値は実際には 2 つの異なる概念です。値自体は名前のない zval* ストレージ (この場合は文字列値) であり、zend_hash_add() を介して割り当てられ、変数 $a を与えます。両方の変数名が同じ値を指している場合はどうなりますか?
{
zval *helloval;
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 *helloval;
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/972220.html

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