1

PHP でメモリ リークを心配する必要はありますか? 特に、ブラウザから呼び出されている次のコードがあります。呼び出しが終了すると、すべてが適切にクリーンアップされますか? または、作成された最初の配列によって作成されたメモリをクリアする必要がありますか?

class SomeClass
{
  var $someArray = array();

  function someMethod()
  {
     $this->someArray[1] = "Some Value 1";
     $this->someArray[2] = "Some Value 2";
     $this->someArray[3] = "Some Value 3";
     $this->someArray = array();
     $this->someArray[1] = "Some other Value";
     $this->someArray[2] = "Some other Value";
     $this->someArray[3] = "Some other Value";
  }
}

someMethod();

ありがとう、スコット

4

3 に答える 3

3

PHP でメモリ リークを心配する必要はありますか?

PHP では、 の が に落ちない循環参照を持つことがrefcountできzvalます0。これにより、メモリ リークが発生します (GC は、オブジェクトへの参照を持つオブジェクトをクリーンアップしません)。これは >= PHP 5.3 で修正されました。

特に、ブラウザから呼び出されている次のコードがあります。呼び出しが終了すると、すべてが適切にクリーンアップされますか? または、作成された最初の配列によって作成されたメモリをクリアする必要がありますか?

PHP スクリプトにはリクエストのライフサイクル (アプリケーションの実行、応答の返信、アプリケーションの終了) があるため、心配する必要はありません。アプリケーションが使用するすべてのメモリは、アプリケーションが終了したときに解放済みとしてマークし、次のリクエストで上書きできるようにする必要があります。

于 2012-06-22T01:13:02.487 に答える
1

unsetしかし、PHP はガベージ コレクション言語であるため、コアまたは拡張機能にバグがない限り、メモリ リークは発生しません。

詳しくは


補足として、新しい PHP 5 OOP 構文を使用する必要があります。そして、 someMethod はエラーになります。$obj->someMethod() である必要があります。ここで、$obj はクラスのインスタンスです。

于 2012-06-22T01:09:47.843 に答える
1

mpm_prefork動作で Apache を介して mod_php を実行すると、実際にはメモリの問題が存在します。問題は、PHP によって消費されたメモリがオペレーティング システムに解放されないことです。同じ Apache プロセスは、後続の要求のためにメモリを再利用できますが、他のプログラム (他の Apache プロセスでさえも) で使用することはできません。

解決策の 1 つは、時々プロセスを再起動することです。たとえば、MaxRequestsPerChild設定をかなり低い値 (100 程度、負荷の軽いサーバーではそれよりも低い値) に設定します。最善の解決策は、mod_php をまったく使用せず、代わりに FastCGI を介して PHP を実行することです。

ただし、これはシステム管理者の問題であり、プログラマーの問題ではありません。

于 2012-06-22T01:59:20.290 に答える