PHP Pass By Reference增加内存使用量

时间:2015-03-16 16:55:41

标签: php memory memory-management

调用函数并传入一个大字符串时,我通常会通过引用传递。目的是防止PHP传递字符串副本的值,从而减少内存使用量。但是,在某些情况下,我注意到了相反的情况。

在下面的示例中,在is_string()调用时,通过引用将字符串传递给函数时,峰值内存使用量会翻倍。

代码:

$buf = '';
report_memory(__LINE__);

$buf = file_get_contents('./20MB.pdf');
report_memory(__LINE__);

example($buf);
report_memory(__LINE__);

function example(& $str) {
    report_memory(__LINE__);
    is_string($str);
    report_memory(__LINE__);
}

function report_memory($line=0) {
    echo 'Line: ' . str_pad($line,3) . ' ';
    echo 'Mem: '  . str_pad(intval(memory_get_usage()/1024     ) . 'K',8) . ' ';
    echo 'Peak: ' . str_pad(intval(memory_get_peak_usage()/1024) . 'K',8) . ' ';
    echo "\n";
}

输出:

Line: 2   Mem: 625K     Peak: 631K
Line: 5   Mem: 21058K   Peak: 21076K
Line: 11  Mem: 21058K   Peak: 21076K
Line: 13  Mem: 21058K   Peak: 41494K
Line: 8   Mem: 21058K   Peak: 41494K

更改函数example()以删除引用:

function example($str) {
    report_memory(__LINE__);
    is_string($str);
    report_memory(__LINE__);
}

输出:

Line: 2   Mem: 625K     Peak: 631K
Line: 5   Mem: 21058K   Peak: 21076K
Line: 11  Mem: 21058K   Peak: 21076K
Line: 13  Mem: 21058K   Peak: 21076K
Line: 8   Mem: 21058K   Peak: 21076K

这是我所期待的。那么,当变量是引用时,为什么内存与is_string()加倍?

环境是CentOS 6.6运行PHP 5.3.3库存。

1 个答案:

答案 0 :(得分:0)

Zend Engine使用惰性复制机制。在修改变量之前,它不会创建变量的副本。 PHP创建了一组结构,用于维护引用,以便通过引用传递变量实际上“慢”。