Heim > Artikel > Backend-Entwicklung > Lösung für den PHPExcel-Speicherüberlauf beim Exportieren von Dateien
Der Inhalt dieses Artikels befasst sich mit der Lösung des PHPExcel-Speicherüberlaufs beim Exportieren von Dateien. Ich hoffe, dass er für Freunde hilfreich ist.
Bei der Verwendung von PHPExcel zum Exportieren von Dateien werden häufig PHP-Speicherüberlauffehler gemeldet, da die Dateien zu groß sind. Um dieses Problem zu lösen, können Sie die von PHPExcel bereitgestellten Parameter zur Optimierung verwenden . Die hier erwähnte übergroße Excel-Datei bedeutet nicht unbedingt die Dateigröße, sondern, was noch wichtiger ist, die in der Datei gespeicherten Daten und das Format. Wenn viele Daten vorhanden sind und das Format umfangreich ist, wird der Speicher von PHP leicht erschöpft.
Information 2 weist darauf hin, dass eine Zelle in Excel ohne aktiviertes Caching etwa 1 KB Speicher belegt und eine Tabelle mit 8.000 Zeilen und 31 Spalten (248.000 Zellen) 242 MB Speicher benötigt. Wenn Caching aktiviert ist, sinkt die Größe auf 80 MB, und der Effekt ist immer noch sehr deutlich.
Bitte beachten Sie bei der Verwendung, dass die Speicheroptimierungsparameter von PHPExcel nicht im PHPExcel-Objekt enthalten sind und vor der Instanziierung von PHPExcel festgelegt werden müssen.
$cacheMethod = PHPExcel_CachedObjectStorageFactory::cache_to_phpTemp; $cacheSettings = array( 'memoryCacheSize' => '512MB'); PHPExcel_Settings::setCacheStorageMethod($cacheMethod,$cacheSettings); $oExcel = new PHPExcel();
Serialisieren Sie die Zellendaten und speichern Sie sie im Speicher
PHPExcel_CachedObjectStorageFactory::cache_in_memory_serialized;
Serialisieren Sie die Zellen vor der Ausführung von Gzip. Komprimiert und dann im Speicher gespeichert
PHPExcel_CachedObjectStorageFactory::cache_in_memory_gzip;
Cache in temporärer Festplattendatei, kann langsamer sein
PHPExcel_CachedObjectStorageFactory::cache_to_discISAM;
Speichern in php://temp
PHPExcel_CachedObjectStorageFactory::cache_to_phpTemp;
Speichern in
$cacheMethod = PHPExcel_CachedObjectStorageFactory::cache_to_memcache; $cacheSettings = array( 'memcacheServer' => 'localhost', 'memcachePort' => 11211, 'cacheTime' => 600 ); PHPExcel_Settings::setCacheStorageMethod($cacheMethod, $cacheSettings);
Wenn Sie das Excel-Zellenformat nicht lesen müssen, können Sie es so einstellen, dass nur Daten gelesen werden.
$objReader = PHPExcel_IOFactory::createReader('Excel2007'); $objReader->setReadDataOnly(true); $objPHPExcel = $objReader->load("test.xlsx”);
Wenn es in Excel mehrere Tabellenblätter gibt, wir aber nur einige davon lesen müssen, können wir dies auch festlegen, um den Speicherverbrauch zu reduzieren.
$objReader = PHPExcel_IOFactory::createReader('Excel2007'); $objReader->setLoadSheetsOnly( array("Worksheet1", "Worksheet2") ); $objPHPExcel = $objReader->load("test.xlsx”);
Wenn Sie nur einen bestimmten Bereich im Blatt lesen müssen, können Sie auch einen Filter setzen.
class MyReadFilter implements PHPExcel_Reader_IReadFilter { public function readCell($column, $row, $worksheetName = '') { // Read title row and rows 20 - 30 if ($row == 1 || ($row >= 20 && $row <= 30)) { return true; } return false; } } $objReader = PHPExcel_IOFactory::createReader('Excel2007'); $objReader->setReadFilter( new MyReadFilter() ); $objPHPExcel = $objReader->load("test.xlsx”);
Am Ende habe ich die folgende Methode verwendet
// 如果是因为特殊字符引起的,可以在load方法之前加上setReadDataOnly(意思是忽略任何格式的信息)方法,就可以避免 $objReader->setReadDataOnly(true);//只需要添加这个方法 $objPHPExcel = $objReader->load($uploadFilePath);
Verwandte Empfehlungen:
Lösung für den Speicherüberlauffehler, wenn phpExcel große Datenmengen exportiert
Probleme beim Speichern und Herunterladen von Excel-Dateien, die von PHPExcel exportiert wurden
Das obige ist der detaillierte Inhalt vonLösung für den PHPExcel-Speicherüberlauf beim Exportieren von Dateien. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!