Использование памяти при сохранении значения по ссылкам - PullRequest
2 голосов
/ 31 июля 2011
$myStr = '';
for ($i = 0; $i<999500; $i++) {
    $myStr .= chr(rand(0,127));
}
echo round(memory_get_usage()/1024/1024,2) . ' Mb';

Я получил 1,27 Мб

$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 Мб

$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 Мб . В чем дело? Почему я получил 1,27 Мб, вместо 2,54 Мб?

Ответы [ 2 ]

2 голосов
/ 31 июля 2011

PHP делает копирование при записи : если вы только читаете из своей второй переменной (а не записываете в нее) , она на самом деле не копируется из первой.

1 голос
/ 31 июля 2011

Присваивая переменную другой переменной в PHP, PHP не немедленно продублирует данные переменной для оптимизации памяти.

Только в тот момент, когда вы фактически измените одну из двух переменных, PHP продублирует данные и затем изменит только одну из двух переменных:

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

Эта оптимизация называется «копирование при записи» ( Wikipedia ).

Если вы хотите получить полное научное прочтение по этой теме, см.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...