数据模型对象如何立即销毁并释放该对象占用的内存空间

问题描述

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;
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 1

使用的是 unset() 函数和对象赋值为 NULL

这两种方式没啥区别,直接用 unset 即可(好像是上次 phpconf 哪个嘉宾说的)

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!