memory_get_usage(true) 取得記憶體現在使用狀況
strlen(serialize($OBJNAME)) 取的指定檔案的長度 (通常用來間接表達大小)
在PHPExcel最被詬病的為當匯出檔案過大時,會因為PHPExcel使用一堆迴圈
而占用許多記憶體,造成記憶體不足。
以自己使用經驗來說,100rows 配上 52cols 就會吃掉4mb多的記憶體
所以一次大概跑2000rows 就會吃掉快100mb,
以PHP預設值最大128MB來說 很快就會被吃光。
目前在1.7.6 自己的解決方法是
先將檔案存至EXCEL
// Export to Excel2007 (.xlsx) 匯出成2007
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
$objWriter->save('test.xlsx');
// Export to Excel5 (.xls) 匯出成2003
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
$objWriter->save('test.xls');
//再清空吃掉的記憶體
$objPHPExcel->disconnectWorksheets(); //此函數可參考底下//($objPHPExcel 為一開始new PHPExcel() 的object )
//附上PHPExcel.php 的 __construct() 與 disconnectWorksheets()
public function __construct()
{
// Initialise worksheet collection and add one worksheet
$this->_workSheetCollection = array();
$this->_workSheetCollection[] = new PHPExcel_Worksheet($this);
$this->_activeSheetIndex = 0;
// Create document properties
$this->_properties = new PHPExcel_DocumentProperties();
// Create document security
$this->_security = new PHPExcel_DocumentSecurity();
// Set named ranges
$this->_namedRanges = array();
// Create the cellXf supervisor
$this->_cellXfSupervisor = new PHPExcel_Style(true);
$this->_cellXfSupervisor->bindParent($this);
// Create the default style
$this->addCellXf(new PHPExcel_Style);
$this->addCellStyleXf(new PHPExcel_Style);
}
public function disconnectWorksheets() {
foreach($this->_workSheetCollection as $k => &$worksheet) {
$worksheet->disconnectCells();
$this->_workSheetCollection[$k] = null;
}
unset($worksheet);
$this->_workSheetCollection = array();
}
沒有留言:
張貼留言