写入过程中的PHP副本

时间:2015-01-15 07:49:36

标签: php

据说PHP使用copy-on-write进程。如果我运行这些代码,我就会徘徊:

$first = 5;
$second = $first;
$first = 5;

然后是否为 $ first 分配新的内存空间?非常感谢

2 个答案:

答案 0 :(得分:1)

运行此脚本两次。 第一次:

echo "<pre>";
$first = 5;
echo memory_get_usage() . "\n";
$second = $first;
echo memory_get_usage() . "\n";
$first = 5;
echo memory_get_usage() . "\n";

结果:

333224
333280
333312

第二次 - 只评论一行

echo "<pre>";
$first = 5;
echo memory_get_usage() . "\n";
//$second = $first;
echo memory_get_usage() . "\n";
$first = 5;
echo memory_get_usage() . "\n";

结果:

333112
333112
333112

回答:是的,它会分配新内存

答案 1 :(得分:0)

语义是&#34; copy-on-write&#34; NOT&#34; copy-on-write-only-the-value-has-changed&#34;。

一旦声明,就会创建一些$秒的空间。该变量存在所需的最小空间。此时,空间不会分配给$ first所具有的值。所以写在这里的副本在这里工作;没有写入,因此没有为分配给$ first的值分配额外空间,现在将其分配给$ second。

然后,在您将其他内容分配给$ first时,会将更多空间分配给$ second。此时创建空间以将原始值的副本保存在$ first

<?php
    echo "<pre>";
    // 10 sets == 100 chars
    $first = "1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890";
    echo memory_get_usage() . "\n";
    $second = $first;
    echo memory_get_usage() . "\n";
    $first = "1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890";
    echo memory_get_usage() . "\n";
    $first = "1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890";
    echo memory_get_usage() . "\n";    

输出

241496
241584
241752
241752