php百萬資料透過指令碼檔案寫入csv

_M09發表於2022-12-30

需求:百萬資料寫入csv。
框架:N多年前老框架,百度都搜不到了,所以寫法趨近原生

分析:資料量過大,不能用瀏覽器請求寫入csv下載,所以寫個指令碼調取

虛擬碼:

//xxx - 根據自己專案替換
//調取指令碼檔案
exec(xxx);

//指令碼檔案
//設定執行時間和記憶體
set_time_limit(0);
ini_set('memory_limit', '128M');
//迴圈獲取
$id = 0;
$data = 'xxx'.'\n';//表頭
while(true){
    //SQL
    $list = xxx WHERE id > $id ORDER BY id ASC LIMIT 10000; //每次取1w防止資料庫壓力大,根據sql來,我這個有聯表,
    if(empty($list)){
        break;
    }
    foreach($list as $row){
        $data .= '"' . $row['xxx'] . '",';
        $data .= "\n";
        $id = $row['id'];//更新最大id
    }
    //追加寫入csv
    file_put_contents('xxx', mb_convert_encoding($data, 'gbk'),FILE_APPEND);
    unset($data);//基礎不好不確定初始化能不能清記憶體就先unset了
    $data = '';//初始化
}

本質上就是分批寫入,剛開始試驗的時候是打算不把file_put_contents寫在迴圈裡的,後來發現資料量大的時候,幾十萬資料$data記憶體就超了:laughing:另外如果超百萬資料的話需要做分檔案匯出,excel不支援開啟超過1048576行,理論上就是加個$all_count引數計當前查詢的總數,超過百萬再加新檔案。

如果有更好的方法,或者程式碼最佳化部分歡迎討論。

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章