【问题标题】:PHP server file download cutoff unexpectedlyPHP 服务器文件下载意外中断
【发布时间】:2013-08-28 20:47:55
【问题描述】:

我有一个内置到 WordPress 网站管理部分的 Web 界面。它会在我的数据库中抓取一些表,然后逐行显示一个大数据列表。该数据大约有 30,000 行,在 for 循环中以基本回显形式显示。在页面上显示所有 30,000 行工作正常。

此外,我还提供了一个选项,用于下载包含完整数据行的 CSV 文件。我使用fopen 然后fputcsv 来构建CSV 文件,以便从数据查询的结果中下载。此功能曾经有效,但现在数据集为 30,000,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 文件。我相信这可能是一个配置问题,但我不应该。我被引导相信这一点,因为这个函数过去甚至可以处理 20,000 个 csv 行,现在它已经达到 30,000 个并且正在中断。如果其他信息有帮助,请告诉我。以前有没有人遇到过巨大的 CSV 文件的问题?感谢任何可以提供帮助的人。

【问题讨论】:

    标签: php wordpress apache csv download


    【解决方案1】:

    “下载”的时间是多于一分钟、两分钟还是三分钟?如果是这样,网络服务器可能正在关闭连接。例如,如果你使用的是 Apache FCGI 模块,它有这个指令:

    FcgidBusyTimeout
    

    默认为 300 秒。

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

    希望这可以帮助您解决问题。

    【讨论】:

      【解决方案2】:

      我目前正在实施的答案是允许脚本使用更多时间。为此,我只是在脚本运行之前运行以下代码:

      set_time_limit ( 3600 );
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-05-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-07
        • 2017-10-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多