【问题标题】:File Export Script Hangs on Large Output文件导出脚本挂在大输出上
【发布时间】:2014-07-26 19:29:06
【问题描述】:

下面是我用来将 MySQL 数据库导出到 .csv 文件的脚本。

对于较小的输出(大约 30,000 行以下)似乎可以正常工作,但会挂在较大的输出上并且无法完成(总共 100 万行)。

有什么想法吗?

此外,PHPMyAdmin 导出实用程序可以非常快地转储它(只需几秒钟)。想知道它是如何做到的。

if(isset($_POST['submit'])) {
// Fetch Record from Database
$output = "";
$table = "tt_output";
$sql = mysqli_query($connection,"select * from {$table}");
$columns_total = mysqli_num_fields($sql);

// Get The Field Name
$query = "SHOW COLUMNS FROM {$table}"; $result_set = mysqli_query($connection,$query);
while ($result = mysqli_fetch_array($result_set)) {
    $heading = $result[0];
    $output .= trim($heading.',');
}

$output = substr($output,0,strlen($output)-1)."\r\n";

// Get Records from the table
while ($row = mysqli_fetch_array($sql)) {
    for ($i = 0; $i < $columns_total; $i++) {
        $output .='"'.$row["$i"].'",';
    }
    $output = substr($output,0,strlen($output)-1)."\r\n";
}

// Download the file
$filename = "output".".csv";
header("Pragma: public", true);
header("Expires: 0"); // set expiration time
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Content-Type: application/force-download");
header("Content-Type: application/octet-stream");
header("Content-Type: application/download");
header('Content-Disposition: attachment; filename='.$filename);
header("Content-Transfer-Encoding: binary");
header('Connection: Keep-Alive');

echo $output;
exit;

}

【问题讨论】:

    标签: php mysql export


    【解决方案1】:

    我可以看到的问题是您正在将所有内容读入变量/内存,然后才开始输出它。

    您应该将循环放在标题下方并立即输出:

    ...
    header('Connection: Keep-Alive');
    
    // Get Records from the table
    while ($row = mysqli_fetch_array($sql)) {
        for ($i = 0; $i < $columns_total; $i++) {
            $output .='"'.$row["$i"].'",';
        }
        echo substr($output,0,strlen($output)-1)."\r\n";
    }
    

    另一个可能的问题是你如何构建你的行。如果任何字段包含未转义的 " 字符,它将破坏您的 csv。您可能希望使用 fputcsv() 将 csv 保存到临时文件中,然后再将其发送给客户端。

    您还可以为自己保存一个查询,因为列名将是结果数组的键,如果您真的想手动构建 csv,您可以使用 implode() 而不是循环,但您必须测试是否这样更快。

    【讨论】:

    • 这一切看起来都是很棒的建议。我会马上试一试,然后告诉你结果如何!
    • 工作就像一个绝对的魅力!您的回复还帮助我更好地理解了这种输出方法,并为我未来的脚本提供了很多弹药!谢谢!
    猜你喜欢
    • 2011-12-16
    • 2015-01-29
    • 2016-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多