【发布时间】:2016-11-04 06:17:25
【问题描述】:
我目前正在使用数组和 fputcsv 将 MySQL 表导出到 csv 文件。这很好用,但是我有一个表对于这种方法来说太大(100,000 + 行),所以我的网站超时了。
我当前的代码是;
<?php
//open database connection
require ('../database-config.php');
header('Content-Type: text/csv');
header('Content-Disposition: attachment;filename=exported_archive_all.csv');
//SQL Query for Data
$sql = "SELECT * FROM inverter_data_archive;";
//Prepare Query, Bind Parameters, Excute Query
$STH = $dbh->prepare($sql);
$STH->execute();
//Export to .CSV
$fp = fopen('php://output', 'w');
// first set
$first_row = $STH->fetch(PDO::FETCH_ASSOC);
$headers = array_keys($first_row);
fputcsv($fp, $headers); // put the headers
fputcsv($fp, array_values($first_row)); // put the first row
while ($row = $STH->fetch(PDO::FETCH_NUM)) {
fputcsv($fp,$row); // push the rest
}
fclose($fp);
?>
我读过一种可能的方法是从查询结果集中单独读取每个数据行并直接写入 php://output,然后读取下一行等;而不是构建一个大型数组或在内存中构建 csv。
我已经尝试了一些事情,但我在 for 循环中遇到了困难,因此非常感谢任何有关如何实现这一点的帮助。
【问题讨论】:
-
既然可以直接使用 PHP,为什么还要这样做呢? stackoverflow.com/questions/356578/…
-
this 怎么样。对你有用吗?
-
该页面上的示例仍将整个表加载到数组中,因此会导致相同的内存/超时问题。