如何在Laravel中将包含大记录的csv文件上传到数据库中

时间:2018-05-09 08:04:24

标签: laravel csv import upload xls

我正在尝试上传包含大约10,000条记录的.csv或.xls文件。对于第一次尝试,下面的函数/代码读取csv文件,并且能够在约2分钟内将 1600行/记录插入到事务表中,而没有代码行: set_time_limit( 0); 我得到了:最大执行超时错误

第二次尝试,现在使用代码: set_time_limit(0); 这一次, 在~11分钟内插入了10,000条记录

我现在的问题是:

1.如何读取csv / xls文件并将其记录/行> = 10,000 插入到Laravel应用程序的数据库中,速度非常快?

2.我在这里使用的练习'set_time_limit(0)'是一个很好的练习吗?有没有更好的方法可以解决这个问题?

3.在读取和插入之前,是否可以确定完成操作/执行所需的时间/最长时间?

public function importDataSet(Request $request)
{

    if(Input::hasFile('file')){
        $file = Input::file('file');
        $uname = uniqid();
        $oname = $file->getClientOriginalName();
        $filename = $uname.$oname;
        //create a folder, data-sets, if not exist in the public folder
        $filelocation = 'data-sets';
        $filepath=$file->move($filelocation, $filename);

        ini_set('auto_detect_line_endings', TRUE);

        $header = '';
        $rows = array_map('str_getcsv', file($filepath));
        $header = array_shift($rows);
        $csv = array();
        set_time_limit(0);//reset maximum execution time to infinity for this function
        foreach ($rows as $row) {
            $csv[] =  $row;//Is not used
            //eturn $rows;
            $transaction = new Transaction;
            $transaction->dataset_id = 1;
            $transaction->itemsets=json_encode($row);
            $transaction->save();
        }
    }else{
        //noting here
    }
    return 'Success';
}

1 个答案:

答案 0 :(得分:0)

在我看来,这是Eloquent等活跃记录ORM的一大缺点。现在,您正在为保存的每条记录执行数据库查询,这本身就是10,000个查询。

解决问题的一种简单方法是使用mysqlimport,因为无论如何你都有.csv文件。这主要适用于一次性上传。

另一种方法是使用模型或查询构建器的insert()命令。已经有一个很好的答案here几乎直接回答了你的问题。