数据模型对象如何立即销毁并释放该对象占用的内存空间
问题描述
Laravel通过Eloquent ORM
创建数据库模型,数据插入数据库之后,模型无法立即销毁并立即释放内存空间,使用的是unset()
函数和对象赋值为NULL
,发现内存并没有释放
测试代码
Laravel框架中使用数据模型对象,随着循环次数的增加,内存不断飙升
use Illuminate\Support\Facades\DB;
use App\Test;
class Test
{
public function test()
{
$begin_used = memory_get_usage();
for ($i=0; $i < 100; $i++) {
// 方法一:save()
$test = new Test;
$test->name = 'aaa';
$test->age = 10;
$test->save();
unset($test);
// 方法二:create()
$test = Test::create([
'name' => 'aaa',
'age' => 10,
]);
unset($test);
// 方法三:DB
DB::insert('insert into test (name, age) values (?, ?)', ['aaa', 10]);
}
$end_used = memory_get_usage();
echo "占用内存(B):".round(($end_used-$begin_used), 3).' B.'.'<br>';
echo "占用内存(KB):".round(($end_used-$begin_used)/1024, 3).' KB.'.'<br>';
echo "占用内存(MB):".round(($end_used-$begin_used)/1024/1024, 3).' MB.'.'<br>';
}
}
纯php脚本,通过unset方法,增加循环次数,并不会导致内存的飙升
class Test
{
protected $name;
public function aaa($name)
{
$this->name = $name;
}
}
$begin = memory_get_usage();
for ($i=0; $i < 10000; $i++) {
$test = new Test;
$test->aaa('aaa');
unset($test);
}
$end = memory_get_usage();
echo "占用内存(KB):".round(($end-$begin)/1024, 3).' KB.'.PHP_EOL;
这两种方式没啥区别,直接用
unset
即可(好像是上次 phpconf 哪个嘉宾说的)