【发布时间】:2021-04-30 18:15:15
【问题描述】:
如果我的代码看起来像这样(这里是 Laravel 代码,但它应该普遍适用):
class SomeClass
{
public function doSomething(array $data)
{
foreach ($data as $item) {
$this->doSomethingWithItem($item);
}
}
private function doSomethingWithItem($item)
{
$model = SomeModel::make($item);
// ... some other stuff
$model->save();
}
}
所以我的问题是,如果$data 是一个非常大的集合(在我的实际实现中它是一个生成器),内存使用量会随着数据项的数量线性增加。
既然$model 是一个局部变量并且只被引用,那么它不应该被垃圾收集吗?我什至在最后尝试了unset($model) 来强制释放它,但它没有效果。
如何在不增加内存使用量的情况下使用这种模式?由于我没有存储任何数据结构,内存使用量不应该随着每次迭代而增加吗?
我错过了什么吗?
【问题讨论】:
-
很奇怪,即使它是正在重写的类的变量,理论上应该释放内存,如果问题存在的话。
-
这是一篇关于 PHP 和内存的好文章 toptal.com/php/objects-references-php-memory
标签: php laravel memory garbage-collection out-of-memory