1.不壓縮直接下載
// 測試php導出大量數據到csv
public function actionExportData()
{
// 設置不超時
set_time_limit(0);
// 設置最大可用內存
ini_set('memory_limit', '1024M');
// 設置第一列名標題名稱
$columns = ['id', 'username', 'email'];
header('Content-Description: File Transfer');
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment; filename="導出數據-'.date('Y-m-d', time()).'.csv"');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
// 打開output流
$fp = fopen('php://output', 'a');
// 把變量從UTF-8轉成GBK編碼
mb_convert_variables('GBK', 'UTF-8', $columns);
// 將數據格式化為CSV格式並寫入到output流中
fputcsv($fp, $columns);
foreach (User::find()->select('id, username, email')->where(['status' => 10])->batch(100) as $items) {
foreach ($items as $item) {
$rowData = [
'id' => $item->id,
'username' => $item->username ?: '',
'email' => $item->email ?: '',
];
mb_convert_variables('GBK', 'UTF-8', $rowData);
fputcsv($fp, $rowData);
}
// 刷新輸出緩沖區
ob_flush();
flush();
}
fclose($fp);
exit();
}
2.導出成多個文件並打包成zip文件
public function actionZip()
{
// 設置不超時
set_time_limit(0);
// 設置最大可用內存
ini_set('memory_limit', '1024M');
// 設置第一列名標題名稱
$columns = ['id', 'username', 'email'];
// 下面以分頁形式導出
// 總記錄數
$countUser = User::find()->where(['status' => 10])->count();
// 總頁數
$pages = ceil($countUser / 200);
$fileArr = [];
for ($i = 0; $i < $pages; $i++) {
if ($i == 0) {
// 打開一個臨時文件
$filename = dirname(__DIR__) . '/components/page' . $i . '.csv';
$fileArr[] = $filename;
// 打開一個文件句柄
$fp = fopen($filename, 'w');
// 把變量從UTF-8轉成GBK編碼
mb_convert_variables('GBK', 'UTF-8', $columns);
fputcsv($fp, $columns);
}
$users = User::find()
->select('id, username, email')
->where(['status' => 10])
->asArray()
->limit(200)
->offset($i * 200)
->all();
foreach ($users as $user) {
mb_convert_variables('GBK', 'UTF-8', $user);
fputcsv($fp, $user);
}
// 刷新輸出緩沖區
//ob_flush();
//flush();
// 當已經輸出5頁的數據時再新建一個文件
if ($i != 0 && $i % 10 == 0) {
// 關閉當前文件
fclose($fp);
// 重新打開一個新文件
// 打開一個臨時文件
$filename = dirname(__DIR__) . '/components/page' . $i . '.csv';
$fileArr[] = $filename;
// 打開一個文件句柄
$fp = fopen($filename, 'w');
// 把變量從UTF-8轉成GBK編碼
mb_convert_variables('GBK', 'UTF-8', $columns);
fputcsv($fp, $columns);
}
if ($i == ($pages - 1)) {
// 如果是最后一頁,執行完就關閉文件
fclose($fp);
}
}
// 壓縮打包
$zip = new \ZipArchive();
$zipName = dirname(__DIR__) . '/components/' . time() . '.zip';
$zip->open($zipName, \ZipArchive::CREATE);
foreach ($fileArr as $file) {
$zip->addFile($file, basename($file));
}
$zip->close();
foreach ($fileArr as $file) {
unlink($file);
}
header('Content-disposition: attachment; filename=' . basename($zipName));
header("Content-Type: application/zip");
header("Content-Transfer-Encoding: binary");
header('Content-Length: ' . filesize($zipName));
readfile($zipName);
@unlink($zipName);
}