DB 添加数据如何实时释放掉内存?

描述:我需要导入大量数据到数据库,通过循环 DB::insert 的方式插入数据,结果执行一段时间就提示内存超出。我检查代码发现。 DB 部分一直没释放内存导致的。
测试:我添加测试内容

Route::get('/test', function () {
    for ($i=0; $i<9; $i++) {
        \Illuminate\Support\Facades\DB::table('test')->insert(['news_uuid'=>1111111]);
        echo "内存:",memory_get_usage(),"\n";
    }
});
返回结果:
内存:14310456
内存:14311040
内存:14311624
内存:14312208
内存:14312792
内存:14313376
内存:14313960
内存:14314544
内存:14315448

发现的确是这个部分一直占用内存。
我尝试释放对象:

Route::get('/test', function () {
  for ($i=0; $i<9; $i++) {
  $db = new \Illuminate\Support\Facades\DB();
  $db::table('test')->insert(['news_uuid'=>1111111]);
 unset($db);
 echo "内存:",memory_get_usage(),"\n";
  }
});
返回结果:
内存:14314752
内存:14315336
内存:14315920
内存:14316504
内存:14317088
内存:14317672
内存:14318256
内存:14318840
内存:14319744

依然没有释放内存,我猜想是否是 DB 在其他地方被引用(依赖注入)了没有触发回收机制。
这种情况如何释放内存?

《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
李铭昕
最佳答案
Route::get('/test', function () {
    $query = \Illuminate\Support\Facades\DB::table('test');
    for ($i=0; $i<9; $i++) {
        $query->insert(['news_uuid'=>1111111]);
        echo "内存:",memory_get_usage(),"\n";
    }
});

这样试试

3年前 评论
cxcsz (楼主) 3年前
李铭昕 (作者) 3年前
cxcsz (楼主) 3年前
讨论数量: 4
李铭昕
Route::get('/test', function () {
    $query = \Illuminate\Support\Facades\DB::table('test');
    for ($i=0; $i<9; $i++) {
        $query->insert(['news_uuid'=>1111111]);
        echo "内存:",memory_get_usage(),"\n";
    }
});

这样试试

3年前 评论
cxcsz (楼主) 3年前
李铭昕 (作者) 3年前
cxcsz (楼主) 3年前

使用 DB::purge()释放掉内存

laravel里面有关数据库连接的方法在vendor/laravel/framework/src/Illuminate/Database/DatabaseManager.php中,disconnect()可以断开PDO连接,reconnect()断开连接后重连,但是这两个方法都是只断开不会释放连接,当再次连接时,直接从 $this->connections数组中取出来。purge()断开连接后,会将他从$this->connections中unset掉,释放内存

参考链接 www.05do.com/blog/content/214

2年前 评论

$db = null;

3年前 评论
cxcsz (楼主) 3年前
   Route::get('/test', function () {
            $data = [];
            for ($i=0; $i<9; $i++) {
                $data[] = ['news_uuid'=>1111111];
            }
            \Illuminate\Support\Facades\DB::table('test')->insert($data);
            unset($data);
        });
3年前 评论
cxcsz (楼主) 3年前

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