12

簡単な質問が 2 つあります。メモリのクリーンアップに適している/役立つものは何ですか。

$var = null;

また

unset($var);

私は1サイクルで1つの機能を持っています。私は得ています(数分後)

Fatal error: Allowed memory size of 419430400 bytes exhausted

null を設定し、(サイクルの最後に) すべてのオブジェクトを unset()-ing していますが、まだ成功していません:(メモリを消費しているものを見つけることができません。

そして、サイクル内の関数呼び出しはどうですか? PHP はこれらの関数のすべての割り当てを解放しますか? (呼び出し後)

4

5 に答える 5

4

PHP 自体が両方の概念を混同することがありますが、一般に、NULL に設定された変数は、存在しない変数と同じではありません。

<?php

$foo = 'One';
$bar = 'Two';

$foo = NULL;
unset($bar);

var_dump($foo); // NULL
var_dump($bar); // Notice: Undefined variable: bar
var_dump(get_defined_vars()); // Only foo shows up: ["foo"]=> NULL

?>
于 2010-08-05T09:10:44.153 に答える
2

unset() はまさにそれを行い、変数を設定解除します。ただし、すぐにメモリを解放するわけではありません。

PHP のガベージ コレクターは、現在設定されていない変数によって以前に使用されたメモリを実際に解放しますが、それは実行時のみです。これは、CPU サイクルが他の作業に積極的に使用されていない場合、またはスクリプトがメモリ不足になる前に、より早く発生する可能性があります。どちらの状況が先に発生してもかまいません。

また、その変数への他の参照がある場合、unset は変数によって使用されているメモリを必ずしも解放しないことに注意してください。単に参照を削除し、実際に保存されているデータの参照カウントを 1 減らします。

編集 unset は使用されているメモリをすぐに解放しませんが (ガベージ コレクションのみが実際にそれを行います)、結果として使用されなくなったメモリは、新しい変数の宣言に使用できます。

于 2010-08-05T09:25:07.557 に答える
2

問題が見つかりました。

最初は、xdebugプロフィル ツールが原因でした (私はすべてを有効にしました :) )-そして、大量のメモリを消費します。

xdebug (プロフィルがオンになっている場合) は、アプリケーションの PHP プロセスでメモリを消費します。

次に、呼び出された関数で使用される静的メンバーを解放しませんでした。

于 2010-08-05T13:20:15.723 に答える
1

変数の設定を解除すると、マークされているだけなので、次のガベージ コレクションで削除されます。null に設定すると、変数のデータが上書きされます。

PHPマニュアルのコメントも参照してください: Unset Manual

少なくともこの動作は、これまでに遭遇したものでもあります。しかし、それを修正するには、まず何がメモリを増大させているのかを突き止める必要があります。これには、 memory_get_usage関数が役立ちます。

于 2010-08-05T09:36:03.593 に答える
0

And what about function calls in cycle? Will PHP release all allocations in these functions?(after call)

実行が関数のスコープを離れると、すべての非静的変数がメモリから削除されます。

于 2010-08-05T08:49:34.780 に答える