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 在其他地方被引用 (依赖注入) 了没有触发回收机制。
这种情况如何释放内存?

《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
李铭昕
最佳答案
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";
    }
});

这样试试

4年前 评论
cxcsz (楼主) 4年前
李铭昕 (作者) 4年前
cxcsz (楼主) 4年前
讨论数量: 4

$db = null;

4年前 评论
cxcsz (楼主) 4年前
   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);
        });
4年前 评论
cxcsz (楼主) 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";
    }
});

这样试试

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

使用 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

3年前 评论