调用函数并传入一个大字符串时,我通常会通过引用传递。目的是防止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库存。
答案 0 :(得分:0)
Zend Engine使用惰性复制机制。在修改变量之前,它不会创建变量的副本。 PHP创建了一组结构,用于维护引用,以便通过引用传递变量实际上“慢”。