php在作为消费者进行消费的时候,常用方法都是写死循环,有时候会产生内存溢出的问题。这里写了一个测试代码,
代码如下:
<?php
class Test
{
public $name = "sdf";
public function __construct()
{
}
}
$i;
============================================================================
//写法1,这里内存不会溢出
while(true) {
$i++;
var_dump($i);
$i = new Test();
}
//写法2,这里内存不会溢出
while(true) {
new Test();
}
//写法3,这里内存会溢出
while(true) {
$i[] = new Test();
}
?>
第一、二中写法的截图:

第三种写法的截图:
很好奇,为什么第一、二写法不会产生内存溢出呢?
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
这是因为前两个循环中创建的对象在循环完成一次后就没有用了,可以被垃圾回收机制回收内存,因此不会出现溢出。而第三种因为每次循环结束都会设置一下$i这个数组,数组$i的生命周期没有结束,持有对每一个Test对象的引用,造成创建的Test对象无法被垃圾回收机制回收,创建的太多了,内存占用就会越来越大,最终就内存溢出了。
第三种肯定会溢出,只是时间的问题,随着变量i增大,内存肯定不够,平常遇到大数组都是用完手动unset掉或者尽量分批操作