2011-07-31 9 views
2
$myStr = ''; 
for ($i = 0; $i<999500; $i++) { 
    $myStr .= chr(rand(0,127)); 
} 
echo round(memory_get_usage()/1024/1024,2) . ' Mb'; 

によって値Save私は、参照することによりmyStr2にmyStrを保存し、は私が1.27 Mbのメモリ使用量参照

$myStr = ''; 
for ($i = 0; $i<999500; $i++) { 
    $myStr .= chr(rand(0,127)); 
} 
$myStr2 = $myStr; 
echo round(memory_get_usage()/1024/1024,2) . ' Mb'; 

$ myStr2を得た1.27 Mbの

$myStr = ''; 
for ($i = 0; $i<999500; $i++) { 
    $myStr .= chr(rand(0,127)); 
} 
$myStr2 = &$myStr; 
echo round(memory_get_usage()/1024/1024,2) . ' Mb'; 

を得たとき= $ myStrまた私は1.27 Mbを得ました。どうしたの?なぜ私は1.27 Mb、代わりに2.54 Mbを得ましたか?

答えて

1

PHPで変数を別の変数に代入すると、でなく、メモリ最適化の理由から変数のデータが即座に複製されます。

あなただけは、実際には2つの変数の1つを変更時に、PHPは、データを複製し、その後2つの変数のみデータの1つを変更:

$myStr2 = $myStr; # this won't copy the data. 
$myStr2 .= 'X'; # this will trigger copy on write. 

このoptimzationは(「コピーオンライト」と呼ばれていますWikipedia)。あなたがトピックに関する完全な科学的な読み取りを取得したい場合は

、参照してください。

2

PHPが書き込みにコピーを行います。あなただけの第二の可変から読み取る限りを(とそれへの書き込みではない)、それは本当に最初のものからコピーされていません。