将大型mysql表导出到CSV laravel / php〜300k +行

时间:2019-02-12 21:29:19

标签: laravel export export-to-csv

我正在创建一个查询应用程序,供用户过滤多个表,然后将结果下载为CSV文件,这样做返回结果很小,事实证明这很容易,但是其中一些返回数据集将超过300k行。数据。

正在抛出超时错误,因此我需要一种新的方法。应用程序是用laravel编写的。

我能够运行原始查询并创建了包含38万行数据的csv,但是--secure-file-priv迫使我将文件放入特定位置。我需要下载文件,以便过滤掉数据的用户可以访问。

我目前的3种方法如下:

//        $performance = DB::select("SELECT * from performance_datas INTO OUTFILE '/var/lib/mysql-files/performance_data2.csv' FIELDS ENCLOSED BY '\"' TERMINATED BY ';' ESCAPED BY '\"' LINES TERMINATED BY '\r\n' ;");

此原始查询创建了预期的文件,但我不知道如何使用户可以下载该文件。

方法2:

$headers = array(
        'Content-Type'        => 'text/csv',
        'Cache-Control'       => 'must-revalidate, post-check=0, pre-check=0',
        'Content-Disposition' => 'attachment; filename=performances.csv',
        'Expires'             => '0',
        'Pragma'              => 'public',
    );

    $response = new StreamedResponse(function() use($filename){
        // Open output stream
        $handle = fopen($filename, 'w');

        // Add CSV headers
        fputcsv($handle, [
            "id", "ref", "DataSet", "PubID", "TrialID", "TrtID", "SubjectID", "Site_Sample", "Day_Sample",
            "Time_Sample", "VarName", "VarValue", "VarUnits", "N", "SEM", "SED", "VarType"
        ]);

        PerformanceData::all()
            ->chunk(1500, function($datas) use($handle) {
                foreach ($datas as $data) {
                    // Add a new row with data
                    fputcsv($handle, [
                        // put data in file
                    ]);
                }
            });

        // Close the output stream
        fclose($handle);
    }, 200, $headers);

此方法超时。在这种情况下,我使用Laravel获取:: all(),这将是此特定表的最大数据集。

方法3只是方法2的不同变体,具有相同的超时结果。

我需要用户能够创建一个csv,并在准备好后下载它,或者直接创建并下载它。

欢迎提出任何建议!

0 个答案:

没有答案