私も PHP の学習者ですが、これまでは、コード内で unset、null、mysql_close、__destruct などの関数を使用して、メモリ オーバーフローを防ぐためにオブジェクトを解放するだけでした。私はインターネット上の GG で次の手順を見つけて記録しました: 「PHP は自動的にメモリを管理し、不要になったオブジェクトを消去できます。PHP は参照カウントと呼ばれる単純なガベージ コレクション メカニズムを使用します。各オブジェクトに参照カウンターが含まれるたびに、各参照はオブジェクトに接続されます。参照がリビング スペースから離れるか、NULL に設定されると、カウンターは 1 ずつ減ります。オブジェクトの参照カウンターがゼロになると、PHP はこのオブジェクトがゼロになることを認識します。必要になり、それが占有しているメモリ空間が解放されます。「
ご存知のとおり、PHP エンジン自体は C で書かれています。C について言及するときは、GC (ガベージ コレクション) について言及する必要があります。PHP マニュアルを読むと、PHP エンジンが GC アクションを自動的に実行することがわかります。」これは正確に何をするのでしょうか? unset() が変数を unset() するために使用されるとき、それは本当にリサイクルされますか?しかし、注意深く分析してみると、決して単純で一般的なものではないことがわかります。おそらく誰かが「PHP のソース コードを見ればわかります。PHP を読み通せばわかります。」と言うかもしれません。ただし、この記事では、PHP 自体の一見普通だが一般的に使用される問題のみを分析します。もちろん、見逃されている細部がいくつかあります。スキル レベルは限られていますが、一緒に議論できるすべての PHP を歓迎します。
まず、最も単純な実行プロセスの例を見てみましょう。
例 1: gc.php
error_reporting(E_ALL); '; 私はテストです。';
$b = & $a;
echo $b ." ";
言うまでもなく、PHP の出力結果は次のようになります:
hy0kl% php - f gc.php
私はテストです
それでは次:
error_reporting(E_ALL);
$b = & $a; b = '変更しますか?';
echo $b ." ";
hy0kl % php -f gc.php
変更します
変更しますか?
例 3:
error_reporting(E_ALL);
$ b = & $a; ;
echo $a ." ";
?>
hy0kl% php -f gc
注意: /usr/ に未定義の変数があります8 行目の local/www/apache22/data/test/gc.php
私は test です
少し混乱していますか?
例 4:
error_reporting(E_ALL); = '私はテストです。';
$b = & $a;
echo $b ." ";例 3、これはこれに似ています。
hy0kl% php -f gc.php
注意: /usr/local/www/apache22/data/test/gc.php の行 9 に未定義の変数があります。
ここを見てください:
例 5:
error_reporting(E_ALL);
$b = & $a;
$a = null; '. $a ." ";
echo '$b = '. $b ." ";
hy0kl % php -f gc.php
$ b =
はい、これが出力結果です。PHP GC を深く理解している PHP 愛好家にとっては、このコードを初めて見たときは驚きました。これにより、PHP GC についてより深く理解できるようになりました。次に、それを使用する例を示します。
error_reporting(E_ALL);
$b = & $a;
echo '$a = '.$b ."
OK、上の例の結果には詳細がありません。このウィンドウを閉じて、時間があれば戻ってきてください。
すべての例で変数を分析してみましょう。簡単に言うと、このプロセスはメモリ内にスペースを開き、その中に I am test という文字列を格納し、メモリの各ブロックへの参照を記録します。このメモリの count が 1 増加され、$a という名前のラベル (変数) がこのメモリを指すために使用され、変数 $ に対して & を実行します。 a 操作としては、$a が指すメモリを見つけ、$b に同じ参照ポイントを確立し、シンボル テーブルにある文字列 I am test を格納するメモリ ブロックの参照カウントに 1 を加算するということです。スクリプトがこの行まで実行されると、文字列 I am test を格納するメモリが 2 回参照されます。ここで強調しなければならないのは、PHP にはポインタの概念がなく、参照ポインタが確立されるということです。 ! 同時に、ファイルのソフト リンクが UNIX に似ていると主張する人もいます。これは、テスト対象の文字と変数 $a を保存するメモリであることをある程度理解できます。 $b は実ファイルに対して確立されますが、それらは同じ実ファイルを指します。したがって、例 2 で $b に値が割り当てられると、$a の値も変化することがわかります。
3. 例 3 と 4 では、unset() 操作が実行されました。実際の実行結果によれば、unset() は変数の参照をメモリに切断するだけであることがわかります。 null 参照が渡された場合、呼び出しが行われたときに通知が発行され、シンボル テーブル内のそのメモリ部分の参照カウントは 1 ずつ減らされますが、それは行われません。つまり、メモリの一部がシンボル テーブルに参照カウントを持っている場合にのみ、PHP エンジンはこのメモリを再利用します
PHP Manual
4.0.0 unset( ) は式になりました (PHP 3 では、unset() は常に 1 を返します)
次のコードとその結果を見てください。 = '私はテストです。';
unset($a);
echo '$a = '。 ;
エコー '$b = ' ." "?>
hy0kl% php -f gc.php ;注意: 未定義の変数: /usr/local/www/apache22/data/test/gc.php の 10 行目
$a =
$b = 私はテストです
最初の unset() 操作が切断されたポイントです。したがって、後続の操作はシンボル テーブル内のメモリの参照カウントに影響を与えません。
4. 例 5 と 6 から、代入 null 操作は非常に暴力的であり、変数の参照カウントを直接変更すると結論付けることができます。シンボルで示されるメモリは 0 に設定されるため、このメモリはエンジンによって自然に再利用され、他の情報を保存するためにすぐに使用されるか、または二度と使用されない可能性があります。しかし、何があっても、そのメモリを指すすべての元の変数は再利用されたメモリを操作できなくなり、それを呼び出そうとする変数は null を返します。 '私はテストです。';
$b = & $a;
echo '$a = '."; if (null === $a)
{
echo '$a は null です。';
} else
{
echo '$a の型は不明です。'
}
hy0kl% php - f gc.php
$a =
$b =
$a is null
要約すると、オープンソース製品のソースコードを見ると、比較的大きな一時変数が頻繁に表示される理由が完全に説明されます。 use 呼び出されなくなった再利用された情報は集約または表示され、null の値が割り当てられます。これは、UNIX で実際のファイルを直接強制終了することと同等であり、そのファイルを指すすべてのソフト リンクは当然空のリンクになります。
上記では、ガベージ コレクションの紹介と、ガベージ コレクションの内容を含む PHP ガベージ コレクションの仕組みの簡単な説明を紹介しました。PHP チュートリアルに興味のある友人の役に立つことを願っています。