PHPExcel分配相當長的一段記憶
雖然PHPExcel是一個美麗的圖書館,使用它可能需要分配給PHP大量內存。
根據this thread,只是5細胞可使得存儲器使用的6兆字節:
<?php
require_once 'php/PHPExcelSVN/PHPExcel/IOFactory.php';
$objPHPExcel = PHPExcel_IOFactory::load("php/tinytest.xlsx");
$objPHPExcel->setActiveSheetIndex(0);
$objPHPExcel->getActiveSheet()->setCellValue('D2', 50);
echo $objPHPExcel->getActiveSheet()->getCell('D8')->getCalculatedValue() . "
";
echo date('H:i:s') . " Peak memory usage: " . (memory_get_peak_usage(true)/1024/1024) . " MB\r\n";
?>
I get 6MB of memory usage.
另一個user even failed with a 256MByte memory設置。
雖然PHPExcel提供了減少內存佔用的方法,但在我的情況下,所有的減少量都變得太小了。 This page on github提供了PHPExcel的緩存管理選項的詳細信息。例如,該設置序列化和的gzip工作表的單元格結構:
$cacheMethod = PHPExcel_CachedObjectStorageFactory::cache_in_memory_gzip;
PHPExcel_Settings::setCacheStorageMethod($cacheMethod);
PHPExcel's FAQ解釋這一點:
Fatal error: Allowed memory size of xxx bytes exhausted (tried to allocate yyy bytes) in zzz on line aaa
PHPExcel holds an "in memory" representation of a spreadsheet, so it is susceptible to PHP's memory limitations. The memory made available to PHP can be increased by editing the value of the memorylimit directive in your php.ini file, or by using iniset('memory_limit', '128M') within your code (ISP permitting);
Some Readers and Writers are faster than others, and they also use differing amounts of memory. You can find some indication of the relative performance and memory usage for the different Readers and Writers, over the different versions of PHPExcel, here http://phpexcel.codeplex.com/Thread/View.aspx?ThreadId=234150
If you've already increased memory to a maximum, or can't change your memory limit, then this discussion on the board describes some of the methods that can be applied to reduce the memory usage of your scripts using PHPExcel http://phpexcel.codeplex.com/Thread/View.aspx?ThreadId=242712
爲PHP的Excel
我儀表的PHPExcel測量結果示例文件[01simple.php][5]
並做了一些快速測試。
消耗92 K字節:
for($n=0; $n<200; $n++) {
$objPHPExcel->setActiveSheetIndex(0) ->setCellValue('A' . $n, 'Miscellaneous glyphs');
}
消耗4164千字節:
for($n=0; $n<200; $n++) {
$objPHPExcel->setActiveSheetIndex(0) ->setCellValue('A' . $n, 'Miscellaneous glyphs');
$objPHPExcel->getActiveSheet()->getStyle('A' . $n)->getAlignment()->setWrapText(true);
}
如果一個執行該片段幾次不變,每個片段消耗約4兆字節。
檢查您的應用程序是邏輯上是正確
要確保,你的應用是邏輯上是正確的,我會建議首先增加PHP內存:
ini_set('memory_limit', '32M');
就我而言,我不得不導出到在線評估應用程序的導出結果數據。雖然水平少於100個單元格,但我需要導出多達10.000行。儘管細胞數量很大,但我的每個細胞都擁有一個數字或一串3個字符 - 沒有公式,也沒有樣式。
在強大的內存限制或大型電子表格
在我的情況下,要求無緩存選項減少量一樣多。另外,應用程序的運行時間也大大增加。
最後,我不得不切換到老式的CSV數據文件導出。
由於PHPExcel對樣式數量沒有任何限制(儘管Excel本身也有,它遠高於20),並且/ Examples文件夾中的一些演示腳本使用超過20種不同的風格,你能否提供一個演示這個問題的代碼的工作示例。問題可能在於你設定的特定風格,而不是多種風格之後。 –
在你的問題中'$ this'是什麼,在你的問題中'$ coords'是什麼,以及最小的例子的其餘部分在哪裏來重現你的問題? http://meta.stackexchange.com/questions/22754/sscce-how-to-provide-examples-for-programming-questions – hakre