PHP 通过引用传递增加了内存使用

标签 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。

最佳答案

Zend 引擎使用延迟复制机制。在修改变量之前,它不会创建变量的副本。 PHP 创建了一组用于维护引用的结构,这就是为什么通过引用传递变量实际上“更慢”的原因。

关于PHP 通过引用传递增加了内存使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29082588/

相关文章:

Linux上的C程序耗尽内存

c++ - 通过指向非多态类型的基类的指针获取已分配内存的地址

javascript - PHP const 嵌套数组的 PhpStorm 代码自动完成

php - 在 SOAP WSDL 调用 PHP 上获取 500 内部服务器错误

php - 在特定用户的状态页面中显示特定用户选择的项目

C++将十六进制地址添加到DLL的地址

c - 使用 malloc 分配的空间传递指针

java - 如何在 Java 数组中存储 1 亿个整数?

android - 当系统杀死我的应用程序以释放内存时如何得到通知?

php - 创建一个短代码,在 Woocommerce 中显示简单的产品名称列表