代码之家  ›  专栏  ›  技术社区  ›  Success Man

如何在Laravel上插入大数据?

  •  2
  • Success Man  · 技术社区  · 7 年前

    我用的是Laravel 5.6

    我插入大数据的脚本如下:

    ...
    $insert_data = [];
    foreach ($json['value'] as $value) {
        $posting_date = Carbon::parse($value['Posting_Date']);
        $posting_date = $posting_date->format('Y-m-d');
        $data = [
            'item_no'                   => $value['Item_No'],
            'entry_no'                  => $value['Entry_No'], 
            'document_no'               => $value['Document_No'],
            'posting_date'              => $posting_date,
            ....
        ];
        $insert_data[] = $data;
    }
    \DB::table('items_details')->insert($insert_data);
    

    我试着用这个脚本插入100个记录,它可以工作。它成功地插入数据

    但是如果我尝试用脚本插入50000条记录,它会变得非常慢。我等了大约10分钟,但没用。存在如下错误:

    504 Gateway Time-out
    

    我如何解决这个问题?

    1 回复  |  直到 7 年前
        1
  •  3
  •   haakym    7 年前

    如前所述,如果块是时间执行问题,那么在这种情况下,块并不能真正帮助您。我认为您尝试使用的大容量插入无法处理该数量的数据,因此我看到两个选项:

    1-重新组织代码以正确使用块,如下所示:

    $insert_data = [];
    
    foreach ($json['value'] as $value) {
        $posting_date = Carbon::parse($value['Posting_Date']);
    
        $posting_date = $posting_date->format('Y-m-d');
    
        $data = [
            'item_no'                   => $value['Item_No'],
            'entry_no'                  => $value['Entry_No'], 
            'document_no'               => $value['Document_No'],
            'posting_date'              => $posting_date,
            ....
        ];
    
        $insert_data[] = $data;
    }
    
    $insert_data = collect($insert_data); // Make a collection to use the chunk method
    
    // it will chunk the dataset in smaller collections containing 500 values each. 
    // Play with the value to get best result
    $chunks = $insert_data->chunk(500);
    
    foreach ($chunks as $chunk)
    {
       \DB::table('items_details')->insert($chunk->toArray());
    }
    

    这样,您的大容量插入将包含较少的数据,并且能够以相当快的方式处理它。

    2-如果您的主机支持运行时重载,您可以在代码开始执行之前添加一个指令:

    ini_set('max_execution_time', 120 ) ; // time in seconds
    
    $insert_data = [];
    
    foreach ($json['value'] as $value)
    {
       ...
    }
    

    要了解更多信息,请向官员咨询 docs

    推荐文章