$myStr = '';
for ($i = 0; $i<999500; $i++) {
$myStr .= chr(rand(0,127));
}
echo round(memory_get_usage()/1024/1024,2) . ' Mb';
我得到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保存到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';
$ myStr2 = $ myStr 我有1.27 Mb 。这是怎么回事?为什么我得到1.27 Mb,而不是2.54 Mb?
答案 0 :(得分:2)
PHP在写时进行复制:只要您只读取第二个变量(而不是写入它),就不会从第一个变量中复制它。
答案 1 :(得分:1)
通过将变量分配给PHP中的另一个变量,PHP将不立即复制变量的数据以用于内存优化。
只有在您实际更改两个变量之一时,PHP才会复制数据,然后只更改两个变量数据中的一个:
$myStr2 = $myStr; # this won't copy the data.
$myStr2 .= 'X'; # this will trigger copy on write.
此优化称为“写入时复制”(Wikipedia)。
如果您想对该主题进行全面的科学阅读,请参阅: