一般PHPSのメモリ管理で(また、マイクロ最適化を理由@ GordonMさんのコメント。にうなずき)は、すべてあなたが宣言した変数との使用のために箱から出して動作します。 concept refcountingを使用すると、PHPは変数がもう使用されていないかどうかを確認し、自動的にクリーンアップします。
ガベージコレクタは、オブジェクトが循環参照を持つ場合にのみ重要です.AはBを指し、BはAを指します。この場合、refcountingは機能しません。
PHPメモリには、潜在的にそれ以上使用されない可能性があるオブジェクトが正確に10.000ある場合、PHPガベージコレクタは、有効になっているとトリガします。デフォルトで有効になっています。実行時にgc_enable()
とgc_disable()
で無効または有効にすることができます。
gc_collect_cycles()
に電話して、これらのオブジェクトを手動でクリーンアップすることもできます。
しかし、必要に応じてこのプロセスを最適化するにはどうすればよいですか?サイクルコレクタを実行することは、10.000個の潜在的なオブジェクトから効率的または有用である必要はなく、それらの多くはまだ使用中であり、クリーンアップすることはできません。この場合、すべてのオブジェクトをチェックし、それらをクリーンアップしないことを決定するCPUサイクルを無駄にしています。これを行うとメモリー削減はありません。
通常、GCは長時間実行されるスクリプトでのみトリガされ、あまりにも多くのオブジェクトを作成すると短時間のWebリクエストでトリガされることがあります。一般的には、これをあまりにも多く考える必要はありません。デフォルトがユースケースの99%で動作するからです。
"garbage_stats" PHP拡張機能を使用すると、GCがどれぐらい効率的かつ高速に実行され、どのくらいのメモリが削減されたかに関するメトリックと統計情報にアクセスできます。 (フックはそれ以来のみ利用可能ですので)それは7+ PHP上で動作します:https://github.com/tideways/php_garbage_stats拡張子をインストールしている場合は、あなたがそれらを呼び出すことにより、CLIスクリプトのガベージコレクションの統計を見ることができます
:から
$ php -dgc_stats.enable=1 -dgc_stats.show_report=1 test.php
Found 7 garbage collection runs in current script.
Collected | Efficency% | Duration | Memory Before | Memory After | Reduction% | Function
----------|------------|----------|---------------|--------------|------------|---------
0 | 0.00 % | 0.01 ms | 365824 | 366320 | -0.14 % | gc_collect_cycles
10000 | 100.00 % | 2.75 ms | 4651320 | 491816 | 89.43 % | foo
10000 | 100.00 % | 3.54 ms | 4652784 | 493280 | 89.40 % | foo
10000 | 100.00 % | 2.11 ms | 4654248 | 494744 | 89.37 % | foo
10000 | 100.00 % | 3.26 ms | 4656168 | 496664 | 89.33 % | Test::foo
9000 | 90.00 % | 1.51 ms | 4694680 | 951176 | 79.74 % | Test::foo
10000 | 100.00 % | 3.11 ms | 5112272 | 952768 | 81.36 % | Test::foo
をWeb(ApacheやFPMなど)のリクエストでは、この情報にアクセスしてログファイルに書き込むには、関数$runs = gc_stats();
を使用できます。
この情報に基づいて、最適化を行うことができる唯一の判断を下すことができます。スクリプトの効率性に応じてスクリプト内のGCを有効または無効にする。
コンフィギュレーションディレクティブでは何もできません。メモリ使用量を減らすような方法でコードを書いてください。それ自体が大部分の「プログラマ」のミステリーです。 –
実際にヒットしない限りメモリ消費量やGCの問題によるパフォーマンス上の問題がありますが、ほとんどの場合、それは心配しません。[タグ:マイクロ最適化] – GordonM