PHP では、スクリプトを実行するために割り当てられたすべてのメモリが、ページ リクエストの最後に解放されますか?それとも、時間の経過とともにメモリ リークが発生することを心配する必要がありますか?
5 に答える
unset()
いいえ。リソースを手動で解放する (を呼び出す) 必要はありません。PHP はこれを自動的に行います。リクエストの存続期間が終了すると、すべてが解放されます。いいえ、これを気にする必要はありません。これを行う場合:
<?php
$resource = allocate_heavy_resource();
?>
$resource
はリクエストの最後に解放されるため、メモリ リークは発生しません。そうでない場合は、PHP に重大なバグがあることを意味し、通常の操作に関する議論はいずれにせよウィンドウを介して行われます。
編集: もちろん、例外もあります。永続的なデータベース接続と同様です。しかし、それらは最終的に処理されるため、実際にはメモリリークではありません。
はい、スクリプトが終了すると、すべてのメモリが解放されます。ただし、一部のアルゴリズムに基づいて、スクリプト中にメモリ リークが発生する可能性があります。を使用unset()
して変数を解放できますが、vanneto の指摘に反して、実際にはメモリを解放しません。
PHP は、オブジェクトなどを構築することによって要求するメモリを解放します。それでも、メモリが解放されないシナリオがあります。このため、ガベージ コレクションの原則がバージョン 5.3 で導入されました。
gc_enable() 関数を使用して実行できます。PHP のガベージ コレクションは、デフォルトではアクティブではありません。
物事がキャッシュされると、メモリリークが発生します。そのため、php スクリプトでメモリ リークが発生した場合、Apache プロセスは時間の経過とともに増加します。非常に多くのリクエストがあった後、それらを再起動できます。マルチ プロセッシング モジュール (MPM) を確認してください。通常は、プリフォークまたはワーカーです。
ただし、ほとんどの場合、PHP で多くの処理を行わない限り、これはあまり影響しません。
PHP はガベージ コレクターを使用します。参照が残っていないすべての変数を解放します。
http://v1.srcnix.com/2010/02/10/7-tips-to-prevent-php-running-out-of-memory/
GCが自動的にそれを行うと確信しています。(開いているmysql接続も閉じます)