在调用函数并传递大字符串时,我通常通过引用传递。这样做的目的是使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()会使内存翻倍呢?
环境是运行着标准PHP 5.3.3的CentOS 6.6。