当调用函数并传入一个大字符串时,我通常通过引用传递。目的是防止 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。
最佳答案
Zend 引擎使用延迟复制机制。在修改变量之前,它不会创建变量的副本。 PHP 创建了一组用于维护引用的结构,这就是为什么通过引用传递变量实际上“更慢”的原因。
关于PHP 通过引用传递增加了内存使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29082588/