文件导出脚本在大输出上挂起

时间:2014-06-05 17:21:26

标签: php mysql export

以下是用于将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;

}

1 个答案:

答案 0 :(得分: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()而不是循环但是必须使用测试是否更快。