我有一个大小为5 MB的数组,我将它传递给函数函数(我没有通过引用传递它)
foo( $arr );
function foo( $arr ) {
....
bar( $arr );
....
}
function bar( $arr ) {
....
test( $arr );
....
}
function test( $arr ) {
....
test2( $arr );
....
}
Run Code Online (Sandbox Code Playgroud)
PHP 默认情况下通过值(值的副本)将数组值传递给函数.
我的问题是,如果这个数组值传递给100个函数调用,那么PHP会消耗100 x 5 MB = 500 MB的内存吗?
PHP如何在函数调用上处理大数组(在内存方面)?
这是一个要测试的代码:
<?php
function testnochanges($arr1){
foreach($arr1 as $val){
//
}
return $arr1;
}
function testwithchanges($arr1){
$arr1[] = 1;
return $arr1;
}
echo "Stage 0: Mem usage is: " . memory_get_usage() . "<br />";
for ($i = 0; $i < 100000; ++$i) {
$arr[] = rand();
}
echo "Stage 1 (Array Created): Mem usage is: " . memory_get_usage() . "<br />";
$arrtest1 = testnochanges($arr);
echo "Stage 2 (Function did NO changes to array): Mem usage is: " . memory_get_usage() . "<br />";
$arrtest2 = testwithchanges($arr);
echo "Stage 3 (Function DID changes to array): Mem usage is: " . memory_get_usage() . "<br />";
?>
Run Code Online (Sandbox Code Playgroud)
这是我运行后的输出:
Stage 0: Mem usage is: 330656
Stage 1 (Array Created): Mem usage is: 8855296
Stage 2 (Function did NO changes to array): Mem usage is: 8855352
Stage 3 (Function DID changes to array): Mem usage is: 14179864
Run Code Online (Sandbox Code Playgroud)
在阶段0,我们可以看到在创建数组之前,PHP已经在内存中使用了一些空间.创建第一个数组(第1阶段)后,我们可以看到内存使用情况发生了很大变化.但是在调用函数testnochanges函数并$arrtest1在第2阶段创建之后,我们发现内存使用量没有太大变化.这是因为我们确实没有改变$arr,所以$arrtest1和$arr仍然都指向同一个数组.但是在第3阶段,我们调用testwithchanges函数,并向$arrPHP执行添加元素copy-on-write并返回分配给$arrtest2现在使用不同内存部分的数组,我们再次看到内存使用量大幅增长.
干结论:如果将数组复制到另一个数组并且不更改它,则内存使用保持不变,因为两个数组都指向同一个数组.如果你更改PHP执行的数组copy-on-write,当然内存使用量会增加.
好看的东西:警惕垃圾收集,第2部分.