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

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
李铭昕
最佳答案
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

$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年前
李铭昕
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年前 评论

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