2013-03-31 7 views
5

PHPのmemory_limitが約25秒の実行時に50Mに設定されていると、正常に実行されるスクリプトがあります。スクリプトの最後にmemory_get_peak_usageを印刷すると、かなり接近して50Mになります。 memory_limitを高く設定すると、90Mになり、memory_get_peak_usageは約75Mとなり、スクリプトの読み込み速度は約10秒向上します。PHPは制限に基づいてメモリ使用量を動的に処理しますか?

memory_limitに関係なく、スクリプトがほぼ同じ量のメモリを使用することは直感的ですが、そうではありません。スクリプトが最大で512Mで最大値が50Mになった場合、memory_limitが増加したにもかかわらずピーク使用率が同じになると予想していました。

唯一の説明は、PHPが限界に近いことを認識し、制限を打つのを避けるために未使用のメモリをクリアする時間を費やすことです。これが実際にどのように機能するのでしょうか、それとももっと大きなものの表面を傷つけただけですか?

+1

私はこの既存のQ&Aがあなたの質問に関連して非常に興味深いことを発見しました:[PHPでメモリを解放する](http://stackoverflow.com/q/2461762/367456)。ここで問題になる可能性が最も高いメモリを再割り当てするという話題にも傷つきます。しかし、それは具体的なコードに依存しており、あなたは何も表示していないので、あなたが経験するものがガベージコレクターの方が頻繁に起きるからです。 http://lxr.php.net/xref/PHP_5_4/Zend/zend_alloc.c#1876 – hakre

答えて

2

ガベージコレクタが動作していることがわかります。

プリミティブでない変数の値を再定義すると、古い値はすぐにメモリから破棄されません。スクリプトのメモリ使用量の一部としてそこに残っています。

スクリプトがメモリの限界に近づくときは、スクリプトのスペースをさらに確保するために、未使用の割り当て済みメモリをクリーンアップするためにガベージコレクタが呼び出されます。このプロセスは海岸沿いであり、なぜスクリプトがより多くのメモリでより速く実行されるのか - ガベージコレクタはそれほど頻繁に必要とされません。

編集:

バッファリングもこれに含まれます。スクリプトが大量のデータをファイルに書き込んでいる場合、このデータは最初にメモリにキューイングされます。これは、ハードディスクがこのデータを生成するのと同じくらい速く書き込むことができないためです。ディスクよりもはるかに速くデータを生成すると、最終的に使用可能なメモリがいっぱいになり、次回にはfwrite()を試すか、バッファにデータを入れる関数を使用することが強制されます。

+0

これをサポートするドキュメントはありますか? PHPのガベージコレクタがメモリをクリアする主な方法ではなかったという印象を受けました。 –

+2

私が知っているのではなく、正確にそれがキックインするときの特定。しかし、それは存在しており、あなたは少しのGoogleの研究で見つけることができるいくつかの事実があります。 – Havenard

1

私は覚えていますが、memory_limitがスクリプトごとに使用するメモリ量を設定していると思います。memory_get_peak_usageはスクリプトによって割り当てられたメモリを示しています(オーバーヘッドの量に若干の違いがあります。 PHPはmemory_get_peak_usage

パラメータにマニュアルから)

を自分自身を管理するために使用する

real_usage

これをTRUEに設定すると、システムから割り当てられたメモリの実際のサイズが取得されます。設定されていない場合、または偽の場合は、emalloc()によって使用されるメモリのみが報告されます。

+0

'memory_get_peak_usage'は私のスクリプトによって割り当てられるメモリの量を示します。'memory_limit'指示文は、スクリプトが使用できるメモリ量を制限します。あなたはこれを大いに得ました。しかし、 'real_usage'パラメータにかかわらず、' memory_get_peak_usage'の値は増加し、単に 'memory_limit'値が変更されたときにスクリプトの実行時間が減少します。私はなぜこれが知りたいのですか? –

+1

memory_limitディレクティブは、スクリプトの実行環境で使用できるメモリ量(環境が自分自身を管理するために使用する量を含む)を制限します。したがって、スクリプトの使用量は少し少なくなります。 – Josh

+0

ああ、PHPは解放されません制限を打つのを避けるためにメモリが必要です - それは、memory_limitが低く設定されているため、そうでなければPHPが環境にメモリを与えていないことです。 –

関連する問題