PHPExcel weist einige ganz Speicher
Während PHPExcel eine schöne Bibliothek ist, verwendet, kann es riesige Mengen an Speicher zu PHP zugewiesen erfordern.
Nach this thread, nur 5 Zellen 6 MByte von Speichernutzung machen:
<?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.
Eine weitere user even failed with a 256MByte memory Einstellung.
Während PHPExcel Möglichkeiten bietet, seinen Speicherbedarf zu reduzieren, haben sich alle Reduzierungen in meinem Fall als zu klein herausgestellt. This page on github enthält Details zu den Cache-Management-Optionen von PHPExcel. Zum Beispiel serialisiert diese Einstellung und die GZIPs die Zellstruktur von einem Arbeitsblatt:
$cacheMethod = PHPExcel_CachedObjectStorageFactory::cache_in_memory_gzip;
PHPExcel_Settings::setCacheStorageMethod($cacheMethod);
PHPExcel's FAQ erklärt dies:
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
Messergebnisse für PHP Excel
I instrumentiert die PHPExcel Beispiel Datei [01simple.php][5]
und hat einige Schnelltests.
Verbrauchen 92 KByte:
for($n=0; $n<200; $n++) {
$objPHPExcel->setActiveSheetIndex(0) ->setCellValue('A' . $n, 'Miscellaneous glyphs');
}
Verbraucht 4164 KBytes:
for($n=0; $n<200; $n++) {
$objPHPExcel->setActiveSheetIndex(0) ->setCellValue('A' . $n, 'Miscellaneous glyphs');
$objPHPExcel->getActiveSheet()->getStyle('A' . $n)->getAlignment()->setWrapText(true);
}
Wenn man dieses Fragment mehrere Male unverändert ausgeführt wird, wobei jedes Fragment etwa 4 MBytes verbraucht.
Ihre Anwendung prüfen ist logisch korrekt
Um sicherzustellen, dass Ihre Anwendung logisch korrekt ist, würde ich vorschlagen erste PHP-Speicher zu erhöhen:
ini_set('memory_limit', '32M');
In meinem Fall muss ich Export, um Ergebnisdaten einer Online-Bewertungsanwendung zu exportieren.Während es weniger als 100 Zellen horizontal gibt, muss ich bis zu mehreren 10.000 Zeilen exportieren. Während die Anzahl der Zellen groß war, enthält jede meiner Zellen eine Zahl oder eine Folge von 3 Zeichen - keine Formeln, keine Stile.
Bei starken Speicherbeschränkungen oder großer Tabellen
In meinem Fall keine der Cache-Optionen reduzierte die Menge so viel wie nötig. Außerdem ist die Laufzeit der Anwendung enorm gewachsen.
Schließlich musste ich zu altmodischen CSV-Dateiexporten wechseln.
Da PHPExcel gibt es kein Limit für die Anzahl der Stile (obwohl Excel selbst, ist es weit über 20), und eine Reihe unserer Demo-Skripte im Ordner/Beispiele verwenden mehr als 20 verschiedene Stile, können Sie bitte ein funktionierendes Beispiel für Code, der dieses Problem veranschaulicht. Möglicherweise liegt das Problem in einem bestimmten Stil, den Sie festlegen, und nicht nach einer Reihe von Stilen. –
Was ist '$ this' in Ihrer Frage und was ist' $ coords' in Ihrer Frage und wo ist der Rest des minimalen Beispiels, um Ihr Problem zu reproduzieren? http://meta.stackexchange.com/questions/22754/sscce-how-to-provide-example-for-programming-questions – hakre