我正在创建一个查询应用程序,供用户过滤多个表,然后将结果下载为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,并在准备好后下载它,或者直接创建并下载它。
欢迎提出任何建议!