PHP服务器文件下载意外中断



我在WordPress网站的管理部分构建了一个web界面。它在我的数据库中抓取了一些表,并逐行显示了一个大的数据列表。这些数据大约有30000行,在for循环中以基本回波显示。在一个页面上显示所有30000行效果良好。

此外,我还提供了一个选项,可以下载完整数据行的CSV文件。我使用fopenfputcsv来构建CSV文件,以便从数据查询的结果中下载。这个功能曾经有效,但现在数据集为30000,CSV将不再正确生成。发生的情况是,前200~1000行将被写入CSV文件,而忽略了大部分数据。我估计,在我的情况下,未正确生成的CSV大约为10兆欧。然后,该文件将下载前200~1000行,就好像一切都正常工作一样。

这是代码:

// This gets a huge list of data from a SP I built. This data is well formed
$data = $this->run_stats_stored_procedure($job_to_report);
// This is where the data is converted into a csv file. This part is broken
// the file may already exist at that location burn it down if it does
if(file_exists(ABSPATH . "some/path/to/my/file/csv_export.csv")) {
    unlink(ABSPATH . "some/path/to/my/file/csv_export.csv");                 
}
$csv_file_handler = fopen(ABSPATH . "some/path/to/my/file/candidate_export.csv", 'w');
if(!empty($csv_file_handler)) {
    $title_array = array(
        "ID",
        "other_feild"
    );
    fputcsv($csv_file_handler, $title_array, ",");
    if(!empty($data)) {
        foreach($data as $data_piece) {
            $array_as_csv_line = array();   
            foreach($data_piece as $object_property) {                  
                $array_as_csv_line[] = (string)$object_property;
            }
            fputcsv($csv_file_handler, $array_as_csv_line, ",");    
            unset($array_as_csv_line);
        }
    } else {
        fputcsv($csv_file_handler, array("empty"), ",");
    }           
    // pros clean everything up when they are done
    fclose($csv_file_handler);
}

我不确定我需要更改什么才能下载整个CSV文件。我相信这可能是一个配置问题,但我不应该。我之所以相信这一点,是因为这个函数过去甚至可以处理20000个csv行,现在它已经达到30000个并且正在崩溃。请告诉我其他信息是否会有所帮助。以前有人遇到过巨大CSV文件的问题吗?感谢任何能提供帮助的人。

"下载"的时间是超过一分钟、两分钟还是三分钟?如果是这样,则Web服务器可能正在关闭连接。例如,如果您使用的是Apache FCGI模块,它有以下指令:

FcgidBusyTimeout

默认为300秒。

这是请求处理的最长时间限制。如果FastCGI请求没有在FcgidBusyTimeout秒内完成,它将被终止

希望这能帮你解决问题。

我目前正在实现的答案是允许脚本使用更多的时间。要做到这一点,我只需在脚本运行之前运行以下代码:

set_time_limit ( 3600 );

我正在做进一步的研究,因为这不是一个可持续的解决方案。如有任何进一步的建议,我们将不胜感激。

最新更新