當需要將大量資料庫資料匯出為 Excel 相容的 CSV 格式時,使用 PHPExcel 等函式庫容易因記憶體不足而失敗。利用 fputcsv 搭配 php://output 串流,可逐行輸出資料,有效降低記憶體佔用。
php://output 寫入串流。ob_flush() 與 flush() 釋放輸出緩衝。header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment;filename="user.csv"');
header('Cache-Control: max-age=0');
$fp = fopen('php://output', 'a');
$head = array('姓名', '性別', '年齡', 'Email', '電話');
foreach ($head as $i => $v) {
$head[$i] = iconv('utf-8', 'gbk', $v);
}
fputcsv($fp, $head);
$cnt = 0;
$limit = 100000;
while ($row = $stmt->fetch(Zend_Db::FETCH_NUM)) {
$cnt++;
if ($limit == $cnt) {
ob_flush();
flush();
$cnt = 0;
}
foreach ($row as $i => $v) {
$row[$i] = iconv('utf-8', 'gbk', $v);
}
fputcsv($fp, $row);
}
此方式適合百萬筆以上的大量資料匯出,確保伺服器記憶體穩定。