laravel 实现 100w 大量数据插入数据库

小天天天天    PHP    388 次    2021-12-07 10:45:49


在使用 laravel eloquent 进行数据库操作的时候惊讶的发现这货居然不支持批量添加,看到网上很多人在循环里进行数据库插入操作来实现批量添加,我想说这样做是很损失性能滴!好在框架的 DB 门面里的 insert 方法可以进行批量插入。

$data= [
  ['name'=>'111'],
  ['name'=>'222'],
];
DB::table('xxx')->insert($data);

但是我的数据有点多,100w 条数据需要导入数据库,一条条插入,需要好久的时间。原生 sql 可以实现拼接语句实现批量执行达到快速导入的效果。在 laravel 框架中貌似要自己实现,查找发现集合的 chunk 方法实现数据分块处理,达到组装批量插入效果。代码如下:

 set_time_limit(0);

 try {
    //上传文件位置,这里默认是在storage中,如有修改请对应替换
    $file = storage_path('/app/public/' . $input['file']);
    $domain = [];
    foreach($this->readTxt($file) as $key=>$line) {
        $domain[$key] = $line;
    }
    //数组分块处理
    $chunck = collect($domain);
    $chunks = $chunck->chunk(1000);
    $chunks->all();
    foreach ($chunks as $key=>$val){
        $arr = [];
        foreach ($val as $k =>$value){
            $arr[$k]['domain'] = $value;
            $arr[$k]['created_at'] = date('Y-m-d H:i:s');
        }
        DB::table('domain')->insert($arr);
   }
 }catch (\Exception $e) {
    return $this->response()->error($e->getMessage());
 }

读文件使用的方法:

  public function readTxt($path)
    {
        $file = fopen($path, "r");
        //输出文本中所有的行,直到文件结束为止。
        while (!feof($file)) {
            yield trim(fgets($file));  //迭代器,
        }
        fclose($file);
    }

如果你觉得本篇文章对您有帮助,请打赏作者

最新评论

暂无评论

最新评论

网站数据

网站文章数:365

注册用户数:23

TOP