PHP 変数とメモリ管理に関する学習メモ

高洛峰
リリース: 2023-03-06 14:54:02
オリジナル
1296 人が閲覧しました

1.memory_get_usage 関数

int memory_get_usage ([ bool $real_usage = false ] )


PHP スクリプトによって使用されるメモリ (memory_get_usage() 関数自体によって占有されるメモリを除く)

memory_get_usage() パラメータ $ real_usage、デフォルトは FALSE です。TRUE に設定すると、取得されるメモリ値は PHP メモリ管理によって占有されるメモリになります。

//php分配到的内存 var_dump(memory_get_usage(true)); //php使用内内存 var_dump(memory_get_usage());
ログイン後にコピー

Result

int 262144
int 239368


PHPのメモリ管理メカニズムは、変数を保存するためのスペースを事前に割り当て、スペースが十分でない場合は、新しいスペースを申請します。

memory_get_usage(true) は、事前に割り当てられたメモリです。


これまで PHP ページのメモリ使用量に注意を払ったことはありませんでした。今後ページを最適化するときにも、この関数を使用してコードを分析する必要があります。


2. 変数の割り当てとメモリ

var_dump(memory_get_usage()); $a = "Hello World"; var_dump(memory_get_usage()); $b = $a; var_dump(memory_get_usage()); unset($b); var_dump(memory_get_usage()); unset($a); var_dump(memory_get_usage());
ログイン後にコピー

Result

int 239776
int 239912
int 240000
int 239912
int 239776


239912-239776=136

240000-239912=88


$a と $b の割り当てで使用されるメモリが異なります。これは、$b の割り当てでは、出力関数がメモリを割り当てないためです。

さらに、$b を破棄しても、$a が使用するメモリには影響しません。これが、メモリ管理の参照カウントの理由です。

例を変更すると、変数の割り当てとメモリの関係が明確に理解できます

var_dump(memory_get_usage()); $a = "Hello World"; var_dump(memory_get_usage()); $b = "Hello World"; var_dump(memory_get_usage()); unset($b); var_dump(memory_get_usage()); unset($a); var_dump(memory_get_usage());
ログイン後にコピー

結果

int 239816
int 239952
int 240088
int 239952
int 239816

239952-239816=136

240088-239952=136


追加の参照割り当て メモリ占有ルールは直接割り当てに似ています。メモリ管理の参照が含まれます


3. この部分は十分に理解されていません

xdebug_zval をインストールする必要があります。

(refcount=1, is_ref= 0),

string

'Hello World' (length=11)

refcountは値を指す変数の数ですis_refはアドレス参照があるかどうかを表します

type

value

変数を代入する場合: is_ref は false refcount 1 の場合

マニュアルアドレス


参照カウントの基礎知識

http://php.net/manual/zh/features.gc.refcounting-basics.php

すべての

php 変数

は、変数コンテナーに「zval」というファイルが存在します。 zval 変数コンテナには、変数の型と値に加えて、2 バイトの追加情報が含まれています。 1 つ目は「is_ref」です。これは、この変数が参照セットに属しているかどうかを識別するために使用されるブール値です。このバイトを通じて、PHP エンジンは通常の変数と参照変数を区別できます。PHP ではユーザーが & を使用してカスタム参照を使用できるため、zval 変数コンテナーにはメモリ使用量を最適化するための内部参照カウント メカニズムもあります。 2 番目の追加バイトは「refcount」で、この zval 変数コンテナーを指す変数 (シンボルとも呼ばれます) の数を示すために使用されます。すべてのシンボルはシンボル テーブルに存在し、各シンボルにはスコープ (スコープ) があり、メイン スクリプト (例: ブラウザを通じて要求されたスクリプト)、および各関数またはメソッドにもスコープがあります。

以上がPHP 変数とメモリ管理に関する学習メモの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。