首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 匯出 CSV 抽象類別:分批處理避免記憶體不足

     編輯:PHP 綜合知識

抽象類別 ExportCSV 依總筆數與每批筆數計算批次,迴圈分批寫入,解決大量資料匯出記憶體溢出問題。

核心設計

  • 抽象方法:getExportTotal()、getExportFields()、getExportData($offset,$limit) 由子類別實作。
  • 可設定:每批筆數 setPageSize()、檔名 setExportName()、分隔符 setSeparator()、定界符 setDelimiter()。
  • 匯出流程:取得總筆數 → 計算批次 → 寫入標頭 → 迴圈讀取資料 → 格式化 CSV → 輸出。

類別架構

<?php
abstract class ExportCSV{
    protected $total=0; $pagesize=500; $exportName='export.csv'; $separator=','; $delimiter='"';
    abstract protected function getExportTotal();
    abstract protected function getExportFields();
    abstract protected function getExportData($offset,$limit);
    public function setPageSize($pagesize){ if(is_numeric($pagesize)&&$pagesize>0) $this->pagesize=$pagesize; }
    public function setExportName($filename){ if($filename) $this->exportName=$filename; }
    public function setSeparator($sep){ if($sep) $this->separator=$sep; }
    public function setDelimiter($del){ if($del) $this->delimiter=$del; }
    public function export(){
        $this->total = $this->getExportTotal(); if(!$this->total) return false;
        $pagecount = ceil($this->total/$this->pagesize);
        $fields = $this->getExportFields();
        // 設定 HTTP 標頭輸出 CSV...
        for($page=0;$page<$pagecount;$page++){
            $offset = $page*$this->pagesize;
            $data = $this->getExportData($offset,$this->pagesize);
            // 格式化並輸出每列
        }
    }
    private function formatCSV($row){ /* 逸出雙引號、包裹定界符 */ }
    private function escape($str){ return str_replace('"','""',$str); }
}
?>

子類別實作範例

class UserExport extends ExportCSV{
    protected function getExportTotal(){ return User::count(); }
    protected function getExportFields(){ return array('ID','姓名','Email','建立時間'); }
    protected function getExportData($offset,$limit){
        return User::find()->limit($limit)->offset($offset)->asArray()->all();
    }
}
$exporter = new UserExport();
$exporter->setPageSize(1000);
$exporter->export();
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved