<?php$mem=memory_get_usage();
$a=str_repeat("1", 1000); // ① echo">> used mem: ".(memory_get_usage()-$mem)."\n";
$b=$a; // ②$c=$b; // ③ echo">> used mem: ".(memory_get_usage()-$mem)."\n";
$a=$a.'1'; // ④ echo">> used mem: ".(memory_get_usage()-$mem)."\n";
unset($b); // ⑤ echo">> used mem: ".(memory_get_usage()-$mem)."\n";
unset($c); // ⑥ echo">> used mem: ".(memory_get_usage()-$mem)."\n";
実行結果
used mem: 1280
used mem: 1312
used mem: 2592
used mem: 2592
used mem: 1312
ソース見るだけ分かりずらいと思いますが、下図を見てください。
配列も同じ管理方です。
例2:
<?php$mem=memory_get_usage();
$a=array_fill(0, 1000, '1');
echo">> used mem: ".(memory_get_usage()-$mem)."\n";
$b=$a;
$c=$b;
echo">> used mem: ".(memory_get_usage()-$mem)."\n";
$a[0]='2';
echo">> used mem: ".(memory_get_usage()-$mem)."\n";
$a[]='1';
echocount($a)."\n";
echocount($b)."\n";
echocount($c)."\n";
echo">> used mem: ".(memory_get_usage()-$mem)."\n";
>unset($b);
echo">> used mem: ".(memory_get_usage()-$mem)."\n";
unset($c);
>echo">> used mem: ".(memory_get_usage()-$mem)."\n";
実行結果
used mem: 36920
used mem: 36952
used mem: 73872
1001
1000
1000
used mem: 73872
used mem: 73872
used mem: 36952
例3:
<?php$mem=memory_get_usage();
$a=array_fill(0, 1000, (object)array('x'=>'1'));
echo">> used mem: ".(memory_get_usage()-$mem)."\n";
$b=$a;
$c=$b;
echo">> used mem: ".(memory_get_usage()-$mem)."\n";
$a[0]->x ='2';
echo">> used mem: ".(memory_get_usage()-$mem)."\n";
$a[]='1';
echocount($a)."\n";
echocount($b)."\n";
echocount($c)."\n";
echo">> used mem: ".(memory_get_usage()-$mem)."\n";
>unset($b);
echo">> used mem: ".(memory_get_usage()-$mem)."\n";
unset($c);
>echo">> used mem: ".(memory_get_usage()-$mem)."\n";
実行結果
used mem: 36960
used mem: 36992
used mem: 74288
1001
1000
1000
used mem: 74288
used mem: 74288
used mem: 37368
試した結果上で、PHPには同じメモリエリアに複数変数が参照できますが、
それぞれの変数がいずれか更新したい場合は別のメモリエリアをアロケートします。
これは大切だと思います。
*データベースから数万件のデータ抽出する時に、注意しないと、「Fatal error: Out of memory」発生可能性が高いです。